Ejabberd 2.1.0 Developers GuideAlexey Shchepin
+Ejabberd 3.0.0-alpha Developers Guide |
@@ -98,7 +98,7 @@ Comprehensive documentation.
Capability to send announce messages.
Internationalized: ejabberd leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
-
-Translated to 25 languages.
- Support for IDNA.
+Translated to 24 languages.
- Support for IDNA.
Open Standards: ejabberd is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
diff --git a/doc/features.html b/doc/features.html
index 36f8087d4..e751b7c7b 100644
--- a/doc/features.html
+++ b/doc/features.html
@@ -2,7 +2,7 @@
"http://www.w3.org/TR/REC-html40/loose.dtd">
- Ejabberd 2.1.0 Feature Sheet
+Ejabberd 3.0.0-alpha Feature Sheet
@@ -50,7 +50,7 @@ SPAN{width:20%; float:right; text-align:left; margin-left:auto;}
- Ejabberd 2.1.0 Feature SheetSander Devrieze
+Ejabberd 3.0.0-alpha Feature Sheet |
@@ -76,7 +76,7 @@ Comprehensive documentation.
Capability to send announce messages.
Internationalized: ejabberd leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
-
-Translated to 25 languages.
- Support for IDNA.
+Translated to 24 languages.
- Support for IDNA.
Open Standards: ejabberd is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
diff --git a/doc/guide.html b/doc/guide.html
index 08f8bb14a..9520f4b70 100644
--- a/doc/guide.html
+++ b/doc/guide.html
@@ -6,7 +6,7 @@
- ejabberd 2.1.0
+ ejabberd 3.0.0-alpha
Installation and Operation Guide
@@ -76,7 +76,7 @@ BLOCKQUOTE.figure DIV.center DIV.center HR{display:none;}
- ejabberd 2.1.0 |
+ ejabberd 3.0.0-alpha |
|
Installation and Operation Guide |
@@ -146,78 +146,77 @@ BLOCKQUOTE.figure DIV.center DIV.center HR{display:none;}
3.3.5 mod_echo
3.3.6 mod_http_bind
3.3.7 mod_http_fileserver
-3.3.8 mod_irc
-3.3.9 mod_last
-3.3.10 mod_muc
-3.3.11 mod_muc_log
-3.3.12 mod_offline
-3.3.13 mod_ping
-3.3.14 mod_privacy
-3.3.15 mod_private
-3.3.16 mod_proxy65
-3.3.17 mod_pubsub
-3.3.18 mod_register
-3.3.19 mod_roster
-3.3.20 mod_service_log
-3.3.21 mod_shared_roster
-3.3.22 mod_stats
-3.3.23 mod_time
-3.3.24 mod_vcard
-3.3.25 mod_vcard_ldap
-3.3.26 mod_version
+3.3.8 mod_last
+3.3.9 mod_muc
+3.3.10 mod_muc_log
+3.3.11 mod_offline
+3.3.12 mod_ping
+3.3.13 mod_privacy
+3.3.14 mod_private
+3.3.15 mod_proxy65
+3.3.16 mod_pubsub
+3.3.17 mod_register
+3.3.18 mod_roster
+3.3.19 mod_service_log
+3.3.20 mod_shared_roster
+3.3.21 mod_stats
+3.3.22 mod_time
+3.3.23 mod_vcard
+3.3.24 mod_vcard_ldap
+3.3.25 mod_version
-Chapter 4 Managing an ejabberd Server
+Chapter 4 Managing an ejabberd Server
-Chapter 5 Securing ejabberd
+Chapter 5 Securing ejabberd
-Chapter 6 Clustering
+Chapter 6 Clustering
-Chapter 7 Debugging
+Chapter 7 Debugging
-Appendix A Internationalization and Localization
-Appendix B Release Notes
-Appendix C Acknowledgements
-Appendix D Copyright Information
+Appendix A Internationalization and Localization
+Appendix B Release Notes
+Appendix C Acknowledgements
+Appendix D Copyright Information
ejabberd is a free and open source instant messaging server written in Erlang/OTP. ejabberd is cross-platform, distributed, fault-tolerant, and based on open standards to achieve real-time communication. ejabberd is designed to be a rock-solid and feature rich XMPP server. ejabberd is suitable for small deployments, whether they need to be scalable or not, as well as extremely big deployments.
@@ -234,7 +233,7 @@ Comprehensive documentation.
Capability to send announce messages.
Internationalized: ejabberd leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
-
-Translated to 25 languages.
- Support for IDNA.
+Translated to 24 languages.
- Support for IDNA.
Open Standards: ejabberd is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
@@ -343,16 +341,14 @@ as long as your system have all the dependencies.
-
GNU Make
- GCC
-
- Libexpat 1.95 or higher
-
- Erlang/OTP R10B-9 or higher. The recommended version is R12B-5. Support for R13 is experimental.
+
- Erlang/OTP R12B-4 or higher, R13B or higher.
+
- exmpp 0.9.1 or higher
- OpenSSL 0.9.6 or higher, for STARTTLS, SASL and SSL encryption. Optional, highly recommended.
- Zlib 1.2.3 or higher, for Stream Compression support (XEP-0138). Optional.
- Erlang mysql library. Optional. For MySQL authentication or storage. See section 3.2.1.
- Erlang pgsql library. Optional. For PostgreSQL authentication or storage. See section 3.2.3.
- PAM library. Optional. For Pluggable Authentication Modules (PAM). See section 3.1.4.
-
- GNU Iconv 1.8 or higher, for the IRC Transport (mod_irc). Optional. Not needed on systems with GNU Libc. See section 3.3.8.
- ImageMagick’s Convert program. Optional. For CAPTCHA challenges. See section 3.1.8.
-
- exmpp 0.9.1 or higher. Optional. For import/export user data with XEP-0227 XML files.
Released versions of ejabberd are available in the ProcessOne ejabberd downloads page:
@@ -479,31 +475,25 @@ for example:
To compile ejabberd on a Microsoft Windows system, you need:
We assume that we will try to put as much library as possible into C:\sdk\ to make it easier to track what is install for ejabberd. -
-Install Erlang emulator (for example, into
C:\sdk\erl5.5.5 ).
+Install Erlang emulator (for example, into C:\sdk\erl5.6.5 ).
- Install Expat library into
C:\sdk\Expat-2.0.0
directory.Copy file C:\sdk\Expat-2.0.0\Libs\libexpat.dll
to your Windows system directory (for example, C:\WINNT or
C:\WINNT\System32 )
- - Build and install the Iconv library into the directory
-
C:\sdk\GnuWin32 .Copy file C:\sdk\GnuWin32\bin\lib*.dll to your
-Windows system directory (more installation instructions can be found in the
-file README.woe32 in the iconv distribution). Note: instead of copying libexpat.dll and iconv.dll to the Windows
-directory, you can add the directories
-C:\sdk\Expat-2.0.0\Libs and
-C:\sdk\GnuWin32\bin to the PATH environment
-variable.
+Note: instead of copying libexpat.dll to the Windows
+directory, you can add the directory C:\sdk\Expat-2.0.0\Libs
+to the PATH environment variable.
- Install OpenSSL in
C:\sdk\OpenSSL and add C:\sdk\OpenSSL\lib\VC to your path or copy the binaries to your system directory.
- Install ZLib in
C:\sdk\gnuWin32 . Copy
-C:\sdk\GnuWin32\bin\zlib1.dll to your system directory. If you change your path it should already be set after libiconv install.
+C:\sdk\GnuWin32\bin\zlib1.dll to your system directory.
- Make sure the you can access Erlang binaries from your path. For example:
set PATH=%PATH%;"C:\sdk\erl5.6.5\bin"
- Depending on how you end up actually installing the library you might need to check and tweak the paths in the file configure.erl.
- While in the directory
ejabberd\src run:
@@ -520,7 +510,7 @@ There are two ways to register a XMPP account:
-
Using ejabberdctl (see section 4.1):
ejabberdctl register admin1 example.org FgT5bk3
- - Using a XMPP client and In-Band Registration (see section 3.3.18).
+
- Using a XMPP client and In-Band Registration (see section 3.3.17).
- Edit the ejabberd configuration file to give administration rights to the XMPP account you created:
{acl, admins, {user, "admin1", "example.org"}}.
@@ -1825,8 +1815,7 @@ all entries end with a comma:
mod_caps | Entity Capabilities (XEP-0115) | |
mod_configure | Server configuration using Ad-Hoc | mod_adhoc |
mod_disco | Service Discovery (XEP-0030) | |
-mod_echo | Echoes XMPP stanzas | |
-mod_irc | IRC transport | |
+mod_echo | Echoes Jabber packets | |
mod_last | Last Activity (XEP-0012) | |
mod_last_odbc | Last Activity (XEP-0012) | supported DB (*) |
mod_muc | Multi-User Chat (XEP-0045) | |
@@ -1840,7 +1829,6 @@ all entries end with a comma:
mod_private_odbc | Private XML Storage (XEP-0049) | supported DB (*) |
mod_proxy65 | SOCKS5 Bytestreams (XEP-0065) | |
mod_pubsub | Pub-Sub (XEP-0060), PEP (XEP-0163) | mod_caps |
-mod_pubsub_odbc | Pub-Sub (XEP-0060), PEP (XEP-0163) | supported DB (*) and mod_caps |
mod_register | In-Band Registration (XEP-0077) | |
mod_roster | Roster management (XMPP IM) | |
mod_roster_odbc | Roster management (XMPP IM) | supported DB (*) |
@@ -1951,7 +1939,7 @@ message is sent to all registered users. If the user is online and connected
to several resources, only the resource with the highest priority will receive
the message. If the registered user is not connected, the message will be
stored offline in assumption that offline storage
-(see section 3.3.12) is enabled.
+(see section 3.3.11) is enabled.
- example.org/announce/online (example.org/announce/all-hosts/online)
- The
message is sent to all connected users. If the user is online and connected
to several resources, all resources will receive the message.
@@ -2205,69 +2193,8 @@ To use this module you must enable it:
},
...
]}.
-
-
- This module is an IRC transport that can be used to join channels on IRC
-servers. End user information:
-
- -
-A XMPP client with ‘groupchat 1.0’ support or Multi-User
-Chat support (XEP-0045) is necessary to join IRC channels.
-
- An IRC channel can be joined in nearly the same way as joining a
-XMPP Multi-User Chat room. The difference is that the room name will
-be ‘channel%irc.example.org’ in case irc.example.org is
-the IRC server hosting ‘channel’. And of course the host should point
-to the IRC transport instead of the Multi-User Chat service.
-
- You can register your nickame by sending ‘IDENTIFY password’ to
- nickserver!irc.example.org@irc.jabberserver.org.
- - Entering your password is possible by sending ‘LOGIN nick password’
- to nickserver!irc.example.org@irc.jabberserver.org.
- - The IRC transport provides Ad-Hoc Commands (XEP-0050)
-to join a channel, and to set custom IRC username and encoding.
-
- When using a popular XMPP server, it can occur that no
-connection can be achieved with some IRC servers because they limit the
-number of conections from one IP.
-
Options:
- -
-
-{host, HostName}
- This option defines the Jabber ID of the
-service. If the host option is not specified, the Jabber ID will be the
-hostname of the virtual host with the prefix ‘irc.’. The keyword "@HOST@"
-is replaced at start time with the real virtual host name.
-
-
- {access, AccessName}
- This option can be used to specify who
-may use the IRC transport (default value: all).
-
- {default_encoding, Encoding}
- Set the default IRC encoding.
-Default value: "koi8-r"
-
Examples:
- -
-In the first example, the IRC transport is available on (all) your
-virtual host(s) with the prefix ‘irc.’. Furthermore, anyone is
-able to use the transport. The default encoding is set to "iso8859-15".
-
{modules,
- [
- ...
- {mod_irc, [{access, all}, {default_encoding, "iso8859-15"}]},
- ...
- ]}.
- - In next example the IRC transport is available with JIDs with prefix irc-t.net.
-Moreover, the transport is only accessible to two users
-of example.org, and any user of example.com:
-
{acl, paying_customers, {user, "customer1", "example.org"}}.
-{acl, paying_customers, {user, "customer2", "example.org"}}.
-{acl, paying_customers, {server, "example.com"}}.
-
-{access, irc_users, [{allow, paying_customers}, {deny, all}]}.
-
-{modules,
- [
- ...
- {mod_irc, [{access, irc_users},
- {host, "irc.example.net"}]},
- ...
- ]}.
-
-
+
+
This module adds support for Last Activity (XEP-0012). It can be used to
discover when a disconnected user last accessed the server, to know when a
connected user was last active on the server, or to query the uptime of the
@@ -2276,7 +2203,7 @@ connected user was last active on the server, or to query the uptime of the
{iqdisc, Discipline} - This specifies
the processing discipline for Last activity (jabber:iq:last) IQ queries (see section 3.3.2).
-
+
This module provides a Multi-User Chat (XEP-0045) service.
Users can discover existing rooms, join or create them.
Occupants of a room can chat in public or have private chats. Some of the features of Multi-User Chat:
@@ -2499,7 +2426,7 @@ the newly created rooms have by default those options.
...
]}.
-
+
This module enables optional logging of Multi-User Chat (MUC) public conversations to
HTML. Once you enable this module, users can join a room using a MUC capable
XMPP client, and if they have enough privileges, they can request the
@@ -2618,7 +2545,7 @@ top link will be the default <a href="/">Home</a> .
...
]}.
-
+
This module implements offline message storage (XEP-0160).
This means that all messages
sent to an offline user will be stored on the server until that user comes
@@ -2650,7 +2577,7 @@ and all the other users up to 100.
...
]}.
-
+
This module implements support for XMPP Ping (XEP-0199) and periodic keepalives.
When this module is enabled ejabberd responds correctly to
ping requests, as defined in the protocol. Configuration options:
@@ -2678,7 +2605,7 @@ and if a client does not answer to the ping in less than 32 seconds, its connect
...
]}.
-
+
This module implements Blocking Communication (also known as Privacy Rules)
as defined in section 10 from XMPP IM. If end users have support for it in
their XMPP client, they will be able to:
@@ -2706,7 +2633,7 @@ subscription type (or globally).
{iqdisc, Discipline} - This specifies
the processing discipline for Blocking Communication (jabber:iq:privacy) IQ queries (see section 3.3.2).
-
+
This module adds support for Private XML Storage (XEP-0049):
Using this method, XMPP entities can store private data on the server and
@@ -2718,7 +2645,7 @@ of client-specific preferences; another is Bookmark Storage ( This specifies
the processing discipline for Private XML Storage (jabber:iq:private) IQ queries (see section 3.3.2).
-
+
This module implements SOCKS5 Bytestreams (XEP-0065).
It allows ejabberd to act as a file transfer proxy between two
XMPP clients. Options:
@@ -2776,7 +2703,7 @@ The simpliest configuration of the module:
...
]}.
-
+
This module offers a Publish-Subscribe Service (XEP-0060).
The functionality in mod_pubsub can be extended using plugins.
The plugin that implements PEP (Personal Eventing via Pubsub) (XEP-0163)
@@ -2797,27 +2724,13 @@ By default any account in the local ejabberd server is allowed to create pubsub
Define the maximum number of items that can be stored in a node.
Default value is 10.
- {plugins, [ Plugin, ...]}
-
-To specify which pubsub node plugins to use.
-The first one in the list is used by default.
-If this option is not defined, the default plugins list is: ["flat"].
-PubSub clients can define which plugin to use when creating a node:
-add type=’plugin-name’ attribute to the create stanza element.
-
- {nodetree, Nodetree}
-
-To specify which nodetree to use.
-If not defined, the default pubsub nodetree is used: "tree".
-Only one nodetree can be used per host, and is shared by all node plugins.
The "virtual" nodetree does not store nodes on database.
-This saves resources on systems with tons of nodes.
-If using the "virtual" nodetree,
-you can only enable those node plugins:
-["flat","pep"] or ["flat"];
-any other plugins configuration will not work.
-Also, all nodes will have the defaut configuration,
-and this can not be changed.
-Using "virtual" nodetree requires to start from a clean database,
-it will not work if you used the default "tree" nodetree before. The "dag" nodetree provides experimental support for PubSub Collection Nodes (XEP-0248).
-In that case you should also add "dag" node plugin as default, for example:
-{plugins, ["dag","flat","hometree","pep"]}
- - {ignore_pep_from_offline, false|true}
-
+To specify which pubsub node plugins to use. If not defined, the default
+pubsub plugin is always used.
+
- {nodetree, Name}
-
+To specify which nodetree to use. If not defined, the default pubsub
+nodetree is used. Only one nodetree can be used per host,
+and is shared by all node plugins.
+
- {ignore_pep_from_offline, false|true}
-
To specify whether or not we should get last published PEP items
from users in our roster which are offline when we connect. Value is true or false.
If not defined, pubsub assumes true so we only get last items of online contacts.
@@ -2830,29 +2743,18 @@ usage, as every item is stored in memory.
This allow to define a Key-Value list to choose defined node plugins on given PEP namespace.
The following example will use node_tune instead of node_pep for every PEP node with tune namespace:
{mod_pubsub, [{pep_mapping, [{"http://jabber.org/protocol/tune", "tune"}]}]}
- Example of configuration that uses flat nodes as default, and allows use of flat, nodetree and pep nodes:
+ Example:
{modules,
[
...
{mod_pubsub, [
{access_createnode, pubsub_createnode},
- {plugins, ["flat", "hometree", "pep"]}
- ]},
- ...
- ]}.
- Using ODBC database requires use of dedicated plugins. The following example shows previous configuration
-with ODBC usage:
- {modules,
- [
- ...
- {mod_pubsub_odbc, [
- {access_createnode, pubsub_createnode},
- {plugins, ["flat_odbc", "hometree_odbc", "pep_odbc"]}
- ]},
+ {plugins, ["default", "pep"]}
+ ]}
...
]}.
-
+
This module adds support for In-Band Registration (XEP-0077). This protocol
enables end users to use a XMPP client to:
-
@@ -2931,7 +2833,7 @@ Also define a registration timeout of one hour:
...
]}.
-
+
This module implements roster management as defined in
RFC 3921: XMPP IM.
It also supports Roster Versioning (XEP-0237). Options:
@@ -2957,7 +2859,7 @@ Important: if you use mod_shared_roster, you must disable this option.
...
]}.
-
+
This module adds support for logging end user packets via a XMPP message
auditing service such as
Bandersnatch. All user
@@ -2987,7 +2889,7 @@ To log all end user packets to the Bandersnatch service running on
...
]}.
-
+
This module enables you to create shared roster groups. This means that you can
create groups of people that can see members from (other) groups in their
rosters. The big advantages of this feature are that end users do not need to
@@ -3062,7 +2964,7 @@ roster groups as shown in the following table:
-
+
This module adds support for Statistics Gathering (XEP-0039). This protocol
allows you to retrieve next statistics from your ejabberd deployment:
-
@@ -3094,14 +2996,14 @@ by sending:
</query>
</iq>
-
+
This module features support for Entity Time (XEP-0202). By using this XEP,
you are able to discover the time at another entity’s location. Options:
-
{iqdisc, Discipline}
- This specifies
the processing discipline for Entity Time (jabber:iq:time) IQ queries (see section 3.3.2).
-
+
This module allows end users to store and retrieve their vCard, and to retrieve
other users vCards, as defined in vcard-temp (XEP-0054). The module also
implements an uncomplicated Jabber User Directory based on the vCards of
@@ -3156,7 +3058,7 @@ and that all virtual hosts will be searched instead of only the current one:
...
]}.
-
+
ejabberd can map LDAP attributes to vCard fields. This behaviour is
implemented in the mod_vcard_ldap module. This module does not depend on the
authentication method (see 3.2.5). Note that ejabberd treats LDAP as a read-only storage:
@@ -3335,7 +3237,7 @@ searching his info in LDAP. ldap_vcard_map
-
+
This module implements Software Version (XEP-0092). Consequently, it
answers ejabberd’s version when queried. Options:
-
@@ -3344,8 +3246,8 @@ The default value is true.
- {iqdisc, Discipline}
- This specifies
the processing discipline for Software Version (jabber:iq:version) IQ queries (see section 3.3.2).
-
- With the ejabberdctl command line administration script
+
+ With the ejabberdctl command line administration script
you can execute ejabberdctl commands (described in the next section, 4.1.1)
and also many general ejabberd commands (described in section 4.2).
This means you can start, stop and perform many other administrative tasks
@@ -3357,7 +3259,7 @@ and other codes may be used for specific results.
This can be used by other scripts to determine automatically
if a command succeeded or failed,
for example using: echo $?
- When ejabberdctl is executed without any parameter,
+ When ejabberdctl is executed without any parameter,
it displays the available options. If there isn’t an ejabberd server running,
the available parameters are:
-
@@ -3393,7 +3295,7 @@ robot1
testuser1
testuser2
- ejabberd is an Erlang/OTP application that runs inside an Erlang runtime system.
+ ejabberd is an Erlang/OTP application that runs inside an Erlang runtime system.
This system is configured using environment variables and command line parameters.
The ejabberdctl administration script uses many of those possibilities.
You can configure some of them with the file ejabberdctl.cfg,
@@ -3470,7 +3372,7 @@ not “Simple Authentication and Security Layer”.
Note that some characters need to be escaped when used in shell scripts, for instance " and {} .
You can find other options in the Erlang manual page (erl -man erl).
- An ejabberd command is an abstract function identified by a name,
+ An ejabberd command is an abstract function identified by a name,
with a defined number and type of calling arguments and type of result
that is registered in the ejabberd_commands service.
Those commands can be defined in any Erlang module and executed using any valid frontend. ejabberd includes a frontend to execute ejabberd commands: the script ejabberdctl.
@@ -3478,7 +3380,7 @@ Other known frontends that can be installed to execute ejabberd commands in diff
ejabberd_xmlrpc (XML-RPC service),
mod_rest (HTTP POST service),
mod_shcommands (ejabberd WebAdmin page).
- ejabberd includes a few ejabberd Commands by default.
+ ejabberd includes a few ejabberd Commands by default.
When more modules are installed, new commands may be available in the frontends. The easiest way to get a list of the available commands, and get help for them is to use
the ejabberdctl script:
$ ejabberdctl help
@@ -3529,7 +3431,7 @@ is very high.
register user host password Register an account in that domain with the given password.
unregister user host Unregister the given account.
- The frontends can be configured to restrict access to certain commands.
+ The frontends can be configured to restrict access to certain commands.
In that case, authentication information must be provided.
In each frontend the AccessCommands option is defined
in a different place. But in all cases the option syntax is the same:
@@ -3575,7 +3477,7 @@ and the provided arguments do not contradict Arguments. As an example to u
{_bot_reg_test, [register, unregister], [{host, "test.org"}]}
]
-
+
The ejabberd Web Admin allows to administer most of ejabberd using a web browser. This feature is enabled by default:
a ejabberd_http listener with the option web_admin (see
section 3.1.3) is included in the listening ports. Then you can open
@@ -3647,13 +3549,13 @@ The file is searched by default in
The directory of the documentation can be specified in
the environment variable EJABBERD_DOC_PATH.
See section 4.1.2.
- If you enable mod_configure and mod_adhoc,
+ If you enable mod_configure and mod_adhoc,
you can perform several administrative tasks in ejabberd
with a XMPP client.
The client must support Ad-Hoc Commands (XEP-0050),
and you must login in the XMPP server with
an account with proper privileges.
- ejabberd uses the distributed Mnesia database.
+ ejabberd uses the distributed Mnesia database.
Being distributed, Mnesia enforces consistency of its file,
so it stores the name of the Erlang node in it (see section 5.4).
The name of an Erlang node includes the hostname of the computer.
@@ -3690,8 +3592,8 @@ mv /var/lib/ejabberd/*.* /var/lib/ejabberd/oldfiles/
Check that the information of the old database is available: accounts, rosters...
After you finish, remember to delete the temporary backup files from public directories.
-
-
+
+
You need to take the following TCP ports in mind when configuring your firewall:
Port | Description |
@@ -3702,7 +3604,7 @@ After you finish, remember to delete the temporary backup files from public dire
port range | Used for connections between Erlang nodes. This range is configurable (see section 5.2). |
- epmd (Erlang Port Mapper Daemon)
+ epmd (Erlang Port Mapper Daemon)
is a small name server included in Erlang/OTP
and used by Erlang programs when establishing distributed Erlang communications.
ejabberd needs epmd to use ejabberdctl and also when clustering ejabberd nodes.
@@ -3727,7 +3629,7 @@ but can be configured in the file ejabberdctl.cfg.
The Erlang command-line parameter used internally is, for example:
erl ... -kernel inet_dist_listen_min 4370 inet_dist_listen_max 4375
- The Erlang cookie is a string with numbers and letters.
+ The Erlang cookie is a string with numbers and letters.
An Erlang node reads the cookie at startup from the command-line parameter -setcookie.
If not indicated, the cookie is read from the cookie file $HOME/.erlang.cookie.
If this file does not exist, it is created immediately with a random cookie.
@@ -3741,7 +3643,7 @@ to prevent unauthorized access or intrusion to an Erlang node.
The communication between Erlang nodes are not encrypted,
so the cookie could be read sniffing the traffic on the network.
The recommended way to secure the Erlang node is to block the port 4369.
- An Erlang node may have a node name.
+ An Erlang node may have a node name.
The name can be short (if indicated with the command-line parameter -sname)
or long (if indicated with the parameter -name).
Starting an Erlang node with -sname limits the communication between Erlang nodes to the LAN. Using the option -sname instead of -name is a simple method
@@ -3750,7 +3652,7 @@ However, it is not ultimately effective to prevent access to the Erlang node,
because it may be possible to fake the fact that you are on another network
using a modified version of Erlang epmd.
The recommended way to secure the Erlang node is to block the port 4369.
- ejabberd stores sensitive data in the file system either in plain text or binary files.
+ ejabberd stores sensitive data in the file system either in plain text or binary files.
The file system permissions should be set to only allow the proper user to read,
write and execute those files and directories. -
ejabberd configuration file: /etc/ejabberd/ejabberd.cfg
-
@@ -3770,9 +3672,9 @@ so it is preferable to secure the whole /var/lib/ejabberd/ directory.
- Erlang cookie file: /var/lib/ejabberd/.erlang.cookie
-
See section 5.3.
-
+
-
+
A XMPP domain is served by one or more ejabberd nodes. These nodes can
be run on different machines that are connected via a network. They all
must have the ability to connect to port 4369 of all another nodes, and must
@@ -3786,29 +3688,29 @@ router,
session manager,
s2s manager.
-
+
This module is the main router of XMPP packets on each node. It
routes them based on their destination’s domains. It uses a global
routing table. The domain of the packet’s destination is searched in the
routing table, and if it is found, the packet is routed to the
appropriate process. If not, it is sent to the s2s manager.
-
+
This module routes packets which have a destination domain equal to
one of this server’s host names. If the destination JID has a non-empty user
part, it is routed to the session manager, otherwise it is processed depending
on its content.
-
+
This module routes packets to local users. It looks up to which user
resource a packet must be sent via a presence table. Then the packet is
either routed to the appropriate c2s process, or stored in offline
storage, or bounced back.
-
+
This module routes packets to other XMPP servers. First, it
checks if an opened s2s connection from the domain of the packet’s
source to the domain of the packet’s destination exists. If that is the case,
the s2s manager routes the packet to the process
serving this connection, otherwise a new connection is opened.
-
+
Suppose you already configured ejabberd on one machine named (first),
and you need to setup another one to make an ejabberd cluster. Then do
following steps: -
@@ -3842,14 +3744,14 @@ the Erlang shell. This probably can take some time if Mnesia has not yet
transfered and processed all data it needed from first.
- Now run ejabberd on second with a configuration similar as
on first: you probably do not need to duplicate ‘
acl ’
and ‘access ’ options because they will be taken from
-first; and mod_irc should be
+first. If you installed mod_irc , notice that it should be
enabled only on one machine in the cluster.
You can repeat these steps for other machines supposed to serve this
domain.
-
+
-
-
+
+
ejabberd includes an algorithm to load balance the components that are plugged on an ejabberd cluster. It means that you can plug one or several instances of the same component on each ejabberd cluster and that the traffic will be automatically distributed. The default distribution algorithm try to deliver to a local instance of a component. If several local instances are available, one instance is chosen randomly. If no instance is available locally, one instance is chosen randomly among the remote component instances. If you need a different behaviour, you can change the load balancing behaviour with the option domain_balancing. The syntax of the option is the following:
- {domain_balancing, "component.example.com", BalancingCriteria}.
Several balancing criteria are available:
-
@@ -3858,12 +3760,12 @@ domain.
-
+
When there is a risk of failure for a given component, domain balancing can cause service trouble. If one component is failing the service will not work correctly unless the sessions are rebalanced. In this case, it is best to limit the problem to the sessions handled by the failing component. This is what the domain_balancing_component_number option does, making the load balancing algorithm not dynamic, but sticky on a fix number of component instances. The syntax is:
- {domain_balancing_component_number, "component.example.com", Number}.
-
+
- An ejabberd node writes two log files:
+ An ejabberd node writes two log files:
-
ejabberd.log
- is the ejabberd service log, with the messages reported by ejabberd code
- erlang.log
- is the Erlang/OTP system log, with the messages reported by Erlang/OTP using SASL (System Architecture Support Libraries)
@@ -3885,12 +3787,12 @@ The ejabberdctl command reopen-log
(please refer to section 4.1.1)
reopens the log files,
and also renames the old ones if you didn’t rename them.
- The Debug Console is an Erlang shell attached to an already running ejabberd server.
+ The Debug Console is an Erlang shell attached to an already running ejabberd server.
With this Erlang shell, an experienced administrator can perform complex tasks. This shell gives complete control over the ejabberd server,
so it is important to use it with extremely care.
There are some simple and safe examples in the article
Interconnecting Erlang Nodes To exit the shell, close the window or press the keys: control+c control+c.
-
+
ejabberd includes a watchdog mechanism that may be useful to developers
when troubleshooting a problem related to memory usage.
If a process in the ejabberd server consumes more memory than the configured threshold,
@@ -3910,7 +3812,7 @@ or in a conversation with the watchdog alert bot. The syntax is:
To remove all watchdog admins, set the option with an empty list:
{watchdog_admins, []}.
-
+
The source code of ejabberd supports localization.
The translators can edit the
gettext .po files
@@ -3945,9 +3847,9 @@ HTTP header ‘Accept-Language: ru’
|
-
+
Release notes are available from ejabberd Home Page
- Thanks to all people who contributed to this guide:
+ Thanks to all people who contributed to this guide:
- Ejabberd Installation and Operation Guide.
+ Ejabberd Installation and Operation Guide.
Copyright © 2003 — 2009 ProcessOne This document 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
diff --git a/doc/guide.tex b/doc/guide.tex
index 57a754548..ca72e2982 100644
--- a/doc/guide.tex
+++ b/doc/guide.tex
@@ -72,7 +72,6 @@
\newcommand{\modecho}{\module{mod\_echo}}
\newcommand{\modhttpbind}{\module{mod\_http\_bind}}
\newcommand{\modhttpfileserver}{\module{mod\_http\_fileserver}}
-\newcommand{\modirc}{\module{mod\_irc}}
\newcommand{\modlast}{\module{mod\_last}}
\newcommand{\modlastodbc}{\module{mod\_last\_odbc}}
\newcommand{\modmuc}{\module{mod\_muc}}
@@ -86,7 +85,6 @@
\newcommand{\modprivateodbc}{\module{mod\_private\_odbc}}
\newcommand{\modproxy}{\module{mod\_proxy65}}
\newcommand{\modpubsub}{\module{mod\_pubsub}}
-\newcommand{\modpubsubodbc}{\module{mod\_pubsub\_odbc}}
\newcommand{\modregister}{\module{mod\_register}}
\newcommand{\modroster}{\module{mod\_roster}}
\newcommand{\modrosterodbc}{\module{mod\_roster\_odbc}}
@@ -307,16 +305,14 @@ To compile \ejabberd{} on a `Unix-like' operating system, you need:
\begin{itemize}
\item GNU Make
\item GCC
-\item Libexpat 1.95 or higher
-\item Erlang/OTP R10B-9 or higher. The recommended version is R12B-5. Support for R13 is experimental.
+\item Erlang/OTP R12B-4 or higher, R13B or higher.
+\item exmpp 0.9.1 or higher
\item OpenSSL 0.9.6 or higher, for STARTTLS, SASL and SSL encryption. Optional, highly recommended.
\item Zlib 1.2.3 or higher, for Stream Compression support (\xepref{0138}). Optional.
\item Erlang mysql library. Optional. For MySQL authentication or storage. See section \ref{compilemysql}.
\item Erlang pgsql library. Optional. For PostgreSQL authentication or storage. See section \ref{compilepgsql}.
\item PAM library. Optional. For Pluggable Authentication Modules (PAM). See section \ref{pam}.
-\item GNU Iconv 1.8 or higher, for the IRC Transport (mod\_irc). Optional. Not needed on systems with GNU Libc. See section \ref{modirc}.
\item ImageMagick's Convert program. Optional. For CAPTCHA challenges. See section \ref{captcha}.
-\item exmpp 0.9.1 or higher. Optional. For import/export user data with \xepref{0227} XML files.
\end{itemize}
\makesubsection{download}{Download Source Code}
@@ -516,11 +512,9 @@ gmake -f Makefile.gi ginstall
To compile \ejabberd{} on a Microsoft Windows system, you need:
\begin{itemize}
\item MS Visual C++ 6.0 Compiler
-\item \footahref{http://www.erlang.org/download.html}{Erlang/OTP R11B-5}
+\item \footahref{http://www.erlang.org/download.html}{Erlang/OTP R12B-5}. Support for R13 or higher is experimental.
+\item \footahref{http://support.process-one.net/doc/display/EXMPP}{exmpp 0.9.1 or higher}
\item \footahref{http://sourceforge.net/project/showfiles.php?group\_id=10127\&package\_id=11277}{Expat 2.0.0 or higher}
-\item
-\footahref{http://www.gnu.org/software/libiconv/}{GNU Iconv 1.9.2}
-(optional)
\item \footahref{http://www.slproweb.com/products/Win32OpenSSL.html}{Shining Light OpenSSL 0.9.8d or higher}
(to enable SSL connections)
\item \footahref{http://www.zlib.net/}{Zlib 1.2.3 or higher}
@@ -532,28 +526,19 @@ To compile \ejabberd{} on a Microsoft Windows system, you need:
We assume that we will try to put as much library as possible into \verb|C:\sdk\| to make it easier to track what is install for \ejabberd{}.
\begin{enumerate}
-\item Install Erlang emulator (for example, into \verb|C:\sdk\erl5.5.5|).
+\item Install Erlang emulator (for example, into \verb|C:\sdk\erl5.6.5|).
\item Install Expat library into \verb|C:\sdk\Expat-2.0.0|
directory.
Copy file \verb|C:\sdk\Expat-2.0.0\Libs\libexpat.dll|
to your Windows system directory (for example, \verb|C:\WINNT| or
\verb|C:\WINNT\System32|)
-\item Build and install the Iconv library into the directory
- \verb|C:\sdk\GnuWin32|.
-
- Copy file \verb|C:\sdk\GnuWin32\bin\lib*.dll| to your
- Windows system directory (more installation instructions can be found in the
- file README.woe32 in the iconv distribution).
-
- Note: instead of copying libexpat.dll and iconv.dll to the Windows
- directory, you can add the directories
- \verb|C:\sdk\Expat-2.0.0\Libs| and
- \verb|C:\sdk\GnuWin32\bin| to the \verb|PATH| environment
- variable.
+ Note: instead of copying libexpat.dll to the Windows
+ directory, you can add the directory \verb|C:\sdk\Expat-2.0.0\Libs|
+ to the \verb|PATH| environment variable.
\item Install OpenSSL in \verb|C:\sdk\OpenSSL| and add \verb|C:\sdk\OpenSSL\lib\VC| to your path or copy the binaries to your system directory.
\item Install ZLib in \verb|C:\sdk\gnuWin32|. Copy
- \verb|C:\sdk\GnuWin32\bin\zlib1.dll| to your system directory. If you change your path it should already be set after libiconv install.
+ \verb|C:\sdk\GnuWin32\bin\zlib1.dll| to your system directory.
\item Make sure the you can access Erlang binaries from your path. For example: \verb|set PATH=%PATH%;"C:\sdk\erl5.6.5\bin"|
\item Depending on how you end up actually installing the library you might need to check and tweak the paths in the file configure.erl.
\item While in the directory \verb|ejabberd\src| run:
@@ -2425,8 +2410,7 @@ The following table lists all modules included in \ejabberd{}.
\hline \modcaps{} & Entity Capabilities (\xepref{0115}) & \\
\hline \modconfigure{} & Server configuration using Ad-Hoc & \modadhoc{} \\
\hline \ahrefloc{moddisco}{\moddisco{}} & Service Discovery (\xepref{0030}) & \\
- \hline \ahrefloc{modecho}{\modecho{}} & Echoes XMPP stanzas & \\
- \hline \ahrefloc{modirc}{\modirc{}} & IRC transport & \\
+ \hline \ahrefloc{modecho}{\modecho{}} & Echoes Jabber packets & \\
\hline \ahrefloc{modlast}{\modlast{}} & Last Activity (\xepref{0012}) & \\
\hline \ahrefloc{modlast}{\modlastodbc{}} & Last Activity (\xepref{0012}) & supported DB (*) \\
\hline \ahrefloc{modmuc}{\modmuc{}} & Multi-User Chat (\xepref{0045}) & \\
@@ -2440,7 +2424,6 @@ The following table lists all modules included in \ejabberd{}.
\hline \ahrefloc{modprivate}{\modprivateodbc{}} & Private XML Storage (\xepref{0049}) & supported DB (*) \\
\hline \ahrefloc{modproxy}{\modproxy{}} & SOCKS5 Bytestreams (\xepref{0065}) & \\
\hline \ahrefloc{modpubsub}{\modpubsub{}} & Pub-Sub (\xepref{0060}), PEP (\xepref{0163}) & \modcaps{} \\
- \hline \ahrefloc{modpubsub}{\modpubsubodbc{}} & Pub-Sub (\xepref{0060}), PEP (\xepref{0163}) & supported DB (*) and \modcaps{} \\
\hline \ahrefloc{modregister}{\modregister{}} & In-Band Registration (\xepref{0077}) & \\
\hline \ahrefloc{modroster}{\modroster{}} & Roster management (XMPP IM) & \\
\hline \ahrefloc{modroster}{\modrosterodbc{}} & Roster management (XMPP IM) & supported DB (*) \\
@@ -2911,75 +2894,6 @@ And define it as a handler in the HTTP service:
]}.
\end{verbatim}
-\makesubsection{modirc}{\modirc{}}
-\ind{modules!\modirc{}}\ind{IRC}
-
-This module is an IRC transport that can be used to join channels on IRC
-servers.
-
-End user information:
-\ind{protocols!groupchat 1.0}\ind{protocols!XEP-0045: Multi-User Chat}
-\begin{itemize}
-\item A \XMPP{} client with `groupchat 1.0' support or Multi-User
- Chat support (\xepref{0045}) is necessary to join IRC channels.
-\item An IRC channel can be joined in nearly the same way as joining a
- \XMPP{} Multi-User Chat room. The difference is that the room name will
- be `channel\%\jid{irc.example.org}' in case \jid{irc.example.org} is
- the IRC server hosting `channel'. And of course the host should point
- to the IRC transport instead of the Multi-User Chat service.
-\item You can register your nickame by sending `IDENTIFY password' to \\
- \jid{nickserver!irc.example.org@irc.jabberserver.org}.
-\item Entering your password is possible by sending `LOGIN nick password' \\
- to \jid{nickserver!irc.example.org@irc.jabberserver.org}.
-\item The IRC transport provides Ad-Hoc Commands (\xepref{0050})
- to join a channel, and to set custom IRC username and encoding.
-\item When using a popular \XMPP{} server, it can occur that no
- connection can be achieved with some IRC servers because they limit the
- number of conections from one IP.
-\end{itemize}
-
-Options:
-\begin{description}
-\hostitem{irc}
-\titem{\{access, AccessName\}} \ind{options!access}This option can be used to specify who
- may use the IRC transport (default value: \term{all}).
-\titem{\{default\_encoding, Encoding\}} \ind{options!defaultencoding}Set the default IRC encoding.
- Default value: \term{"koi8-r"}
-\end{description}
-
-Examples:
-\begin{itemize}
-\item In the first example, the IRC transport is available on (all) your
- virtual host(s) with the prefix `\jid{irc.}'. Furthermore, anyone is
- able to use the transport. The default encoding is set to "iso8859-15".
-\begin{verbatim}
-{modules,
- [
- ...
- {mod_irc, [{access, all}, {default_encoding, "iso8859-15"}]},
- ...
- ]}.
-\end{verbatim}
-\item In next example the IRC transport is available with JIDs with prefix \jid{irc-t.net}.
- Moreover, the transport is only accessible to two users
- of \term{example.org}, and any user of \term{example.com}:
-\begin{verbatim}
-{acl, paying_customers, {user, "customer1", "example.org"}}.
-{acl, paying_customers, {user, "customer2", "example.org"}}.
-{acl, paying_customers, {server, "example.com"}}.
-
-{access, irc_users, [{allow, paying_customers}, {deny, all}]}.
-
-{modules,
- [
- ...
- {mod_irc, [{access, irc_users},
- {host, "irc.example.net"}]},
- ...
- ]}.
-\end{verbatim}
-\end{itemize}
-
\makesubsection{modlast}{\modlast{}}
\ind{modules!\modlast{}}\ind{protocols!XEP-0012: Last Activity}
@@ -3578,30 +3492,12 @@ Options:
Define the maximum number of items that can be stored in a node.
Default value is 10.
\titem{\{plugins, [ Plugin, ...]\}} \ind{options!plugins}
- To specify which pubsub node plugins to use.
- The first one in the list is used by default.
- If this option is not defined, the default plugins list is: \term{["flat"]}.
- PubSub clients can define which plugin to use when creating a node:
- add \term{type='plugin-name'} attribute to the \term{create} stanza element.
-\titem{\{nodetree, Nodetree\}} \ind{options!nodetree}
- To specify which nodetree to use.
- If not defined, the default pubsub nodetree is used: "tree".
- Only one nodetree can be used per host, and is shared by all node plugins.
-
- The "virtual" nodetree does not store nodes on database.
- This saves resources on systems with tons of nodes.
- If using the "virtual" nodetree,
- you can only enable those node plugins:
- ["flat","pep"] or ["flat"];
- any other plugins configuration will not work.
- Also, all nodes will have the defaut configuration,
- and this can not be changed.
- Using "virtual" nodetree requires to start from a clean database,
- it will not work if you used the default "tree" nodetree before.
-
- The "dag" nodetree provides experimental support for PubSub Collection Nodes (\xepref{0248}).
- In that case you should also add "dag" node plugin as default, for example:
- \term{\{plugins, ["dag","flat","hometree","pep"]\}}
+ To specify which pubsub node plugins to use. If not defined, the default
+ pubsub plugin is always used.
+\titem{\{nodetree, Name\}} \ind{options!nodetree}
+ To specify which nodetree to use. If not defined, the default pubsub
+ nodetree is used. Only one nodetree can be used per host,
+ and is shared by all node plugins.
\titem{\{ignore\_pep\_from\_offline, false|true\}} \ind{options!ignore\_pep\_from\_offline}
To specify whether or not we should get last published PEP items
from users in our roster which are offline when we connect. Value is true or false.
@@ -3621,32 +3517,19 @@ Options:
% This option allows to create additional pubsub virtual hosts in a single module instance.
\end{description}
-Example of configuration that uses flat nodes as default, and allows use of flat, nodetree and pep nodes:
+Example:
\begin{verbatim}
{modules,
[
...
{mod_pubsub, [
{access_createnode, pubsub_createnode},
- {plugins, ["flat", "hometree", "pep"]}
- ]},
- ...
- ]}.
-\end{verbatim}
-
-Using ODBC database requires use of dedicated plugins. The following example shows previous configuration
-with ODBC usage:
-\begin{verbatim}
-{modules,
- [
- ...
- {mod_pubsub_odbc, [
- {access_createnode, pubsub_createnode},
- {plugins, ["flat_odbc", "hometree_odbc", "pep_odbc"]}
- ]},
+ {plugins, ["default", "pep"]}
+ ]}
...
]}.
\end{verbatim}
+% {served_hosts, ["example.com", "example.org"]}
\makesubsection{modregister}{\modregister{}}
\ind{modules!\modregister{}}\ind{protocols!XEP-0077: In-Band Registration}\ind{public registration}
@@ -4983,7 +4866,7 @@ mnesia:change_table_copy_type(schema, node(), disc_copies).
\item Now run \ejabberd{} on \term{second} with a configuration similar as
on \term{first}: you probably do not need to duplicate `\verb|acl|'
and `\verb|access|' options because they will be taken from
- \term{first}; and \verb|mod_irc| should be
+ \term{first}. If you installed \verb|mod_irc|, notice that it should be
enabled only on one machine in the cluster.
\end{enumerate}
diff --git a/doc/introduction.tex b/doc/introduction.tex
index 163312b38..e90130d49 100644
--- a/doc/introduction.tex
+++ b/doc/introduction.tex
@@ -68,7 +68,7 @@ Peter Saint-Andr\'e, Executive Director of the Jabber Software Foundation}
\item \marking{Internationalized:} \ejabberd{} leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
\begin{itemize}
-\item Translated to 25 languages. %%\improved{}
+\item Translated to 24 languages. %%\improved{}
\item Support for \footahref{http://www.ietf.org/rfc/rfc3490.txt}{IDNA}.
\end{itemize}
@@ -127,7 +127,6 @@ Moreover, \ejabberd{} comes with a wide range of other state-of-the-art features
\item Users Directory based on users vCards.
\item \txepref{0060}{Publish-Subscribe} component with support for \txepref{0163}{Personal Eventing via Pubsub}.
\item Support for web clients: \txepref{0025}{HTTP Polling} and \txepref{0206}{HTTP Binding (BOSH)} services.
-\item IRC transport.
\item Component support: interface with networks such as AIM, ICQ and MSN installing special tranports.
\end{itemize}
\end{itemize}
diff --git a/doc/release_notes_2.1.0.txt b/doc/release_notes_2.1.0.txt
deleted file mode 100644
index 2676f7b91..000000000
--- a/doc/release_notes_2.1.0.txt
+++ /dev/null
@@ -1,271 +0,0 @@
-
- Release Notes
- ejabberd 2.1.0
-
- ejabberd 2.1.0 is a major new version for ejabberd adding many
- new features, performance and scalability improvements.
-
- ejabberd 2.1.0 includes many new features, improvements and bug fixes.
- A complete list of changes can be retrieved from:
- http://redir.process-one.net/ejabberd-2.1.0
-
- The new code can be downloaded from ejabberd download page:
- http://www.process-one.net/en/ejabberd/
-
-
- New features and improvements:
-
-* Anti-abuse
-- Captcha support (XEP-0158). The example script uses ImageMagick.
-- New option: registration_timeout to limit registrations by time
-- Use send timeout to avoid locking on gen_tcp:send
-- mod_ip_blacklist: client blacklist support by IP
-
-* API
-- ejabberd_http provides Host, Port, Headers and Protocol in HTTP requests
-- Export function to create MUC room
-- New events: s2s_send_packet and s2s_receive_packet
-- New event: webadmin_user_parse_query when POST in web admin user page
-- Support distributed hooks over the cluster
-
-* Authentification
-- Extauth responses: log strange responses and add timeout
-
-* Binary Installer
-- Includes exmpp library to support import/export XML files
-
-* Caps
-- Remove useless caps tables entries
-- mod_caps must handle correctly external contacts with several resources
-- Complain if mod_caps disabled and mod_pubsub has PEP plugin enabled
-
-* Clustering and Architecture
-
-* Configuration
-- Added option access_max_user_messages for mod_offline
-- Added option backlog for ejabberd_listener to increase TCP backlog
-- Added option define_macro and use_macro
-- Added option include_config_file to include additional configuration files
-- Added option max_fsm_queue
-- Added option outgoing_s2s_options to define IP address families and timeout
-- Added option registration_timeout to ejabberd.cfg.example
-- Added option s2s_dns_options to define DNS timeout and retries
-- Added option ERL_OPTIONS to ejabberdctl.cfg
-- Added option FIREWALL_WINDOW to ejabberdctl.cfg
-- Added option EJABBERD_PID_PATH to ejabberdctl.cfg
-- Deleted option user_max_messages of mod_offline
-- Check certfiles are readable on server start and listener start
-- Config file management mix file reading and sanity check
-- Include example PAM configuration file: ejabberd.pam
-- New ejabberd listener: ejabberd_stun
-- Support to bind the same port to multiple interfaces
-- New syntax to specify the IP address and IPv6 in listeners
- configuration. The old options {ip,{1,2,3,4}} and inet6 are
- supported even if they aren't documented.
-- New syntax to specify the network protocol: tcp or udp
-- Report error at startup if a listener module isn't available
-- Only listen in a port when actually ready to serve requests
-- In default config, only local accounts can create rooms and PubSub nodes
-
-* Core architecture
-- More verbose error reporting for xml:element_to_string
-- Deliver messages when first presence is Invisible
-- Better log message when config file is not found
-- Include original timestamp on delayed presences
-
-* Crypto
-- Do not ask certificate for client (c2s)
-- SSL code remove from ejabberd in favor of TLS
-- Support Zlib compression after STARTTLS encryption
-- tls v1 client hello
-
-* Documentation
-- Document possible default MUC room options
-- Document service_check_from in the Guide
-- Document s2s_default_policy and s2s_host in the Guide
-- new command and guide instructions to change node name in a Mnesia database
-
-* ejabberd commands
-- ejabberd commands: separate command definition and calling interface
-- access_commands restricts who can execute what commands and arguments
-- ejabberdctl script now displays help and categorization of commands
-
-* HTTP Binding and HTTP Polling
-- HTTP-Bind: module optimization and clean-up
-- HTTP-Bind: allow configuration of max_inactivity timeout
-- HTTP-Poll: turn session timeout into a config file parameter
-
-* Jingle
-- STUN server that facilitates the client-to-client negotiation process
-
-* LDAP
-- Faster reconnection to LDAP servers
-- LDAP filter optimisation: Add ability to filter user in ejabberd and not LDAP
-- LDAP differentiates failed auth and unavailable auth service
-- Improve LDAP logging
-- LDAPS support using TLS.
-
-* Localization
-- Use Gettext PO for translators, export to ejabberd MSG
-- Support translation files for additional projects
-- Most translations are updated to latest code
-- New translation to Greek language
-
-* Multi-User Chat (MUC)
-- Allow admins to send messages to rooms
-- Allow to store room description
-- Captcha support in MUC: the admin of a room can configure it to
- require participants to fill a captcha to join the room.
-- Limit number of characters in Room ID, Name and Description
-- Prevent unvoiced occupants from changing nick
-- Support Result Set Management (XEP-0059) for listing rooms
-- Support for decline of invitation to MUC room
-- mod_muc_log options: plaintext format; filename with only room name
-
-* Performance
-- Run roster_get_jid_info only if privacy list has subscription or group item
-- Significant PubSub performance improvements
-
-* Publish-Subscribe
-- Add nodetree filtering/authorization
-- Add subscription option support for collection nodes
-- Allow Multiple Subscriptions
-- Check option of the nodetree instead of checking configuration
-- Implement whitelist authorize and roster access model
-- Implicit item deletion is not notified when deleting node
-- Make PubSub x-data configuration form handles list value
-- Make default node name convention XEP-compatible, document usage of hierarchy
-- Node names are used verbatim, without separating by slash, unless a
- node plugin uses its own separator
-- Send authorization update event (XEP-0060, 8.6)
-- Support of collection node subscription options
-- Support ODBC storage. Experimental, needs more testing.
-
-* Relational databases:
-- Added MSSQL 2000 and 2005
-- Privacy rules storage in MySQL
-- Implement reliable ODBC transaction nesting
-
-* Source Package
-- Default installation directories changed. Please see the upgrade notes below.
-- Allow more environment variable overrides in ejabberdctl
-- ChangeLog is not edited manually anymore; it's generated automatically.
-- Install the ejabberd Guide
-- Install the ejabberd include files
-- New option for the 'configure' script: --enable-user which installs
- ejabberd granting permission to manage it to a regular system user;
- no need to use root account to.
-- Only try to install epam if pam was enabled in configure script
-- Spool, config and log dirs: owner writes, group reads, others do nothing.
-- Provides an example ejabberd.init file
-
-* S2S
-- Option to define s2s outgoing behaviour: IPv4, IPv6 and timeout
-- DNS timeout and retries, configurable with s2s_dns_options.
-
-* Shared rosters
-- When a member is added/removed to group, send roster upgrade to group members
-
-* Users management
-- When account is deleted, cancel presence subscription for all roster items
-
-* XEP Support
-- Added XEP-0059 Result Set Management (for listing rooms)
-- Added XEP-0082 Date Time
-- Added XEP-0085 Chat State Notifications
-- Added XEP-0157 Contact Addresses for XMPP Services
-- Added XEP-0158 CAPTCHA Forms (in MUC rooms)
-- Added STUN server, for XEP-0176: Jingle ICE-UDP Transport Method
-- Added XEP-0199 XMPP Ping
-- Added XEP-0202 Entity Time
-- Added XEP-0203 Delayed Delivery
-- Added XEP-0227 Portable Import/Export Format for XMPP-IM Servers
-- Added XEP-0237 Roster Versioning
-
-* Web Admin
-- Display the connection method of user sessions
-- Cross link of ejabberd users in the list of users and rosters
-- Improved the browsing menu: don't disappear when browsing a host or node
-- Include Last-Modified HTTP header in responses to allow caching
-- Make some Input areas multiline: options of listening ports and modules
-- Support PUT and DELETE methods in ejabberd_http
-- WebAdmin serves Guide and links to related sections
-
-* Web plugins
-- mod_http_fileserver: new option directory_indices, and improve logging
-
-
- Important Notes:
-
-- ejabberd 2.1.0 requires Erlang R10B-9 or higher.
- R12B-5 is the recommended version. Support for R13B is experimental.
-
-
- Upgrading From ejabberd 1.x.x:
-
-- Check the Release Notes of the intermediate versions for additional
- information about database or configuration changes.
-
-
- Upgrading From ejabberd 2.0.x:
-
-- The database schemas didn't change since ejabberd 1.1.4.
- Anyway, it is recommended to backup the Mnesia spool directory and
- your SQL database (if used) before upgrading ejabberd.
-
-- The plugin of mod_pubsub "default" is renamed to "flat". You need
- to edit the ejabberd configuration file and replace those names.
-
-- The listener options 'ip' and inet6' are not documented anymore
- but they are supported and you can continue using them.
- There is a new syntax to define IP address and IP version.
- As usual, check the ejabberd Guide for more information.
-
-- The log file sasl.log is now called erlang.log
-
-- ejabberdctl commands now have _ characters instead of -.
- For backwards compatibility, it is still supported -.
-
-- mod_offline has a new option: access_max_user_messages.
- The old option user_max_messages is no longer supported.
-
-- If you upgrade from ejabberd trunk SVN, you must execute this:
- $ ejabberdctl rename_default_nodeplugin
-
-- Default installation directories changed a bit:
- * The Mnesia spool files that were previously stored in
- /var/lib/ejabberd/db/NODENAME/*
- are now stored in
- /var/lib/ejabberd/*
- * The directories
- /var/lib/ejabberd/ebin
- /var/lib/ejabberd/priv
- and their content is now installed as
- /lib/ejabberd/ebin
- /lib/ejabberd/priv
- * There is a new directory with Erlang header files:
- /lib/ejabberd/include
- * There is a new directory for ejabberd documentation,
- which includes the Admin Guide and the release notes::
- /share/doc/ejabberd
-
-- How to upgrade from previous version to ejabberd 2.1.0:
- 1. Stop the old instance of ejabberd.
- 2. Run 'make install' of new ejabberd 2.1.0 to create the new directories.
- 3. Copy the content of your old directory:
- /var/lib/ejabberd/db/NODENAME/
- to the new location:
- /var/lib/ejabberd/
- so you will have the files like this:
- /var/lib/ejabberd/acl.DCD ...
- 4. You can backup the content of those directories and delete them:
- /var/lib/ejabberd/ebin
- /var/lib/ejabberd/priv
- /var/lib/ejabberd/db
- 5. Now try to start your new ejabberd 2.1.0.
-
-
- Bug reports
-
- You can officially report bugs on ProcessOne support site:
- http://support.process-one.net/
diff --git a/doc/version.tex b/doc/version.tex
index 6ef8b9e67..ad915bf3d 100644
--- a/doc/version.tex
+++ b/doc/version.tex
@@ -1,2 +1,2 @@
% ejabberd version (automatically generated).
-\newcommand{\version}{2.1.0}
+\newcommand{\version}{3.0.0-alpha}
diff --git a/examples/mtr/ejabberd-netbsd.sh b/examples/mtr/ejabberd-netbsd.sh
index 9896c9bc4..31d01b6b8 100644
--- a/examples/mtr/ejabberd-netbsd.sh
+++ b/examples/mtr/ejabberd-netbsd.sh
@@ -70,7 +70,7 @@ done
echo '7. compile ejabberd'
gmake
-for A in mod_irc mod_muc mod_pubsub; do
+for A in mod_muc mod_pubsub; do
(cd $A; gmake)
done
diff --git a/src/Makefile.in b/src/Makefile.in
index ce580ab68..484b1a0d5 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -30,7 +30,7 @@ else
INIT_USER=$(INSTALLUSER)
endif
-EFLAGS += @ERLANG_SSL39@ -pa .
+EFLAGS += -pa .
# make debug=true to compile Erlang module with debug informations.
ifdef debug
@@ -65,8 +65,8 @@ endif
prefix = @prefix@
exec_prefix = @exec_prefix@
-SUBDIRS = @mod_irc@ @mod_pubsub@ @mod_muc@ @mod_proxy65@ @eldap@ @pam@ @web@ stringprep stun @tls@ @odbc@ @ejabberd_zlib@
-ERLSHLIBS = expat_erl.so
+SUBDIRS = stun @mod_pubsub@ @mod_muc@ @mod_proxy65@ @eldap@ @pam@ @web@ @tls@ @odbc@ @ejabberd_zlib@
+ERLSHLIBS =
ERLBEHAVS = cyrsasl.erl gen_mod.erl p1_fsm.erl
SOURCES_ALL = $(wildcard *.erl)
SOURCES = $(filter-out $(ERLBEHAVS),$(SOURCES_ALL))
@@ -277,7 +277,6 @@ distclean: distclean-recursive clean-local
rm -f config.status
rm -f config.log
rm -f Makefile
- [ ! -f ../ChangeLog ] || rm -f ../ChangeLog
TAGS:
etags *.erl
diff --git a/src/Makefile.win32 b/src/Makefile.win32
index 1fe4c6ecf..d10c45ca8 100644
--- a/src/Makefile.win32
+++ b/src/Makefile.win32
@@ -52,9 +52,6 @@ release : build release_clean
mkdir $(SRC_DIR)\eldap
copy eldap\eldap.* $(SRC_DIR)\eldap
copy eldap\ELDAPv3.asn $(SRC_DIR)\eldap
- mkdir $(SRC_DIR)\mod_irc
- copy mod_irc\*.erl $(SRC_DIR)\mod_irc
- copy mod_irc\*.c $(SRC_DIR)\mod_irc
mkdir $(SRC_DIR)\mod_muc
copy mod_muc\*.erl $(SRC_DIR)\mod_muc
mkdir $(SRC_DIR)\mod_pubsub
@@ -94,8 +91,6 @@ build : $(DLL) compile-beam all-recursive
all-recursive :
cd eldap
nmake -nologo -f Makefile.win32
- cd ..\mod_irc
- nmake -nologo -f Makefile.win32
cd ..\mod_muc
nmake -nologo -f Makefile.win32
cd ..\mod_pubsub
@@ -137,8 +132,6 @@ clean-local :
clean-recursive :
cd eldap
nmake -nologo -f Makefile.win32 clean
- cd ..\mod_irc
- nmake -nologo -f Makefile.win32 clean
cd ..\mod_muc
nmake -nologo -f Makefile.win32 clean
cd ..\mod_pubsub
diff --git a/src/acl.erl b/src/acl.erl
index 872b96a04..40231b010 100644
--- a/src/acl.erl
+++ b/src/acl.erl
@@ -37,8 +37,38 @@
-include("ejabberd.hrl").
+%% @type aclspec() = all | JID_Exact | JID_Regexp | JID_Glob | Shared_Group
+%% JID_Exact = {user, U} | {user, U, S} | {server, S} | {resource, R}
+%% U = string()
+%% S = string()
+%% R = string()
+%% JID_Regexp = {user_regexp, UR} | {user_regexp, UR, S} | {server_regexp, SR} | {resource_regexp, RR} | {node_regexp, UR, SR}
+%% UR = string()
+%% SR = string()
+%% RR = string()
+%% JID_Glob = {user_glob, UG} | {user_glob, UG, S} | {server_glob, SG} | {resource_glob, RG} | {node_glob, UG, SG}
+%% UG = string()
+%% SG = string()
+%% RG = string()
+%% Shared_Group = {shared_group, G} | {shared_group, G, H}
+%% G = string()
+%% H = string().
+
+%% @type acl() = {acl, ACLName, ACLSpec}
+%% ACLName = atom()
+%% ACLSpec = aclspec().
+%% Record in its Ejabberd-configuration-file variant.
+
+%% @type storedacl() = {acl, {ACLName, Host}, ACLSpec}
+%% ACLName = atom()
+%% Host = global | string()
+%% ACLSpec = aclspec().
+%% Record in its Mnesia-table-record variant.
+
-record(acl, {aclname, aclspec}).
+%% @spec () -> ok
+
start() ->
mnesia:create_table(acl,
[{disc_copies, [node()]},
@@ -47,9 +77,20 @@ start() ->
mnesia:add_table_copy(acl, node(), ram_copies),
ok.
+%% @spec (Host, ACLName, ACLSpec) -> storedacl()
+%% Host = global | string()
+%% ACLName = atom()
+%% ACLSpec = aclspec()
+
to_record(Host, ACLName, ACLSpec) ->
#acl{aclname = {ACLName, Host}, aclspec = normalize_spec(ACLSpec)}.
+%% @spec (Host, ACLName, ACLSpec) -> {atomic, ok} | {aborted, Reason}
+%% Host = global | string()
+%% ACLName = atom()
+%% ACLSpec = all | none | aclspec()
+%% Reason = term()
+
add(Host, ACLName, ACLSpec) ->
F = fun() ->
mnesia:write(#acl{aclname = {ACLName, Host},
@@ -57,6 +98,11 @@ add(Host, ACLName, ACLSpec) ->
end,
mnesia:transaction(F).
+%% @spec (Host, ACLs, Clear) -> ok | false
+%% Host = global | string()
+%% ACLs = [acl()]
+%% Clear = bool()
+
add_list(Host, ACLs, Clear) ->
F = fun() ->
if
@@ -86,8 +132,17 @@ add_list(Host, ACLs, Clear) ->
false
end.
-normalize(A) ->
- jlib:nodeprep(A).
+%% @spec (String) -> Prepd_String
+%% String = string()
+%% Prepd_String = string()
+
+normalize(String) ->
+ exmpp_stringprep:nodeprep(String).
+
+%% @spec (ACLSpec) -> Normalized_ACLSpec
+%% ACLSpec = all | none | aclspec()
+%% Normalized_ACLSpec = aclspec()
+
normalize_spec({A, B}) ->
{A, normalize(B)};
normalize_spec({A, B, C}) ->
@@ -99,6 +154,12 @@ normalize_spec(none) ->
+%% @spec (Host, Rule, JID) -> Access
+%% Host = global | string()
+%% Rule = all | none | atom()
+%% JID = exmpp_jid:jid()
+%% Access = allow | deny | atom()
+
match_rule(global, Rule, JID) ->
case Rule of
all -> allow;
@@ -143,22 +204,36 @@ match_rule(Host, Rule, JID) ->
end
end.
+%% @spec (ACLs, JID, Host) -> Access
+%% ACLs = [{Access, ACLName}]
+%% Access = deny | atom()
+%% ACLName = atom()
+%% JID = exmpp_jid:jid()
+%% Host = string()
+
match_acls([], _, _Host) ->
deny;
-match_acls([{Access, ACL} | ACLs], JID, Host) ->
- case match_acl(ACL, JID, Host) of
+match_acls([{Access, ACLName} | ACLs], JID, Host) ->
+ case match_acl(ACLName, JID, Host) of
true ->
Access;
_ ->
match_acls(ACLs, JID, Host)
end.
-match_acl(ACL, JID, Host) ->
- case ACL of
+%% @spec (ACLName, JID, Host) -> bool()
+%% ACLName = all | none | atom()
+%% JID = exmpp_jid:jid()
+%% Host = string()
+
+match_acl(ACLName, JID, Host) ->
+ case ACLName of
all -> true;
none -> false;
_ ->
- {User, Server, Resource} = jlib:jid_tolower(JID),
+ User = exmpp_jid:prep_node_as_list(JID),
+ Server = exmpp_jid:prep_domain_as_list(JID),
+ Resource = exmpp_jid:prep_resource_as_list(JID),
lists:any(fun(#acl{aclspec = Spec}) ->
case Spec of
all ->
@@ -218,24 +293,35 @@ match_acl(ACL, JID, Host) ->
false
end
end,
- ets:lookup(acl, {ACL, global}) ++
- ets:lookup(acl, {ACL, Host}))
+ ets:lookup(acl, {ACLName, global}) ++
+ ets:lookup(acl, {ACLName, Host}))
end.
+%% @spec (String, RegExp) -> bool()
+%% String = string() | undefined
+%% RegExp = string()
+
+is_regexp_match(undefined, _RegExp) ->
+ false;
is_regexp_match(String, RegExp) ->
- case regexp:first_match(String, RegExp) of
+ try re:run(String, RegExp, [{capture, none}]) of
nomatch ->
false;
- {match, _, _} ->
- true;
- {error, ErrDesc} ->
+ match ->
+ true
+ catch
+ _:ErrDesc ->
?ERROR_MSG(
- "Wrong regexp ~p in ACL: ~p",
- [RegExp, lists:flatten(regexp:format_error(ErrDesc))]),
+ "Wrong regexp ~p in ACL:~n~p",
+ [RegExp, ErrDesc]),
false
end.
+%% @spec (String, Glob) -> bool()
+%% String = string() | undefined
+%% Glob = string()
+
is_glob_match(String, Glob) ->
- is_regexp_match(String, regexp:sh_to_awk(Glob)).
+ is_regexp_match(String, xmerl_regexp:sh_to_awk(Glob)).
diff --git a/src/aclocal.m4 b/src/aclocal.m4
index 79b0e3ec7..f1fd1856a 100644
--- a/src/aclocal.m4
+++ b/src/aclocal.m4
@@ -121,21 +121,20 @@ AC_DEFUN(AM_WITH_ERLANG,
-author('alexey@sevcom.net').
-export([[start/0]]).
--include_lib("ssl/include/ssl_pkix.hrl").
start() ->
EIDirS = code:lib_dir("erl_interface") ++ "\n",
EILibS = libpath("erl_interface") ++ "\n",
+ EXMPPDir = code:lib_dir("exmpp"),
+ case EXMPPDir of
+ {error, bad_name} -> exit("exmpp not found");
+ _ -> ok
+ end,
+ EXMPPDirS = EXMPPDir ++ "\n",
RootDirS = code:root_dir() ++ "\n",
- file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ ssldef() ++ RootDirS)),
+ file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ EXMPPDirS ++ RootDirS)),
halt().
--[ifdef]('id-pkix').
-ssldef() -> "-DSSL39\n".
--else.
-ssldef() -> "\n".
--endif.
-
%% return physical architecture based on OS/Processor
archname() ->
ArchStr = erlang:system_info(system_architecture),
@@ -184,7 +183,7 @@ _EOF
# Second line
ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1`
# Third line
- ERLANG_SSL39=`cat conftest.out | head -n 3 | tail -n 1`
+ ERLANG_EXMPP=`cat conftest.out | head -n 3 | tail -n 1`
# End line
ERLANG_DIR=`cat conftest.out | tail -n 1`
@@ -193,7 +192,7 @@ _EOF
AC_SUBST(ERLANG_CFLAGS)
AC_SUBST(ERLANG_LIBS)
- AC_SUBST(ERLANG_SSL39)
+ AC_SUBST(ERLANG_EXMPP)
AC_SUBST(ERLC)
AC_SUBST(ERL)
])
@@ -217,96 +216,6 @@ AC_SUBST(make_$1)
])
-
-dnl From Bruno Haible.
-
-AC_DEFUN([AM_ICONV],
-[
- dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
- dnl those with the standalone portable GNU libiconv installed).
- AC_ARG_WITH([libiconv-prefix],
- [AC_HELP_STRING([--with-libiconv-prefix=PREFIX], [prefix where libiconv is installed])], [
- 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
- ])
-
- AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
- am_cv_func_iconv="no, consider installing GNU libiconv"
- am_cv_lib_iconv=no
- AC_TRY_LINK([#include
-#include ],
- [iconv_t cd = iconv_open("","");
- iconv(cd,NULL,NULL,NULL,NULL);
- iconv_close(cd);],
- am_cv_func_iconv=yes)
- if test "$am_cv_func_iconv" != yes; then
- am_save_LIBS="$LIBS"
- LIBS="$LIBS -liconv"
- AC_TRY_LINK([#include
-#include ],
- [iconv_t cd = iconv_open("","");
- iconv(cd,NULL,NULL,NULL,NULL);
- iconv_close(cd);],
- am_cv_lib_iconv=yes
- am_cv_func_iconv=yes)
- LIBS="$am_save_LIBS"
- fi
- dnl trying /usr/local
- 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"
- AC_TRY_LINK([#include
-#include ],
- [iconv_t cd = iconv_open("","");
- iconv(cd,NULL,NULL,NULL,NULL);
- iconv_close(cd);],
- am_cv_lib_iconv=yes
- am_cv_func_iconv=yes
- CPPFLAGS="$CPPFLAGS -I/usr/local/include",
- LDFLAGS="$am_save_LDFLAGS"
- CFLAGS="$am_save_CFLAGS")
- LIBS="$am_save_LIBS"
- fi
-
- ])
- if test "$am_cv_func_iconv" = yes; then
- AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
- AC_MSG_CHECKING([for iconv declaration])
- AC_CACHE_VAL(am_cv_proto_iconv, [
- AC_TRY_COMPILE([
-#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
-], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
- 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);"])
- am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
- AC_MSG_RESULT([$]{ac_t:-
- }[$]am_cv_proto_iconv)
- AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
- [Define as const if the declaration of iconv() needs const.])
- fi
- LIBICONV=
- if test "$am_cv_lib_iconv" = yes; then
- LIBICONV="-liconv"
- fi
- AC_SUBST(LIBICONV)
-])
-
dnl
AC_DEFUN(AM_WITH_OPENSSL,
[ AC_ARG_WITH(openssl,
diff --git a/src/adhoc.erl b/src/adhoc.erl
index 1a0476c2e..df2104980 100644
--- a/src/adhoc.erl
+++ b/src/adhoc.erl
@@ -31,47 +31,51 @@
produce_response/2,
produce_response/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("adhoc.hrl").
%% Parse an ad-hoc request. Return either an adhoc_request record or
%% an {error, ErrorType} tuple.
-parse_request(#iq{type = set, lang = Lang, sub_el = SubEl, xmlns = ?NS_COMMANDS}) ->
- ?DEBUG("entering parse_request...", []),
- Node = xml:get_tag_attr_s("node", SubEl),
- SessionID = xml:get_tag_attr_s("sessionid", SubEl),
- Action = xml:get_tag_attr_s("action", SubEl),
- XData = find_xdata_el(SubEl),
- {xmlelement, _, _, AllEls} = SubEl,
- if XData ->
- Others = lists:delete(XData, AllEls);
- true ->
- Others = AllEls
- end,
+parse_request(#iq{type = Type, ns = NS, payload = SubEl, lang = Lang}) ->
+ try
+ case {Type, NS} of
+ {set, ?NS_ADHOC} ->
+ ?DEBUG("entering parse_request...", []),
+ Node = exmpp_xml:get_attribute_as_list(SubEl, 'node', ""),
+ SessionID = exmpp_xml:get_attribute_as_list(SubEl, 'sessionid', ""),
+ Action = exmpp_xml:get_attribute_as_list(SubEl, 'action', ""),
+ XData = find_xdata_el(SubEl),
+ AllEls = exmpp_xml:get_child_elements(SubEl),
+ if XData ->
+ Others = lists:delete(XData, AllEls);
+ true ->
+ Others = AllEls
+ end,
- #adhoc_request{lang = Lang,
- node = Node,
- sessionid = SessionID,
- action = Action,
- xdata = XData,
- others = Others};
-parse_request(_) ->
- {error, ?ERR_BAD_REQUEST}.
+ #adhoc_request{lang = Lang,
+ node = Node,
+ sessionid = SessionID,
+ action = Action,
+ xdata = XData,
+ others = Others};
+ _ ->
+ {error, 'bad-request'}
+ end
+ catch
+ _ ->
+ {error, 'bad-request'}
+ end.
%% Borrowed from mod_vcard.erl
-find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) ->
+find_xdata_el(#xmlel{children = 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([#xmlel{ns = ?NS_DATA_FORMS} = El | _Els]) ->
+ El;
find_xdata_el1([_ | Els]) ->
find_xdata_el1(Els).
@@ -109,20 +113,19 @@ produce_response(#adhoc_response{lang = _Lang,
"" ->
ActionsElAttrs = [];
_ ->
- ActionsElAttrs = [{"execute", DefaultAction}]
+ ActionsElAttrs = [?XMLATTR('execute', DefaultAction)]
end,
- ActionsEls = [{xmlelement, "actions",
- ActionsElAttrs,
- [{xmlelement, Action, [], []} || Action <- Actions]}]
+ ActionsEls = [#xmlel{ns = ?NS_ADHOC, name = 'actions', attrs =
+ ActionsElAttrs, children =
+ [#xmlel{ns = ?NS_ADHOC, name = Action} || Action <- Actions]}]
end,
NotesEls = lists:map(fun({Type, Text}) ->
- {xmlelement, "note",
- [{"type", Type}],
- [{xmlcdata, Text}]}
+ #xmlel{ns = ?NS_ADHOC, name = 'note', attrs =
+ [?XMLATTR('type', Type)],
+ children = [#xmlcdata{cdata = list_to_binary(Text)}]}
end, Notes),
- {xmlelement, "command",
- [{"xmlns", ?NS_COMMANDS},
- {"sessionid", SessionID},
- {"node", Node},
- {"status", atom_to_list(Status)}],
+ #xmlel{ns = ?NS_ADHOC, name = 'command', attrs =
+ [?XMLATTR('sessionid', SessionID),
+ ?XMLATTR('node', Node),
+ ?XMLATTR('status', Status)], children =
ActionsEls ++ NotesEls ++ Elements}.
diff --git a/src/configure b/src/configure
index a1a7cba6a..02530cb4c 100755
--- a/src/configure
+++ b/src/configure
@@ -554,6 +554,7 @@ PACKAGE_STRING='ejabberd.erl version'
PACKAGE_BUGREPORT='ejabberd@process-one.net'
PACKAGE_URL=''
+ac_default_prefix=/
# Factoring default headers for most tests.
ac_includes_default="\
#include
@@ -590,7 +591,6 @@ ac_includes_default="\
# include
#endif"
-ac_default_prefix=/
ac_subst_vars='LTLIBOBJS
ERLCFLAGS
target_os
@@ -635,16 +635,11 @@ 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_SSL39
+ERLANG_EXMPP
ERLANG_LIBS
ERLANG_CFLAGS
ERL
@@ -699,9 +694,6 @@ 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
@@ -1347,7 +1339,6 @@ 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)
@@ -1377,9 +1368,6 @@ 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
@@ -1514,52 +1502,6 @@ fi
} # 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
- return $ac_retval
-
-} # ac_fn_c_try_link
-
# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
@@ -1597,6 +1539,48 @@ fi
} # ac_fn_c_try_cpp
+# 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ return $ac_retval
+
+} # ac_fn_c_try_run
+
# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
@@ -1690,48 +1674,6 @@ fi
} # 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
- return $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
@@ -1763,6 +1705,52 @@ $as_echo "$ac_res" >&6; }
} # ac_fn_c_check_header_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ return $ac_retval
+
+} # ac_fn_c_try_link
+
# ac_fn_erl_try_run LINENO
# ------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
@@ -3180,21 +3168,20 @@ fi
-author('alexey@sevcom.net').
-export([start/0]).
--include_lib("ssl/include/ssl_pkix.hrl").
start() ->
EIDirS = code:lib_dir("erl_interface") ++ "\n",
EILibS = libpath("erl_interface") ++ "\n",
+ EXMPPDir = code:lib_dir("exmpp"),
+ case EXMPPDir of
+ {error, bad_name} -> exit("exmpp not found");
+ _ -> ok
+ end,
+ EXMPPDirS = EXMPPDir ++ "\n",
RootDirS = code:root_dir() ++ "\n",
- file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ ssldef() ++ RootDirS)),
+ file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ EXMPPDirS ++ RootDirS)),
halt().
--ifdef('id-pkix').
-ssldef() -> "-DSSL39\n".
--else.
-ssldef() -> "\n".
--endif.
-
%% return physical architecture based on OS/Processor
archname() ->
ArchStr = erlang:system_info(system_architecture),
@@ -3243,7 +3230,7 @@ _EOF
# Second line
ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1`
# Third line
- ERLANG_SSL39=`cat conftest.out | head -n 3 | tail -n 1`
+ ERLANG_EXMPP=`cat conftest.out | head -n 3 | tail -n 1`
# End line
ERLANG_DIR=`cat conftest.out | tail -n 1`
@@ -3256,172 +3243,97 @@ _EOF
-#locating iconv
+# Checks for typedefs, structures, and compiler characteristics.
-
-# 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 test "${am_cv_func_iconv+set}" = set; then :
+{ $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 test "${ac_cv_c_const+set}" = set; 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
+ 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
+/* 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;
-
-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 test "${am_cv_proto_iconv+set}" = set; then :
- $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#include
-#include
-extern
-#ifdef __cplusplus
-"C"
+ *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
-#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=""
+ ac_cv_c_const=yes
else
- am_cv_proto_iconv_arg1="const"
+ ac_cv_c_const=no
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
+{ $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
- 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
+# Check Erlang headers are installed
+#AC_CHECK_HEADER(erl_driver.h,,[AC_MSG_ERROR([cannot find Erlang header files])])
- fi
- LIBICONV=
- if test "$am_cv_lib_iconv" = yes; then
- LIBICONV="-liconv"
- fi
+# Change default prefix
-#locating libexpat
+# Checks for library functions.
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3820,183 +3732,6 @@ 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 test "${ac_cv_lib_expat_XML_ParserCreate+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_c_const+set}" = set; 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"
@@ -4178,28 +3913,6 @@ 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
@@ -4644,7 +4357,7 @@ 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"
+ac_config_files="$ac_config_files Makefile $make_mod_muc $make_mod_pubsub $make_mod_proxy65 $make_eldap $make_pam $make_web stun/Makefile $make_tls $make_odbc $make_ejabberd_zlib"
#openssl
@@ -5763,14 +5476,12 @@ 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" ;;
diff --git a/src/configure.ac b/src/configure.ac
index 101baac2f..44cf75185 100644
--- a/src/configure.ac
+++ b/src/configure.ac
@@ -14,10 +14,6 @@ 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
@@ -32,7 +28,6 @@ AC_PREFIX_DEFAULT(/)
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)
@@ -95,14 +90,12 @@ esac],[full_xml=false])
AC_SUBST(full_xml)
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
diff --git a/src/configure.erl b/src/configure.erl
index cd7e48710..bd5e3e995 100644
--- a/src/configure.erl
+++ b/src/configure.erl
@@ -44,15 +44,11 @@ start() ->
true ->
ExpatLib = "EXPAT_LIB = $(EXPAT_DIR)\\StaticLibs\\libexpatMT.lib\n",
ExpatFlag = "EXPAT_FLAG = -DXML_STATIC\n",
- IconvDir = "ICONV_DIR = c:\\sdk\\GnuWin32\n",
- IconvLib = "ICONV_LIB = $(ICONV_DIR)\\lib\\libiconv.lib\n",
ZlibDir = "ZLIB_DIR = c:\\sdk\\GnuWin32\n",
ZlibLib = "ZLIB_LIB = $(ZLIB_DIR)\\lib\\zlib.lib\n";
false ->
ExpatLib = "EXPAT_LIB = $(EXPAT_DIR)\\Libs\\libexpat.lib\n",
ExpatFlag = "",
- IconvDir = "ICONV_DIR = c:\\sdk\\GnuWin32\n",
- IconvLib = "ICONV_LIB = $(ICONV_DIR)\\lib\\libiconv.lib\n",
ZlibDir = "ZLIB_DIR = c:\\sdk\\GnuWin32\n",
ZlibLib = "ZLIB_LIB = $(ZLIB_DIR)\\lib\\zlib.lib\n"
end,
@@ -82,8 +78,6 @@ start() ->
ExpatDir ++
ExpatLib ++
ExpatFlag ++
- IconvDir ++
- IconvLib ++
ZlibDir ++
ZlibLib)),
halt().
diff --git a/src/cyrsasl.erl b/src/cyrsasl.erl
index f993b992a..5a9dd2dee 100644
--- a/src/cyrsasl.erl
+++ b/src/cyrsasl.erl
@@ -34,18 +34,40 @@
server_start/3,
server_step/2]).
+%% @type saslmechanism() = {sasl_mechanism, Mechanism, Module, Require_Plain}
+%% Mechanism = string()
+%% Module = atom()
+%% Require_Plain = bool().
+%% Registry entry of a supported SASL mechanism.
+
-record(sasl_mechanism, {mechanism, module, require_plain_password}).
+
+%% @type saslstate() = {sasl_state, Service, Myname, Realm, GetPassword, CheckPassword, CheckPasswordDigest, Mech_Mod, Mech_State}
+%% Service = string()
+%% Myname = string()
+%% Realm = string()
+%% GetPassword = function()
+%% CheckPassword = function()
+%% CheckPasswordDigest = any()
+%% Mech_Mod = atom()
+%% Mech_State = term().
+%% State of this process.
+
-record(sasl_state, {service, myname, realm,
get_password, check_password, check_password_digest,
mech_mod, mech_state}).
-export([behaviour_info/1]).
+%% @hidden
+
behaviour_info(callbacks) ->
[{mech_new, 4}, {mech_step, 2}];
behaviour_info(_Other) ->
undefined.
+%% @spec () -> ok
+
start() ->
ets:new(sasl_mechanism, [named_table,
public,
@@ -55,47 +77,62 @@ start() ->
cyrsasl_anonymous:start([]),
ok.
+%% @spec (Mechanism, Module, Require_Plain) -> true
+%% Mechanism = string()
+%% Module = atom()
+%% Require_Plain = bool()
+
register_mechanism(Mechanism, Module, RequirePlainPassword) ->
ets:insert(sasl_mechanism,
#sasl_mechanism{mechanism = Mechanism,
module = Module,
require_plain_password = RequirePlainPassword}).
-%%% TODO: use callbacks
-%%-include("ejabberd.hrl").
-%%-include("jlib.hrl").
-%%check_authzid(_State, Props) ->
-%% AuthzId = xml:get_attr_s(authzid, Props),
-%% case jlib:string_to_jid(AuthzId) of
-%% error ->
-%% {error, "invalid-authzid"};
-%% JID ->
-%% LUser = jlib:nodeprep(xml:get_attr_s(username, Props)),
-%% {U, S, R} = jlib:jid_tolower(JID),
-%% case R of
-%% "" ->
-%% {error, "invalid-authzid"};
-%% _ ->
-%% case {LUser, ?MYNAME} of
-%% {U, S} ->
-%% ok;
-%% _ ->
-%% {error, "invalid-authzid"}
-%% end
-%% end
-%% end.
+% TODO use callbacks
+%-include("ejabberd.hrl").
+%-include("jlib.hrl").
+%check_authzid(_State, Props) ->
+% AuthzId = xml:get_attr_s(authzid, Props),
+% case jlib:string_to_jid(AuthzId) of
+% error ->
+% {error, "invalid-authzid"};
+% JID ->
+% LUser = jlib:nodeprep(xml:get_attr_s(username, Props)),
+% {U, S, R} = jlib:jid_tolower(JID),
+% case R of
+% "" ->
+% {error, "invalid-authzid"};
+% _ ->
+% case {LUser, ?MYNAME} of
+% {U, S} ->
+% ok;
+% _ ->
+% {error, "invalid-authzid"}
+% end
+% end
+% end.
+
+%% @spec (State, Props) -> ok | {error, 'not-authorized'}
+%% State = saslstate()
+%% Props = [{Key, Value}]
+%% Key = atom()
+%% Value = string()
check_credentials(_State, Props) ->
- User = xml:get_attr_s(username, Props),
- case jlib:nodeprep(User) of
- error ->
- {error, "not-authorized"};
- "" ->
- {error, "not-authorized"};
- _LUser ->
- ok
+ case proplists:get_value(username, Props) of
+ undefined ->
+ {error, 'not-authorized'};
+ User ->
+ case exmpp_stringprep:is_node(User) of
+ false -> {error, 'not-authorized'};
+ true -> ok
+ end
end.
+%% @spec (Host) -> [Mechanism]
+%% Host = string()
+%% Mechanism = string()
+
listmech(Host) ->
RequirePlainPassword = ejabberd_auth:plain_password_required(Host),
@@ -112,6 +149,14 @@ listmech(Host) ->
['$1']}]),
filter_anonymous(Host, Mechs).
+%% @spec (Service, ServerFQDN, UserRealm, SecFlags, GetPassword, CheckPassword, CheckPasswordDigest) -> saslstate()
+%% Service = string()
+%% ServerFQDN = string()
+%% UserRealm = string()
+%% SecFlags = [term()]
+%% GetPassword = function()
+%% CheckPassword = function()
+
server_new(Service, ServerFQDN, UserRealm, _SecFlags,
GetPassword, CheckPassword, CheckPasswordDigest) ->
#sasl_state{service = Service,
@@ -121,6 +166,22 @@ server_new(Service, ServerFQDN, UserRealm, _SecFlags,
check_password = CheckPassword,
check_password_digest= CheckPasswordDigest}.
+%% @spec (State, Mech, ClientIn) -> Ok | Continue | Error
+%% State = saslstate()
+%% Mech = string()
+%% ClientIn = string()
+%% Ok = {ok, Props}
+%% Props = [Prop]
+%% Prop = [{Key, Value}]
+%% Key = atom()
+%% Value = string()
+%% Continue = {continue, ServerOut, New_State}
+%% ServerOut = string()
+%% New_State = saslstate()
+%% Error = {error, Reason} | {error, Username, Reason}
+%% Reason = term()
+%% Username = string()
+
server_start(State, Mech, ClientIn) ->
case lists:member(Mech, listmech(State#sasl_state.myname)) of
true ->
@@ -135,12 +196,27 @@ server_start(State, Mech, ClientIn) ->
mech_state = MechState},
ClientIn);
_ ->
- {error, "no-mechanism"}
+ {error, 'invalid-mechanism'}
end;
false ->
- {error, "no-mechanism"}
+ {error, 'invalid-mechanism'}
end.
+%% @spec (State, ClientIn) -> Ok | Continue | Error
+%% State = saslstate()
+%% ClientIn = string()
+%% Ok = {ok, Props}
+%% Props = [Prop]
+%% Prop = [{Key, Value}]
+%% Key = atom()
+%% Value = string()
+%% Continue = {continue, ServerOut, New_State}
+%% ServerOut = string()
+%% New_State = saslstate()
+%% Error = {error, Reason} | {error, Username, Reason}
+%% Reason = term()
+%% Username = string()
+
server_step(State, ClientIn) ->
Module = State#sasl_state.mech_mod,
MechState = State#sasl_state.mech_state,
@@ -161,8 +237,15 @@ server_step(State, ClientIn) ->
{error, Error}
end.
-%% Remove the anonymous mechanism from the list if not enabled for the given
-%% host
+%% @spec (Host, Mechs) -> [Filtered_Mechs]
+%% Host = string()
+%% Mechs = [Mech]
+%% Mech = string()
+%% Filtered_Mechs = [Mech]
+%%
+%% @doc Remove the anonymous mechanism from the list if not enabled for
+%% the given host.
+
filter_anonymous(Host, Mechs) ->
case ejabberd_auth_anonymous:is_sasl_anonymous_enabled(Host) of
true -> Mechs;
diff --git a/src/cyrsasl_anonymous.erl b/src/cyrsasl_anonymous.erl
index 19e65d6d8..d90838918 100644
--- a/src/cyrsasl_anonymous.erl
+++ b/src/cyrsasl_anonymous.erl
@@ -31,18 +31,42 @@
-behaviour(cyrsasl).
+%% @type mechstate() = {state, Server}
+%% Server = string().
+
-record(state, {server}).
+%% @spec (Opts) -> true
+%% Opts = term()
+
start(_Opts) ->
cyrsasl:register_mechanism("ANONYMOUS", ?MODULE, false),
ok.
+%% @spec () -> ok
+
stop() ->
ok.
+%% @spec (Host, GetPassword, CheckPassword, CheckPasswordDigest) -> {ok, State}
+%% Host = string()
+%% GetPassword = function()
+%% CheckPassword = function()
+%% State = mechstate()
+
mech_new(Host, _GetPassword, _CheckPassword, _CheckPasswordDigest) ->
{ok, #state{server = Host}}.
+%% @spec (State, ClientIn) -> Ok | Error
+%% State = mechstate()
+%% ClientIn = string()
+%% Ok = {ok, Props}
+%% Props = [Prop]
+%% Prop = {username, Username} | {auth_module, AuthModule}
+%% Username = string()
+%% AuthModule = ejabberd_auth_anonymous
+%% Error = {error, 'not-authorized'}
+
mech_step(State, _ClientIn) ->
%% We generate a random username:
User = lists:concat([randoms:get_string() | tuple_to_list(now())]),
@@ -50,7 +74,7 @@ mech_step(State, _ClientIn) ->
%% Checks that the username is available
case ejabberd_auth:is_user_exists(User, Server) of
- true -> {error, "not-authorized"};
+ true -> {error, 'not-authorized'};
false -> {ok, [{username, User},
{auth_module, ejabberd_auth_anonymous}]}
end.
diff --git a/src/cyrsasl_digest.erl b/src/cyrsasl_digest.erl
index b3e80e063..b6174935c 100644
--- a/src/cyrsasl_digest.erl
+++ b/src/cyrsasl_digest.erl
@@ -36,15 +36,35 @@
-behaviour(cyrsasl).
+%% @type mechstate() = {state, Step, Nonce, Username, AuthzId, GetPassword, CheckPassword, AuthModule, Host}
+%% Step = 1 | 3 | 5
+%% Nonce = string()
+%% Username = string()
+%% AuthzId = string()
+%% GetPassword = function()
+%% AuthModule = atom()
+%% Host = string().
+
-record(state, {step, nonce, username, authzid, get_password, check_password, auth_module,
host}).
+%% @spec (Opts) -> true
+%% Opts = term()
+
start(_Opts) ->
cyrsasl:register_mechanism("DIGEST-MD5", ?MODULE, true).
+%% @spec () -> ok
+
stop() ->
ok.
+%% @spec (Host, GetPassword, CheckPassword, CheckPasswordDigest) -> {ok, State}
+%% Host = string()
+%% GetPassword = function()
+%% CheckPassword = function()
+%% State = mechstate()
+
mech_new(Host, GetPassword, _CheckPassword, CheckPasswordDigest) ->
{ok, #state{step = 1,
nonce = randoms:get_string(),
@@ -52,6 +72,21 @@ mech_new(Host, GetPassword, _CheckPassword, CheckPasswordDigest) ->
get_password = GetPassword,
check_password = CheckPasswordDigest}}.
+%% @spec (State, ClientIn) -> Ok | Continue | Error
+%% State = mechstate()
+%% ClientIn = string()
+%% Ok = {ok, Props}
+%% Props = [Prop]
+%% Prop = {username, Username} | {authzid, AuthzId} | {auth_module, AuthModule}
+%% Username = string()
+%% AuthzId = string()
+%% AuthModule = atom()
+%% Continue = {continue, ServerOut, New_State}
+%% ServerOut = string()
+%% New_State = mechstate()
+%% Error = {error, Reason} | {error, Reason, Username}
+%% Reason = term()
+
mech_step(#state{step = 1, nonce = Nonce} = State, _) ->
{continue,
"nonce=\"" ++ Nonce ++
@@ -60,23 +95,23 @@ mech_step(#state{step = 1, nonce = Nonce} = State, _) ->
mech_step(#state{step = 3, nonce = Nonce} = State, ClientIn) ->
case parse(ClientIn) of
bad ->
- {error, "bad-protocol"};
+ {error, 'bad-protocol'};
KeyVals ->
- DigestURI = xml:get_attr_s("digest-uri", KeyVals),
- UserName = xml:get_attr_s("username", KeyVals),
+ DigestURI = proplists:get_value("digest-uri", KeyVals, ""),
+ UserName = proplists:get_value("username", KeyVals, ""),
case is_digesturi_valid(DigestURI, State#state.host) of
false ->
?DEBUG("User login not authorized because digest-uri "
"seems invalid: ~p", [DigestURI]),
- {error, "not-authorized", UserName};
+ {error, 'not-authorized', UserName};
true ->
- AuthzId = xml:get_attr_s("authzid", KeyVals),
+ AuthzId = proplists:get_value("authzid", KeyVals, ""),
case (State#state.get_password)(UserName) of
{false, _} ->
- {error, "not-authorized", UserName};
+ {error, 'not-authorized', UserName};
{Passwd, AuthModule} ->
case (State#state.check_password)(UserName, "",
- xml:get_attr_s("response", KeyVals),
+ proplists:get_value("response", KeyVals, ""),
fun(PW) -> response(KeyVals, UserName, PW, Nonce, AuthzId,
"AUTHENTICATE") end) of
{true, _} ->
@@ -90,9 +125,9 @@ mech_step(#state{step = 3, nonce = Nonce} = State, ClientIn) ->
username = UserName,
authzid = AuthzId}};
false ->
- {error, "not-authorized", UserName};
+ {error, 'not-authorized', UserName};
{false, _} ->
- {error, "not-authorized", UserName}
+ {error, 'not-authorized', UserName}
end
end
end
@@ -105,11 +140,18 @@ mech_step(#state{step = 5,
{auth_module, AuthModule}]};
mech_step(A, B) ->
?DEBUG("SASL DIGEST: A ~p B ~p", [A,B]),
- {error, "bad-protocol"}.
+ {error, 'bad-protocol'}.
+
+%% @spec (S) -> [{Key, Value}] | bad
+%% S = string()
+%% Key = string()
+%% Value = string()
parse(S) ->
parse1(S, "", []).
+%% @hidden
+
parse1([$= | Cs], S, Ts) ->
parse2(Cs, lists:reverse(S), "", Ts);
parse1([$, | Cs], [], Ts) ->
@@ -123,6 +165,8 @@ parse1([], [], T) ->
parse1([], _S, _T) ->
bad.
+%% @hidden
+
parse2([$\" | Cs], Key, Val, Ts) ->
parse3(Cs, Key, Val, Ts);
parse2([C | Cs], Key, Val, Ts) ->
@@ -130,6 +174,8 @@ parse2([C | Cs], Key, Val, Ts) ->
parse2([], _, _, _) ->
bad.
+%% @hidden
+
parse3([$\" | Cs], Key, Val, Ts) ->
parse4(Cs, Key, Val, Ts);
parse3([$\\, C | Cs], Key, Val, Ts) ->
@@ -139,6 +185,8 @@ parse3([C | Cs], Key, Val, Ts) ->
parse3([], _, _, _) ->
bad.
+%% @hidden
+
parse4([$, | Cs], Key, Val, Ts) ->
parse1(Cs, "", [{Key, lists:reverse(Val)} | Ts]);
parse4([$\s | Cs], Key, Val, Ts) ->
@@ -149,6 +197,10 @@ parse4([], Key, Val, Ts) ->
parse1([], "", [{Key, lists:reverse(Val)} | Ts]).
+%% @spec (DigestURICase, JabberHost) -> bool()
+%% DigestURICase = string()
+%% JabberHost = string()
+%%
%% @doc Check if the digest-uri is valid.
%% RFC-2831 allows to provide the IP address in Host,
%% however ejabberd doesn't allow that.
@@ -156,8 +208,9 @@ parse4([], Key, Val, Ts) ->
%% is provided by several hosts (being one of them server3.example.org),
%% then digest-uri can be like xmpp/server3.example.org/jabber.example.org
%% In that case, ejabberd only checks the service name, not the host.
+
is_digesturi_valid(DigestURICase, JabberHost) ->
- DigestURI = stringprep:tolower(DigestURICase),
+ DigestURI = exmpp_stringprep:to_lower(DigestURICase),
case catch string:tokens(DigestURI, "/") of
["xmpp", Host] when Host == JabberHost ->
true;
@@ -170,14 +223,20 @@ is_digesturi_valid(DigestURICase, JabberHost) ->
+%% @hidden
+
digit_to_xchar(D) when (D >= 0) and (D < 10) ->
D + 48;
digit_to_xchar(D) ->
D + 87.
+%% @hidden
+
hex(S) ->
hex(S, []).
+%% @hidden
+
hex([], Res) ->
lists:reverse(Res);
hex([N | Ns], Res) ->
@@ -185,12 +244,22 @@ hex([N | Ns], Res) ->
digit_to_xchar(N div 16) | Res]).
+%% @spec (KeyVals, User, Passwd, Nonce, AuthzId, A2Prefix) -> string()
+%% KeyVals = [{Key, Value}]
+%% Key = string()
+%% Value = string()
+%% User = string()
+%% Passwd = string()
+%% Nonce = string()
+%% AuthzId = nil() | string()
+%% A2Prefix = string()
+
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),
+ Realm = proplists:get_value("realm", KeyVals, ""),
+ CNonce = proplists:get_value("cnonce", KeyVals, ""),
+ DigestURI = proplists:get_value("digest-uri", KeyVals, ""),
+ NC = proplists:get_value("nc", KeyVals, ""),
+ QOP = proplists:get_value("qop", KeyVals, ""),
A1 = case AuthzId of
"" ->
binary_to_list(
diff --git a/src/cyrsasl_plain.erl b/src/cyrsasl_plain.erl
index 4e69b06ba..12576c77a 100644
--- a/src/cyrsasl_plain.erl
+++ b/src/cyrsasl_plain.erl
@@ -31,18 +31,44 @@
-behaviour(cyrsasl).
+%% @type mechstate() = {state, CheckPassword}
+%% CheckPassword = function().
+
-record(state, {check_password}).
+%% @spec (Opts) -> true
+%% Opts = term()
+
start(_Opts) ->
cyrsasl:register_mechanism("PLAIN", ?MODULE, false),
ok.
+%% @spec () -> ok
+
stop() ->
ok.
+%% @spec (Host, GetPassword, CheckPassword, CheckPasswordDigest) -> {ok, State}
+%% Host = string()
+%% GetPassword = function()
+%% CheckPassword = function()
+%% State = mechstate()
+
mech_new(_Host, _GetPassword, CheckPassword, _CheckPasswordDigest) ->
{ok, #state{check_password = CheckPassword}}.
+%% @spec (State, ClientIn) -> Ok | Error
+%% State = mechstate()
+%% ClientIn = string()
+%% Ok = {ok, Props}
+%% Props = [Prop]
+%% Prop = {username, Username} | {authzid, AuthzId} | {auth_module, AuthModule}
+%% Username = string()
+%% AuthzId = string()
+%% AuthModule = atom()
+%% Error = {error, Reason} | {error, Reason, Username}
+%% Reason = term()
+
mech_step(State, ClientIn) ->
case parse(ClientIn) of
[AuthzId, User, Password] ->
@@ -51,16 +77,20 @@ mech_step(State, ClientIn) ->
{ok, [{username, User}, {authzid, AuthzId},
{auth_module, AuthModule}]};
_ ->
- {error, "not-authorized", User}
+ {error, 'not-authorized', User}
end;
_ ->
- {error, "bad-protocol"}
+ {error, 'bad-protocol'}
end.
+%% @hidden
+
parse(S) ->
parse1(S, "", []).
+%% @hidden
+
parse1([0 | Cs], S, T) ->
parse1(Cs, "", [lists:reverse(S) | T]);
parse1([C | Cs], S, T) ->
diff --git a/src/ejabberd.app b/src/ejabberd.app
index 9d944c067..f6d05a07c 100644
--- a/src/ejabberd.app
+++ b/src/ejabberd.app
@@ -2,7 +2,7 @@
{application, ejabberd,
[{description, "ejabberd"},
- {vsn, "2.1.0"},
+ {vsn, "3.0.0-alpha"},
{modules, [acl,
adhoc,
configure,
@@ -61,7 +61,6 @@
gen_mod,
gen_pubsub_node,
gen_pubsub_nodetree,
- iconv,
idna,
jd2ejd,
jlib,
@@ -74,8 +73,6 @@
mod_echo,
mod_http_bind,
mod_http_fileserver,
- mod_irc,
- mod_irc_connection,
mod_last,
mod_last_odbc,
mod_muc,
@@ -142,7 +139,6 @@
ejabberd_mod_roster,
ejabberd_mod_echo,
ejabberd_mod_pubsub,
- ejabberd_mod_irc,
ejabberd_mod_muc,
ejabberd_offline,
random_generator
diff --git a/src/ejabberd.cfg.example b/src/ejabberd.cfg.example
index a69261f08..29a1fb1df 100644
--- a/src/ejabberd.cfg.example
+++ b/src/ejabberd.cfg.example
@@ -390,7 +390,7 @@
{access, max_user_sessions, [{10, all}]}.
%% Maximum number of offline messages that users can have:
-{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.
+{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.
%% This rule allows access only for local users:
{access, local, [{allow, local}]}.
@@ -443,6 +443,20 @@
%%}.
+%%%. =======
+%%%' CAPTCHA
+
+%%
+%% Full path to a script that generates the image.
+%%
+%%{captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
+
+%%
+%% Host part of the URL sent to the user.
+%%
+%%{captcha_host, "example.org:5280"}.
+
+
%%%. ================
%%%' DEFAULT LANGUAGE
@@ -459,20 +473,6 @@
%%}.
-%%%. =======
-%%%' CAPTCHA
-
-%%
-%% Full path to a script that generates the image.
-%%
-%%{captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
-
-%%
-%% Host part of the URL sent to the user.
-%%
-%%{captcha_host, "example.org:5280"}.
-
-
%%%. =======
%%%' MODULES
@@ -487,7 +487,6 @@
{mod_configure,[]}, % requires mod_adhoc
{mod_disco, []},
%%{mod_echo, [{host, "echo.localhost"}]},
- {mod_irc, []},
{mod_http_bind, []},
%%{mod_http_fileserver, [
%% {docroot, "/var/www"},
@@ -511,7 +510,7 @@
{access_createnode, pubsub_createnode},
{ignore_pep_from_offline, true},
{last_item_cache, false},
- {plugins, ["flat", "hometree", "pep"]} % pep requires mod_caps
+ {plugins, ["flat", "pep"]} % pep requires mod_caps
]},
{mod_register, [
%%
diff --git a/src/ejabberd_admin.erl b/src/ejabberd_admin.erl
index b02d83be3..e2c95da91 100644
--- a/src/ejabberd_admin.erl
+++ b/src/ejabberd_admin.erl
@@ -135,11 +135,6 @@ commands() ->
desc = "Delete offline messages older than DAYS",
module = ?MODULE, function = delete_old_messages,
args = [{days, integer}], result = {res, rescode}},
-
- #ejabberd_commands{name = rename_default_nodeplugin, tags = [mnesia],
- desc = "Update PubSub table from ejabberd trunk SVN to 2.1.0",
- module = mod_pubsub, function = rename_default_nodeplugin,
- args = [], result = {res, rescode}},
#ejabberd_commands{name = mnesia_change_nodename, tags = [mnesia],
desc = "Change the erlang node name in a backup file",
diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
index 2e6d04251..2942ef076 100644
--- a/src/ejabberd_app.erl
+++ b/src/ejabberd_app.erl
@@ -42,10 +42,10 @@ start(normal, _Args) ->
ejabberd_loglevel:set(4),
write_pid_file(),
application:start(sasl),
+ application:start(exmpp),
randoms:start(),
db_init(),
sha:start(),
- stringprep_sup:start_link(),
start(),
translate:start(),
acl:start(),
@@ -101,19 +101,7 @@ init() ->
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.
+ ok.
db_init() ->
case mnesia:system_info(extra_db_nodes) of
diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl
index 041fe1cc4..2003d0552 100644
--- a/src/ejabberd_auth.erl
+++ b/src/ejabberd_auth.erl
@@ -56,9 +56,16 @@
-include("ejabberd.hrl").
+%% @type authmodule() = ejabberd_auth_anonymous | ejabberd_auth_external |
+%% ejabberd_auth_internal | ejabberd_auth_ldap |
+%% ejabberd_auth_odbc | ejabberd_auth_pam | atom().
+
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
+
+%% @spec () -> term()
+
start() ->
lists:foreach(
fun(Host) ->
@@ -68,46 +75,74 @@ start() ->
end, auth_modules(Host))
end, ?MYHOSTS).
-plain_password_required(Server) ->
+%% @spec (Server) -> bool()
+%% Server = string()
+
+plain_password_required(Server) when is_list(Server) ->
lists:any(
fun(M) ->
M:plain_password_required()
end, auth_modules(Server)).
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
%% @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) ->
+
+check_password(User, Server, Password)
+ when is_list(User), is_list(Server), is_list(Password) ->
case check_password_with_authmodule(User, Server, Password) of
{true, _AuthModule} -> true;
false -> false
end.
+%% @spec (User, Server, Password, Digest, DigestGen) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% Digest = string()
+%% DigestGen = function()
%% @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) ->
+
+check_password(User, Server, Password, Digest, DigestGen)
+ when is_list(User), is_list(Server), is_list(Password),
+ is_list(Digest), is_function(DigestGen) ->
case check_password_with_authmodule(User, Server, Password,
Digest, DigestGen) of
{true, _AuthModule} -> true;
false -> false
end.
+%% @spec (User, Server, Password) -> {true, AuthModule} | false
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% AuthModule = authmodule()
%% @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_with_authmodule(User, Server, Password)
+ when is_list(User), is_list(Server), is_list(Password) ->
check_password_loop(auth_modules(Server), [User, Server, Password]).
-check_password_with_authmodule(User, Server, Password, Digest, DigestGen) ->
+%% @spec (User, Server, Password, Digest, DigestGen) -> {true, AuthModule} | false
+%% User = string()
+%% Server = string()
+%% Password = string() | undefined
+%% Digest = string() | undefined
+%% DigestGen = function()
+%% AuthModule = authmodule()
+%% @doc Check the password is valid and also return the authentication module that accepts it.
+%% The password is 'undefined' if the client
+%% authenticates using the digest method as defined in
+%% XEP-0078: Non-SASL Authentication
+
+check_password_with_authmodule(User, Server, Password, Digest, DigestGen)
+ when is_list(User), is_list(Server), (is_list(Password) orelse Password == 'undefined'),
+ is_function(DigestGen), (is_list(Digest) orelse Digest == 'undefined')->
check_password_loop(auth_modules(Server), [User, Server, Password,
Digest, DigestGen]).
@@ -121,14 +156,17 @@ check_password_loop([AuthModule | AuthModules], Args) ->
check_password_loop(AuthModules, Args)
end.
+%% @spec (User, Server, Password) -> ok | {error, ErrorType}
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% ErrorType = empty_password | not_allowed | invalid_jid
-%% @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) ->
+set_password(User, Server, Password)
+ when is_list(User), is_list(Server), is_list(Password) ->
lists:foldl(
fun(M, {error, _}) ->
M:set_password(User, Server, Password);
@@ -137,15 +175,20 @@ set_password(User, Server, Password) ->
end, {error, not_allowed}, auth_modules(Server)).
%% @spec (User, Server, Password) -> {atomic, ok} | {atomic, exists} | {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string() | nil()
+
try_register(_User, _Server, "") ->
%% We do not allow empty password
{error, not_allowed};
-try_register(User, Server, Password) ->
+try_register(User, Server, Password)
+ when is_list(User), is_list(Server), is_list(Password) ->
case is_user_exists(User,Server) of
true ->
{atomic, exists};
false ->
- case lists:member(jlib:nameprep(Server), ?MYHOSTS) of
+ case lists:member(exmpp_stringprep:nameprep(Server), ?MYHOSTS) of
true ->
Res = lists:foldl(
fun(_M, {atomic, ok} = Res) ->
@@ -155,7 +198,7 @@ try_register(User, Server, Password) ->
end, {error, not_allowed}, auth_modules(Server)),
case Res of
{atomic, ok} ->
- ejabberd_hooks:run(register_user, Server,
+ ejabberd_hooks:run(register_user, list_to_binary(Server),
[User, Server]),
{atomic, ok};
_ -> Res
@@ -165,33 +208,54 @@ try_register(User, Server, Password) ->
end
end.
-%% Registered users list do not include anonymous users logged
+%% @spec () -> [{LUser, LServer}]
+%% LUser = string()
+%% LServer = string()
+%% @doc 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) ->
+%% @spec (Server) -> [{LUser, LServer}]
+%% Server = string()
+%% LUser = string()
+%% LServer = string()
+%% @doc Registered users list do not include anonymous users logged.
+
+get_vh_registered_users(Server) when is_list(Server) ->
lists:flatmap(
fun(M) ->
M:get_vh_registered_users(Server)
end, auth_modules(Server)).
-get_vh_registered_users(Server, Opts) ->
+%% @spec (Server, Opts) -> [{LUser, LServer}]
+%% Server = string()
+%% Opts = [{Opt, Val}]
+%% Opt = atom()
+%% Val = term()
+%% LUser = string()
+%% LServer = string()
+
+get_vh_registered_users(Server, Opts) when is_list(Server) ->
lists:flatmap(
fun(M) ->
case erlang:function_exported(
- M, get_vh_registered_users, 2) of
+ M, get_vh_registered_users_number, 2) of
true ->
- M:get_vh_registered_users(Server, Opts);
+ M:get_vh_registered_users_number(Server, Opts);
false ->
- M:get_vh_registered_users(Server)
+ M:get_vh_registered_users_number(Server)
end
end, auth_modules(Server)).
-get_vh_registered_users_number(Server) ->
+%% @spec (Server) -> Users_Number
+%% Server = string()
+%% Users_Number = integer()
+
+get_vh_registered_users_number(Server) when is_list(Server) ->
lists:sum(
lists:map(
fun(M) ->
@@ -204,7 +268,14 @@ get_vh_registered_users_number(Server) ->
end
end, auth_modules(Server))).
-get_vh_registered_users_number(Server, Opts) ->
+%% @spec (Server, Opts) -> Users_Number
+%% Server = string()
+%% Opts = [{Opt, Val}]
+%% Opt = atom()
+%% Val = term()
+%% Users_Number = integer()
+
+get_vh_registered_users_number(Server, Opts) when is_list(Server) ->
lists:sum(
lists:map(
fun(M) ->
@@ -217,9 +288,13 @@ get_vh_registered_users_number(Server, Opts) ->
end
end, auth_modules(Server))).
+%% @spec (User, Server) -> Password | false
+%% User = string()
+%% Server = string()
+%% Password = string()
%% @doc Get the password of the user.
-%% @spec (User::string(), Server::string()) -> Password::string()
-get_password(User, Server) ->
+
+get_password(User, Server) when is_list(User), is_list(Server) ->
lists:foldl(
fun(M, false) ->
M:get_password(User, Server);
@@ -227,7 +302,13 @@ get_password(User, Server) ->
Password
end, false, auth_modules(Server)).
-get_password_s(User, Server) ->
+%% @spec (User, Server) -> Password | nil()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% @doc Get the password of the user.
+
+get_password_s(User, Server) when is_list(User), is_list(Server) ->
case get_password(User, Server) of
false ->
"";
@@ -235,10 +316,15 @@ get_password_s(User, Server) ->
Password
end.
+%% @spec (User, Server) -> {Password, AuthModule} | {false, none}
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% AuthModule = authmodule()
%% @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) ->
+
+get_password_with_authmodule(User, Server)
+ when is_list(User), is_list(Server) ->
lists:foldl(
fun(M, {false, _}) ->
{M:get_password(User, Server), M};
@@ -246,18 +332,27 @@ get_password_with_authmodule(User, Server) ->
{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) ->
+%% @spec (User, Server) -> bool()
+%% User = string()
+%% Server = string()
+%% @doc 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) when is_list(User), is_list(Server) ->
lists:any(
fun(M) ->
M:is_user_exists(User, Server)
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) ->
+%% @spec (Module, User, Server) -> true | false | maybe
+%% Module = authmodule()
+%% User = string()
+%% Server = string()
+%% @doc Check if the user exists in all authentications module except
+%% the module passed as parameter.
+
+is_user_exists_in_other_modules(Module, User, Server)
+ when is_list(User), is_list(Server) ->
is_user_exists_in_other_modules_loop(
auth_modules(Server)--[Module],
User, Server).
@@ -278,25 +373,34 @@ is_user_exists_in_other_modules_loop([AuthModule|AuthModules], User, Server) ->
%% @spec (User, Server) -> ok | error | {error, not_allowed}
+%% User = string()
+%% Server = string()
%% @doc Remove user.
%% Note: it may return ok even if there was some problem removing the user.
-remove_user(User, Server) ->
+
+remove_user(User, Server) when is_list(User), is_list(Server) ->
R = lists:foreach(
fun(M) ->
M:remove_user(User, Server)
end, auth_modules(Server)),
case R of
- ok -> ejabberd_hooks:run(remove_user, jlib:nameprep(Server), [User, Server]);
+ ok -> ejabberd_hooks:run(remove_user, list_to_binary(exmpp_stringprep:nameprep(Server)),
+ [list_to_binary(User), list_to_binary(Server)]);
_ -> none
end,
R.
%% @spec (User, Server, Password) -> ok | not_exists | not_allowed | bad_request | error
+%% User = string()
+%% Server = string()
+%% Password = string()
%% @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) ->
+
+remove_user(User, Server, Password)
+ when is_list(User), is_list(Server), is_list(Password) ->
R = lists:foldl(
fun(_M, ok = Res) ->
Res;
@@ -304,7 +408,8 @@ remove_user(User, Server, Password) ->
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]);
+ ok -> ejabberd_hooks:run(remove_user, list_to_binary(exmpp_stringprep:nameprep(Server)),
+ [list_to_binary(User), list_to_binary(Server)]);
_ -> none
end,
R.
@@ -313,8 +418,11 @@ remove_user(User, Server, Password) ->
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
-%% Return the lists of all the auth modules actually used in the
-%% configuration
+
+%% @spec () -> [authmodule()]
+%% @doc Return the lists of all the auth modules actually used in the
+%% configuration.
+
auth_modules() ->
lists:usort(
lists:flatmap(
@@ -322,9 +430,12 @@ auth_modules() ->
auth_modules(Server)
end, ?MYHOSTS)).
-%% Return the list of authenticated modules for a given host
-auth_modules(Server) ->
- LServer = jlib:nameprep(Server),
+%% @spec (Server) -> [authmodule()]
+%% Server = string()
+%% @doc Return the list of authenticated modules for a given host.
+
+auth_modules(Server) when is_list(Server) ->
+ LServer = exmpp_stringprep:nameprep(Server),
Method = ejabberd_config:get_local_option({auth_method, LServer}),
Methods = if
Method == undefined -> [];
diff --git a/src/ejabberd_auth_anonymous.erl b/src/ejabberd_auth_anonymous.erl
index 05b9c98f5..ac63cc720 100644
--- a/src/ejabberd_auth_anonymous.erl
+++ b/src/ejabberd_auth_anonymous.erl
@@ -53,31 +53,44 @@
remove_user/3,
plain_password_required/0]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(anonymous, {us, sid}).
-%% Create the anonymous table if at least one virtual host has anonymous features enabled
-%% Register to login / logout events
-start(Host) ->
+%% @spec (Host) -> ok
+%% Host = string()
+%% @doc Create the anonymous table if at least one virtual host has
+%% anonymous features enabled.
+%% Register to login / logout events.
+
+start(Host) when is_list(Host) ->
+ HostB = list_to_binary(Host),
%% TODO: Check cluster mode
mnesia:create_table(anonymous, [{ram_copies, [node()]},
{type, bag},
{attributes, record_info(fields, anonymous)}]),
%% The hooks are needed to add / remove users from the anonymous tables
- ejabberd_hooks:add(sm_register_connection_hook, Host,
+ ejabberd_hooks:add(sm_register_connection_hook, HostB,
?MODULE, register_connection, 100),
- ejabberd_hooks:add(sm_remove_connection_hook, Host,
+ ejabberd_hooks:add(sm_remove_connection_hook, HostB,
?MODULE, unregister_connection, 100),
ok.
-%% Return true if anonymous is allowed for host or false otherwise
-allow_anonymous(Host) ->
+%% @spec (Host) -> bool()
+%% Host = string()
+%% @doc Return true if anonymous is allowed for host or false otherwise.
+
+allow_anonymous(Host) when is_list(Host) ->
lists:member(?MODULE, ejabberd_auth:auth_modules(Host)).
-%% Return true if anonymous mode is enabled and if anonymous protocol is SASL
-%% anonymous protocol can be: sasl_anon|login_anon|both
-is_sasl_anonymous_enabled(Host) ->
+%% @spec (Host) -> bool()
+%% Host = string()
+%% @doc Return true if anonymous mode is enabled and if anonymous
+%% protocol is SASL anonymous.
+%% protocol can be: sasl_anon|login_anon|both
+
+is_sasl_anonymous_enabled(Host) when is_list(Host) ->
case allow_anonymous(Host) of
false -> false;
true ->
@@ -88,10 +101,13 @@ is_sasl_anonymous_enabled(Host) ->
end
end.
-%% Return true if anonymous login is enabled on the server
+%% @spec (Host) -> bool()
+%% Host = string()
+%% @doc Return true if anonymous login is enabled on the server.
%% anonymous login can be use using standard authentication method (i.e. with
%% clients that do not support anonymous login)
-is_login_anonymous_enabled(Host) ->
+
+is_login_anonymous_enabled(Host) when is_list(Host) ->
case allow_anonymous(Host) of
false -> false;
true ->
@@ -102,9 +118,12 @@ is_login_anonymous_enabled(Host) ->
end
end.
-%% Return the anonymous protocol to use: sasl_anon|login_anon|both
+%% @spec (Host) -> sasl_anon | login_anon | both
+%% Host = string()
+%% @doc Return the anonymous protocol to use: sasl_anon|login_anon|both.
%% defaults to login_anon
-anonymous_protocol(Host) ->
+
+anonymous_protocol(Host) when is_list(Host) ->
case ejabberd_config:get_local_option({anonymous_protocol, Host}) of
sasl_anon -> sasl_anon;
login_anon -> login_anon;
@@ -112,18 +131,26 @@ anonymous_protocol(Host) ->
_Other -> sasl_anon
end.
-%% Return true if multiple connections have been allowed in the config file
+%% @spec (Host) -> bool()
+%% Host = string()
+%% @doc Return true if multiple connections have been allowed in the
+%% config file.
%% defaults to false
-allow_multiple_connections(Host) ->
+
+allow_multiple_connections(Host) when is_list(Host) ->
case ejabberd_config:get_local_option({allow_multiple_connections, Host}) of
true -> true;
_Other -> false
end.
-%% Check if user exist in the anonymus database
-anonymous_user_exist(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+%% @spec (User, Server) -> bool()
+%% User = string()
+%% Server = string()
+%% @doc Check if user exist in the anonymus database.
+
+anonymous_user_exist(User, Server) when is_list(User), is_list(Server) ->
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read({anonymous, US}) of
[] ->
@@ -132,45 +159,74 @@ anonymous_user_exist(User, Server) ->
true
end.
-%% Remove connection from Mnesia tables
-remove_connection(SID, LUser, LServer) ->
+%% @spec (SID, LUser, LServer) -> term()
+%% SID = term()
+%% LUser = string()
+%% LServer = string()
+%% @doc Remove connection from Mnesia tables.
+
+remove_connection(SID, LUser, LServer) when is_list(LUser), is_list(LServer) ->
US = {LUser, LServer},
F = fun() ->
mnesia:delete_object({anonymous, US, SID})
end,
mnesia:transaction(F).
-%% Register connection
-register_connection(SID, #jid{luser = LUser, lserver = LServer}, Info) ->
- AuthModule = xml:get_attr_s(auth_module, Info),
- case AuthModule == ?MODULE of
- true ->
+%% @spec (SID, JID, Info) -> term()
+%% SID = term()
+%% JID = exmpp_jid:jid()
+%% Info = [term()]
+%% @doc Register connection.
+
+register_connection(SID, JID, Info) when ?IS_JID(JID) ->
+ LUser = exmpp_jid:prep_node(JID),
+ LServer = exmpp_jid:prep_domain(JID),
+ case proplists:get_value(auth_module, Info) of
+ undefined ->
+ ok;
+ ?MODULE ->
US = {LUser, LServer},
mnesia:sync_dirty(
fun() -> mnesia:write(#anonymous{us = US, sid=SID})
end);
- false ->
- ok
+ _ ->
+ ok
end.
-%% Remove an anonymous user from the anonymous users table
-unregister_connection(SID, #jid{luser = LUser, lserver = LServer}, _) ->
+%% @spec (SID, JID, Ignored) -> term()
+%% SID = term()
+%% JID = exmpp_jid:jid()
+%% Ignored = term()
+%% @doc Remove an anonymous user from the anonymous users table.
+
+unregister_connection(SID, JID, _) when ?IS_JID(JID) ->
+ LUser = exmpp_jid:prep_node(JID),
+ LServer = exmpp_jid:prep_domain(JID),
purge_hook(anonymous_user_exist(LUser, LServer),
LUser, LServer),
remove_connection(SID, LUser, LServer).
-%% Launch the hook to purge user data only for anonymous users
+%% @spec (bool(), LUser, LServer) -> term()
+%% LUser = string()
+%% LServer = string()
+%% @doc Launch the hook to purge user data only for anonymous users.
+
purge_hook(false, _LUser, _LServer) ->
ok;
-purge_hook(true, LUser, LServer) ->
+purge_hook(true, LUser, LServer) when is_list(LUser), is_list(LServer) ->
ejabberd_hooks:run(anonymous_purge_hook, LServer, [LUser, LServer]).
%% ---------------------------------
%% Specific anonymous auth functions
%% ---------------------------------
-%% When anonymous login is enabled, check the password for permenant users
-%% before allowing access
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% @doc When anonymous login is enabled, check the password for
+%% permenant users before allowing access.
+
check_password(User, Server, Password) ->
check_password(User, Server, Password, undefined, undefined).
check_password(User, Server, _Password, _Digest, _DigestGen) ->
@@ -185,6 +241,10 @@ check_password(User, Server, _Password, _Digest, _DigestGen) ->
false -> login(User, Server)
end.
+%% @spec (User, Server) -> bool()
+%% User = string()
+%% Server = string()
+
login(User, Server) ->
case is_login_anonymous_enabled(Server) of
false -> false;
@@ -199,8 +259,13 @@ login(User, Server) ->
end
end.
-%% When anonymous login is enabled, check that the user is permanent before
-%% changing its password
+%% @spec (User, Server, Password) -> ok | {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% @doc When anonymous login is enabled, check that the user is
+%% permanent before changing its password.
+
set_password(User, Server, _Password) ->
case anonymous_user_exist(User, Server) of
true ->
@@ -209,22 +274,41 @@ set_password(User, Server, _Password) ->
{error, not_allowed}
end.
-%% When anonymous login is enabled, check if permanent users are allowed on
-%% the server:
+%% @spec (User, Server, Password) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% @doc When anonymous login is enabled, check if permanent users are
+%% allowed on the server:
+
try_register(_User, _Server, _Password) ->
{error, not_allowed}.
+%% @spec () -> nil()
+
dirty_get_registered_users() ->
[].
+%% @spec (Server) -> nil()
+%% Server = string()
+
get_vh_registered_users(_Server) ->
[].
+%% @spec (User, Server) -> Password | false
+%% User = string()
+%% Server = string()
+%% Password = nil()
+%% @doc Return password of permanent user or false for anonymous users.
-%% Return password of permanent user or false for anonymous users
get_password(User, Server) ->
get_password(User, Server, "").
+%% @spec (User, Server, DefaultValue) -> DefaultValue | false
+%% User = string()
+%% Server = string()
+%% DefaultValue = string()
+
get_password(User, Server, DefaultValue) ->
case anonymous_user_exist(User, Server) or login(User, Server) of
%% We return the default value if the user is anonymous
@@ -235,17 +319,32 @@ get_password(User, Server, DefaultValue) ->
false
end.
-%% Returns true if the user exists in the DB or if an anonymous user is logged
-%% under the given name
+%% @spec (User, Server) -> bool()
+%% User = string()
+%% Server = string()
+%% @doc 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) ->
anonymous_user_exist(User, Server).
+%% @spec (User, Server) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+
remove_user(_User, _Server) ->
{error, not_allowed}.
+%% @spec (User, Server, Password) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
remove_user(_User, _Server, _Password) ->
not_allowed.
+%% @spec () -> bool()
+
plain_password_required() ->
false.
diff --git a/src/ejabberd_auth_external.erl b/src/ejabberd_auth_external.erl
index a5818a606..603088ebc 100644
--- a/src/ejabberd_auth_external.erl
+++ b/src/ejabberd_auth_external.erl
@@ -46,44 +46,88 @@
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
+
+%% @spec (Host) -> ok
+%% Host = string()
+
start(Host) ->
extauth:start(
Host, ejabberd_config:get_local_option({extauth_program, Host})),
ok.
+%% @spec () -> bool()
+
plain_password_required() ->
true.
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
check_password(User, Server, Password) ->
extauth:check_password(User, Server, Password) andalso Password /= "".
+%% @spec (User, Server, Password, Digest, DigestGen) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% Digest = string()
+%% DigestGen = function()
+
check_password(User, Server, Password, _Digest, _DigestGen) ->
check_password(User, Server, Password).
+%% @spec (User, Server, Password) -> ok | {error, unknown_problem}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
set_password(User, Server, Password) ->
case extauth:set_password(User, Server, Password) of
true -> ok;
_ -> {error, unknown_problem}
end.
+%% @spec (User, Server, Password) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
try_register(_User, _Server, _Password) ->
{error, not_allowed}.
-%% TODO
-%% Return the list of all users handled by external
+%% @spec () -> nil()
+%% @todo Write it.
+%% @doc Return the list of all users handled by external.
+
dirty_get_registered_users() ->
[].
+%% @spec (Server) -> nil()
+%% Server = string()
+
get_vh_registered_users(_Server) ->
[].
+%% @spec (User, Server) -> bool()
+%% User = string()
+%% Server = string()
+
get_password(_User, _Server) ->
false.
+%% @spec (User, Server) -> nil()
+%% User = string()
+%% Server = string()
+
get_password_s(_User, _Server) ->
"".
%% @spec (User, Server) -> true | false | {error, Error}
+%% User = string()
+%% Server = string()
+
is_user_exists(User, Server) ->
try extauth:is_user_exists(User, Server) of
Res -> Res
@@ -91,9 +135,18 @@ is_user_exists(User, Server) ->
_:Error -> {error, Error}
end.
+%% @spec (User, Server) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+
remove_user(_User, _Server) ->
{error, not_allowed}.
+%% @spec (User, Server, Password) -> not_allowed
+%% User = string()
+%% Server = string()
+%% Password = string()
+
remove_user(_User, _Server, _Password) ->
not_allowed.
diff --git a/src/ejabberd_auth_internal.erl b/src/ejabberd_auth_internal.erl
index 2a6e72965..f4fa35541 100644
--- a/src/ejabberd_auth_internal.erl
+++ b/src/ejabberd_auth_internal.erl
@@ -54,6 +54,10 @@
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
+
+%% @spec (Host) -> ok
+%% Host = string()
+
start(Host) ->
mnesia:create_table(passwd, [{disc_copies, [node()]},
{attributes, record_info(fields, passwd)}]),
@@ -67,15 +71,22 @@ start(Host) ->
update_reg_users_counter_table(Server) ->
Set = get_vh_registered_users(Server),
Size = length(Set),
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_jid:prep_domain(exmpp_jid:parse(Server)),
set_vh_registered_users_counter(LServer, Size).
+%% @spec () -> bool()
+
plain_password_required() ->
false.
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
check_password(User, Server, Password) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read({passwd, US}) of
[#passwd{password = Password}] ->
@@ -84,9 +95,16 @@ check_password(User, Server, Password) ->
false
end.
+%% @spec (User, Server, Password, Digest, DigestGen) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% Digest = string()
+%% DigestGen = function()
+
check_password(User, Server, Password, Digest, DigestGen) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read({passwd, US}) of
[#passwd{password = Passwd}] ->
@@ -105,11 +123,14 @@ check_password(User, Server, Password, Digest, DigestGen) ->
false
end.
-%% @spec (User::string(), Server::string(), Password::string()) ->
-%% ok | {error, invalid_jid}
+%% @spec (User, Server, Password) -> ok | {error, invalid_jid}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
set_password(User, Server, Password) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
US = {LUser, LServer},
if
(LUser == error) or (LServer == error) ->
@@ -124,9 +145,13 @@ set_password(User, Server, Password) ->
end.
%% @spec (User, Server, Password) -> {atomic, ok} | {atomic, exists} | {error, invalid_jid} | {aborted, Reason}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
try_register(User, Server, Password) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
US = {LUser, LServer},
if
(LUser == error) or (LServer == error) ->
@@ -146,18 +171,45 @@ try_register(User, Server, Password) ->
mnesia:transaction(F)
end.
-%% Get all registered users in Mnesia
+%% @spec () -> [{LUser, LServer}]
+%% LUser = string()
+%% LServer = string()
+%% @doc Get all registered users in Mnesia.
+
dirty_get_registered_users() ->
mnesia:dirty_all_keys(passwd).
+%% @spec (Server) -> [{LUser, LServer}]
+%% Server = string()
+%% LUser = string()
+%% LServer = string()
+
get_vh_registered_users(Server) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
mnesia:dirty_select(
passwd,
[{#passwd{us = '$1', _ = '_'},
[{'==', {element, 2, '$1'}, LServer}],
['$1']}]).
+%% @spec (Server, Opts) -> [{LUser, LServer}]
+%% Server = string()
+%% Opts = [{Opt, Val}]
+%% Opt = atom()
+%% Val = term()
+%% LUser = string()
+%% LServer = string()
+%% @doc Return the registered users for the specified host.
+%%
+%% `Opts' can be one of the following:
+%%
+%% - `[{from, integer()}, {to, integer()}]'
+%% - `[{limit, integer()}, {offset, integer()}]'
+%% - `[{prefix, string()}]'
+%% - `[{prefix, string()}, {from, integer()}, {to, integer()}]'
+%% - `[{prefix, string()}, {limit, integer()}, {offset, integer()}]'
+%%
+
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}]);
@@ -204,8 +256,12 @@ get_vh_registered_users(Server, [{prefix, Prefix}, {limit, Limit}, {offset, Offs
get_vh_registered_users(Server, _) ->
get_vh_registered_users(Server).
+%% @spec (Server) -> Users_Number
+%% Server = string()
+%% Users_Number = integer()
+
get_vh_registered_users_number(Server) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_jid:prep_domain(exmpp_jid:parse(Server)),
Query = mnesia:dirty_select(
reg_users_counter,
[{#reg_users_counter{vhost = LServer, count = '$1'},
@@ -217,6 +273,11 @@ get_vh_registered_users_number(Server) ->
_ -> 0
end.
+%% @spec (Server, [{prefix, Prefix}]) -> Users_Number
+%% Server = string()
+%% Prefix = string()
+%% Users_Number = integer()
+
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);
@@ -258,88 +319,137 @@ set_vh_registered_users_counter(LServer, Count) ->
end,
mnesia:sync_dirty(F).
+%% @spec (User, Server) -> Password | false
+%% User = string()
+%% Server = string()
+%% Password = string()
+
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}] ->
- Password;
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read(passwd, US) of
+ [#passwd{password = Password}] ->
+ Password;
+ _ ->
+ false
+ end
+ catch
_ ->
false
end.
+%% @spec (User, Server) -> Password | nil()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
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}] ->
- Password;
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read(passwd, US) of
+ [#passwd{password = Password}] ->
+ Password;
+ _ ->
+ []
+ end
+ catch
_ ->
[]
end.
%% @spec (User, Server) -> true | false | {error, Error}
+%% User = string()
+%% Server = string()
+
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}
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ case catch mnesia:dirty_read({passwd, US}) of
+ [] ->
+ false;
+ [_] ->
+ true;
+ Other ->
+ {error, Other}
+ end
+ catch
+ _ ->
+ false
end.
%% @spec (User, Server) -> ok
+%% User = string()
+%% Server = string()
%% @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}),
- dec_vh_registered_users_counter(LServer)
- end,
- mnesia:transaction(F),
- ok.
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ F = fun() ->
+ mnesia:delete({passwd, US}),
+ dec_vh_registered_users_counter(LServer)
+ end,
+ mnesia:transaction(F),
+ ok
+ catch
+ _ ->
+ ok
+ end.
%% @spec (User, Server, Password) -> ok | not_exists | not_allowed | bad_request
+%% User = string()
+%% Server = string()
+%% Password = string()
%% @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}] ->
- mnesia:delete({passwd, US}),
- dec_vh_registered_users_counter(LServer),
- ok;
- [_] ->
- not_allowed;
- _ ->
- not_exists
- end
- end,
- case mnesia:transaction(F) of
- {atomic, ok} ->
- ok;
- {atomic, Res} ->
- Res;
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ F = fun() ->
+ case mnesia:read({passwd, US}) of
+ [#passwd{password = Password}] ->
+ mnesia:delete({passwd, US}),
+ dec_vh_registered_users_counter(LServer),
+ ok;
+ [_] ->
+ not_allowed;
+ _ ->
+ not_exists
+ end
+ end,
+ case mnesia:transaction(F) of
+ {atomic, ok} ->
+ ok;
+ {atomic, Res} ->
+ Res;
+ _ ->
+ bad_request
+ end
+ catch
_ ->
bad_request
end.
+%% @spec () -> term()
update_table() ->
Fields = record_info(fields, passwd),
case mnesia:table_info(passwd, attributes) of
Fields ->
+ % No conversion is needed when the table comes from an exmpp-less
+ % Ejabberd because ejabberd_auth* modules use string() and not
+ % binary().
ok;
[user, password] ->
?INFO_MSG("Converting passwd table from "
diff --git a/src/ejabberd_auth_ldap.erl b/src/ejabberd_auth_ldap.erl
index 2b97bd793..d4d90602e 100644
--- a/src/ejabberd_auth_ldap.erl
+++ b/src/ejabberd_auth_ldap.erl
@@ -95,6 +95,9 @@ handle_info(_Info, State) ->
%%% API
%%%----------------------------------------------------------------------
+%% @spec (Host) -> term()
+%% Host = string()
+
start(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
ChildSpec = {
@@ -103,19 +106,31 @@ start(Host) ->
},
supervisor:start_child(ejabberd_sup, ChildSpec).
+%% @spec (Host) -> term()
+%% Host = string()
+
stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
gen_server:call(Proc, stop),
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
+%% @spec (Host) -> term()
+%% Host = string()
+
start_link(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
gen_server:start_link({local, Proc}, ?MODULE, Host, []).
+%% @hidden
+
terminate(_Reason, _State) ->
ok.
+%% @spec (Host) -> {ok, State}
+%% Host = string()
+%% State = term()
+
init(Host) ->
State = parse_options(Host),
eldap_pool:start_link(State#state.eldap_id,
@@ -134,9 +149,16 @@ init(Host) ->
State#state.encrypt),
{ok, State}.
+%% @spec () -> true
+
plain_password_required() ->
true.
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
check_password(User, Server, Password) ->
%% In LDAP spec: empty password means anonymous authentication.
%% As ejabberd is providing other anonymous authentication mechanisms
@@ -150,16 +172,36 @@ check_password(User, Server, Password) ->
end
end.
+%% @spec (User, Server, Password, Digest, DigestGen) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% Digest = string()
+%% DigestGen = function()
+
check_password(User, Server, Password, _Digest, _DigestGen) ->
check_password(User, Server, Password).
+%% @spec (User, Server, Password) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
set_password(_User, _Server, _Password) ->
{error, not_allowed}.
%% @spec (User, Server, Password) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
try_register(_User, _Server, _Password) ->
{error, not_allowed}.
+%% @spec () -> [{LUser, LServer}]
+%% LUser = string()
+%% LServer = string()
+
dirty_get_registered_users() ->
Servers = ejabberd_config:get_vh_by_auth_method(ldap),
lists:flatmap(
@@ -167,22 +209,42 @@ dirty_get_registered_users() ->
get_vh_registered_users(Server)
end, Servers).
+%% @spec (Server) -> [{LUser, LServer}]
+%% Server = string()
+%% LUser = string()
+%% LServer = string()
+
get_vh_registered_users(Server) ->
case catch get_vh_registered_users_ldap(Server) of
{'EXIT', _} -> [];
Result -> Result
end.
+%% @spec (Server) -> Users_Number
+%% Server = string()
+%% Users_Number = integer()
+
get_vh_registered_users_number(Server) ->
length(get_vh_registered_users(Server)).
+%% @spec (User, Server) -> bool()
+%% User = string()
+%% Server = string()
+
get_password(_User, _Server) ->
false.
+%% @spec (User, Server) -> nil()
+%% User = string()
+%% Server = string()
+
get_password_s(_User, _Server) ->
"".
%% @spec (User, Server) -> true | false | {error, Error}
+%% User = string()
+%% Server = string()
+
is_user_exists(User, Server) ->
case catch is_user_exists_ldap(User, Server) of
{'EXIT', Error} ->
@@ -191,15 +253,30 @@ is_user_exists(User, Server) ->
Result
end.
+%% @spec (User, Server) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+
remove_user(_User, _Server) ->
{error, not_allowed}.
+%% @spec (User, Server, Password) -> not_allowed
+%% User = string()
+%% Server = string()
+%% Password = string()
+
remove_user(_User, _Server, _Password) ->
not_allowed.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
+
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
check_password_ldap(User, Server, Password) ->
{ok, State} = eldap_utils:get_state(Server, ?MODULE),
case find_user_dn(User, State) of
@@ -212,6 +289,11 @@ check_password_ldap(User, Server, Password) ->
end
end.
+%% @spec (Server) -> [{LUser, LServer}]
+%% Server = string()
+%% LUser = string()
+%% LServer = string()
+
get_vh_registered_users_ldap(Server) ->
{ok, State} = eldap_utils:get_state(Server, ?MODULE),
UIDs = State#state.uids,
@@ -236,9 +318,11 @@ get_vh_registered_users_ldap(Server) ->
{User, UIDFormat} ->
case eldap_utils:get_user_part(User, UIDFormat) of
{ok, U} ->
- case jlib:nodeprep(U) of
- error -> [];
- LU -> [{LU, jlib:nameprep(Server)}]
+ try
+ [{exmpp_stringprep:nodeprep(U), exmpp_stringprep:nameprep(Server)}]
+ catch
+ _ ->
+ []
end;
_ -> []
end
@@ -252,6 +336,10 @@ get_vh_registered_users_ldap(Server) ->
[]
end.
+%% @spec (User, Server) -> bool()
+%% User = string()
+%% Server = string()
+
is_user_exists_ldap(User, Server) ->
{ok, State} = eldap_utils:get_state(Server, ?MODULE),
case find_user_dn(User, State) of
diff --git a/src/ejabberd_auth_odbc.erl b/src/ejabberd_auth_odbc.erl
index e06ebc560..ccebe8a00 100644
--- a/src/ejabberd_auth_odbc.erl
+++ b/src/ejabberd_auth_odbc.erl
@@ -51,22 +51,30 @@
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
+
+%% @spec (Host) -> ok
+%% Host = string()
+
start(_Host) ->
ok.
+%% @spec () -> bool()
+
plain_password_required() ->
false.
-%% @spec (User, Server, Password) -> true | false | {error, Error}
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
check_password(User, Server, Password) ->
- case jlib:nodeprep(User) of
- error ->
- false;
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- LServer = jlib:nameprep(Server),
- try odbc_queries:get_password(LServer, Username) of
- {selected, ["password"], [{Password}]} ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ LServer = exmpp_stringprep:nameprep(Server),
+ try odbc_queries:get_password(LServer, Username) of
+ {selected, ["password"], [{Password}]} ->
Password /= ""; %% Password is correct, and not empty
{selected, ["password"], [{_Password2}]} ->
false; %% Password is not correct
@@ -77,31 +85,38 @@ check_password(User, Server, Password) ->
catch
_:_ ->
false %% Typical error is database not accessible
- end
+ end
+ catch
+ _ ->
+ false
end.
-%% @spec (User, Server, Password, Digest, DigestGen) -> true | false | {error, Error}
+%% @spec (User, Server, Password, Digest, DigestGen) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% Digest = string()
+%% DigestGen = function()
+
check_password(User, Server, Password, Digest, DigestGen) ->
- case jlib:nodeprep(User) of
- error ->
- false;
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- LServer = jlib:nameprep(Server),
- try odbc_queries:get_password(LServer, Username) of
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ LServer = exmpp_stringprep:nameprep(Server),
+ try odbc_queries:get_password(LServer, Username) of
%% Account exists, check if password is valid
- {selected, ["password"], [{Passwd}]} ->
- DigRes = if
- Digest /= "" ->
+ {selected, ["password"], [{Passwd}]} ->
+ DigRes = if
+ Digest /= "" ->
Digest == DigestGen(Passwd);
- true ->
- false
- end,
- if DigRes ->
- true;
- true ->
- (Passwd == Password) and (Password /= "")
- end;
+ true ->
+ false
+ end,
+ if DigRes ->
+ true;
+ true ->
+ (Passwd == Password) and (Password /= "")
+ end;
{selected, ["password"], []} ->
false; %% Account does not exist
{error, _Error} ->
@@ -109,43 +124,59 @@ check_password(User, Server, Password, Digest, DigestGen) ->
catch
_:_ ->
false %% Typical error is database not accessible
- end
+ end
+ catch
+ _ ->
+ false
end.
-%% @spec (User::string(), Server::string(), Password::string()) ->
-%% ok | {error, invalid_jid}
+%% @spec (User, Server, Password) -> ok | {error, invalid_jid}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
set_password(User, Server, Password) ->
- case jlib:nodeprep(User) of
- error ->
- {error, invalid_jid};
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- Pass = ejabberd_odbc:escape(Password),
- LServer = jlib:nameprep(Server),
- case catch odbc_queries:set_password_t(LServer, Username, Pass) of
- {atomic, ok} -> ok;
- Other -> {error, Other}
- end
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ Pass = ejabberd_odbc:escape(Password),
+ LServer = exmpp_stringprep:nameprep(Server),
+ case catch odbc_queries:set_password_t(LServer, Username, Pass) of
+ {atomic, ok} -> ok;
+ Other -> {error, Other}
+ end
+ catch
+ _ ->
+ {error, invalid_jid}
end.
%% @spec (User, Server, Password) -> {atomic, ok} | {atomic, exists} | {error, invalid_jid}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
try_register(User, Server, Password) ->
- case jlib:nodeprep(User) of
- error ->
- {error, invalid_jid};
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- Pass = ejabberd_odbc:escape(Password),
- LServer = jlib:nameprep(Server),
- case catch odbc_queries:add_user(LServer, Username, Pass) of
- {updated, 1} ->
- {atomic, ok};
- _ ->
- {atomic, exists}
- end
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ Pass = ejabberd_odbc:escape(Password),
+ LServer = exmpp_stringprep:nameprep(Server),
+ case catch odbc_queries:add_user(LServer, Username, Pass) of
+ {updated, 1} ->
+ {atomic, ok};
+ _ ->
+ {atomic, exists}
+ end
+ catch
+ _ ->
+ {error, invalid_jid}
end.
+%% @spec () -> [{LUser, LServer}]
+%% LUser = string()
+%% LServer = string()
+
dirty_get_registered_users() ->
Servers = ejabberd_config:get_vh_by_auth_method(odbc),
lists:flatmap(
@@ -153,8 +184,13 @@ dirty_get_registered_users() ->
get_vh_registered_users(Server)
end, Servers).
+%% @spec (Server) -> [{LUser, LServer}]
+%% Server = string()
+%% LUser = string()
+%% LServer = string()
+
get_vh_registered_users(Server) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
case catch odbc_queries:list_users(LServer) of
{selected, ["username"], Res} ->
[{U, LServer} || {U} <- Res];
@@ -162,8 +198,16 @@ get_vh_registered_users(Server) ->
[]
end.
+%% @spec (Server, Opts) -> [{LUser, LServer}]
+%% Server = string()
+%% Opts = [{Opt, Val}]
+%% Opt = atom()
+%% Val = term()
+%% LUser = string()
+%% LServer = string()
+
get_vh_registered_users(Server, Opts) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
case catch odbc_queries:list_users(LServer, Opts) of
{selected, ["username"], Res} ->
[{U, LServer} || {U} <- Res];
@@ -171,8 +215,12 @@ get_vh_registered_users(Server, Opts) ->
[]
end.
+%% @spec (Server) -> Users_Number
+%% Server = string()
+%% Users_Number = integer()
+
get_vh_registered_users_number(Server) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
case catch odbc_queries:users_number(LServer) of
{selected, [_], [{Res}]} ->
list_to_integer(Res);
@@ -180,8 +228,15 @@ get_vh_registered_users_number(Server) ->
0
end.
+%% @spec (Server, Opts) -> Users_Number
+%% Server = string()
+%% Opts = [{Opt, Val}]
+%% Opt = atom()
+%% Val = term()
+%% Users_Number = integer()
+
get_vh_registered_users_number(Server, Opts) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
case catch odbc_queries:users_number(LServer, Opts) of
{selected, [_], [{Res}]} ->
list_to_integer(Res);
@@ -189,46 +244,59 @@ get_vh_registered_users_number(Server, Opts) ->
0
end.
+%% @spec (User, Server) -> Password | false
+%% User = string()
+%% Server = string()
+%% Password = string()
+
get_password(User, Server) ->
- case jlib:nodeprep(User) of
- error ->
- false;
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- LServer = jlib:nameprep(Server),
- case catch odbc_queries:get_password(LServer, Username) of
- {selected, ["password"], [{Password}]} ->
- Password;
- _ ->
- false
- end
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ LServer = exmpp_stringprep:nameprep(Server),
+ case catch odbc_queries:get_password(LServer, Username) of
+ {selected, ["password"], [{Password}]} ->
+ Password;
+ _ ->
+ false
+ end
+ catch
+ _ ->
+ false
end.
+%% @spec (User, Server) -> Password | nil()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
get_password_s(User, Server) ->
- case jlib:nodeprep(User) of
- error ->
- "";
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- LServer = jlib:nameprep(Server),
- case catch odbc_queries:get_password(LServer, Username) of
- {selected, ["password"], [{Password}]} ->
- Password;
- _ ->
- ""
- end
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ LServer = exmpp_stringprep:nameprep(Server),
+ case catch odbc_queries:get_password(LServer, Username) of
+ {selected, ["password"], [{Password}]} ->
+ Password;
+ _ ->
+ ""
+ end
+ catch
+ _ ->
+ ""
end.
%% @spec (User, Server) -> true | false | {error, Error}
+%% User = string()
+%% Server = string()
+
is_user_exists(User, Server) ->
- case jlib:nodeprep(User) of
- error ->
- false;
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- LServer = jlib:nameprep(Server),
- try odbc_queries:get_password(LServer, Username) of
- {selected, ["password"], [{_Password}]} ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ LServer = exmpp_stringprep:nameprep(Server),
+ try odbc_queries:get_password(LServer, Username) of
+ {selected, ["password"], [{_Password}]} ->
true; %% Account exists
{selected, ["password"], []} ->
false; %% Account does not exist
@@ -237,45 +305,57 @@ is_user_exists(User, Server) ->
catch
_:B ->
{error, B} %% Typical error is database not accessible
- end
+ end
+ catch
+ _ ->
+ false
end.
%% @spec (User, Server) -> ok | error
+%% User = string()
+%% Server = string()
%% @doc Remove user.
%% Note: it may return ok even if there was some problem removing the user.
+
remove_user(User, Server) ->
- case jlib:nodeprep(User) of
- error ->
- error;
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- LServer = jlib:nameprep(Server),
- catch odbc_queries:del_user(LServer, Username),
- ok
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ LServer = exmpp_stringprep:nameprep(Server),
+ catch odbc_queries:del_user(LServer, Username),
+ ok
+ catch
+ _ ->
+ error
end.
%% @spec (User, Server, Password) -> ok | error | not_exists | not_allowed
+%% User = string()
+%% Server = string()
+%% Password = string()
%% @doc Remove user if the provided password is correct.
+
remove_user(User, Server, Password) ->
- case jlib:nodeprep(User) of
- error ->
- error;
- LUser ->
- Username = ejabberd_odbc:escape(LUser),
- Pass = ejabberd_odbc:escape(Password),
- LServer = jlib:nameprep(Server),
- F = fun() ->
- Result = odbc_queries:del_user_return_password(
- LServer, Username, Pass),
- case Result of
- {selected, ["password"], [{Password}]} ->
- ok;
- {selected, ["password"], []} ->
- not_exists;
- _ ->
- not_allowed
- end
- end,
- {atomic, Result} = odbc_queries:sql_transaction(LServer, F),
- Result
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ Username = ejabberd_odbc:escape(LUser),
+ Pass = ejabberd_odbc:escape(Password),
+ LServer = exmpp_stringprep:nameprep(Server),
+ F = fun() ->
+ Result = odbc_queries:del_user_return_password(
+ LServer, Username, Pass),
+ case Result of
+ {selected, ["password"], [{Password}]} ->
+ ok;
+ {selected, ["password"], []} ->
+ not_exists;
+ _ ->
+ not_allowed
+ end
+ end,
+ {atomic, Result} = odbc_queries:sql_transaction(LServer, F),
+ Result
+ catch
+ _ ->
+ error
end.
diff --git a/src/ejabberd_auth_pam.erl b/src/ejabberd_auth_pam.erl
index 304f025ac..a5ff59c47 100644
--- a/src/ejabberd_auth_pam.erl
+++ b/src/ejabberd_auth_pam.erl
@@ -45,6 +45,10 @@
%%====================================================================
%% API
%%====================================================================
+
+%% @spec (Host) -> ok | term()
+%% Host = string()
+
start(_Host) ->
case epam:start() of
{ok, _} -> ok;
@@ -52,57 +56,117 @@ start(_Host) ->
Err -> Err
end.
+%% @spec (User, Server, Password) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
set_password(_User, _Server, _Password) ->
{error, not_allowed}.
-check_password(User, Server, Password, _Digest, _DigestGen) ->
+%% @spec (User, Server, Password, Digest, DigestGen) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+%% Digest = string()
+%% DigestGen = function()
+
+check_password(User, Server, Password, _StreamID, _Digest) ->
check_password(User, Server, Password).
-check_password(User, Host, Password) ->
- Service = get_pam_service(Host),
+%% @spec (User, Server, Password) -> bool()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
+check_password(User, Server, Password) ->
+ Service = get_pam_service(Server),
case catch epam:authenticate(Service, User, Password) of
true -> true;
_ -> false
end.
+%% @spec (User, Server, Password) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+%% Password = string()
+
try_register(_User, _Server, _Password) ->
{error, not_allowed}.
+%% @spec () -> [{LUser, LServer}]
+%% LUser = string()
+%% LServer = string()
+
dirty_get_registered_users() ->
[].
-get_vh_registered_users(_Host) ->
+%% @spec (Server) -> [{LUser, LServer}]
+%% Server = string()
+%% LUser = string()
+%% LServer = string()
+
+get_vh_registered_users(_Server) ->
[].
+%% @spec (User, Server) -> Password | false
+%% User = string()
+%% Server = string()
+%% Password = string()
+
get_password(_User, _Server) ->
false.
+%% @spec (User, Server) -> Password | nil()
+%% User = string()
+%% Server = string()
+%% Password = string()
+
get_password_s(_User, _Server) ->
"".
%% @spec (User, Server) -> true | false | {error, Error}
-%% TODO: Improve this function to return an error instead of 'false' when connection to PAM failed
-is_user_exists(User, Host) ->
- Service = get_pam_service(Host),
+%% User = string()
+%% Server = string()
+%% TODO: Improve this function to return an error instead of 'false' when
+%% connection to PAM failed
+
+is_user_exists(User, Server) ->
+ Service = get_pam_service(Server),
case catch epam:acct_mgmt(Service, User) of
true -> true;
_ -> false
end.
+%% @spec (User, Server) -> {error, not_allowed}
+%% User = string()
+%% Server = string()
+
remove_user(_User, _Server) ->
{error, not_allowed}.
+%% @spec (User, Server, Password) -> not_allowed
+%% User = string()
+%% Server = string()
+%% Password = string()
+
remove_user(_User, _Server, _Password) ->
not_allowed.
+%% @spec () -> bool()
+
plain_password_required() ->
true.
%%====================================================================
%% Internal functions
%%====================================================================
-get_pam_service(Host) ->
- case ejabberd_config:get_local_option({pam_service, Host}) of
+
+%% @spec (Server) -> string()
+%% Server = string()
+
+get_pam_service(Server) ->
+ case ejabberd_config:get_local_option({pam_service, Server}) of
undefined -> "ejabberd";
Service -> Service
end.
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 8ca5f5c48..5a9f6fddc 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -55,8 +55,12 @@
handle_info/3,
terminate/3]).
+
+-export([get_state/1]).
+
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_privacy.hrl").
-define(SETS, gb_sets).
@@ -79,7 +83,7 @@
tls_options = [],
authenticated = false,
jid,
- user = "", server = ?MYNAME, resource = "",
+ user = undefined, server = list_to_binary(?MYNAME), resource = undefined,
sid,
pres_t = ?SETS:new(),
pres_f = ?SETS:new(),
@@ -99,7 +103,7 @@
-ifdef(DBGFSM).
-define(FSMOPTS, [{debug, [trace]}]).
-else.
--define(FSMOPTS, []).
+-define(FSMOPTS, [{spawn_opt,[{fullsweep_after,10}]}]).
-endif.
%% Module start with or without supervisor:
@@ -116,6 +120,11 @@
-define(C2S_OPEN_TIMEOUT, 60000).
-define(C2S_HIBERNATE_TIMEOUT, 90000).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_CLIENT).
+-define(PREFIXED_NS, [{?NS_XMPP, ?NS_XMPP_pfx}]).
+
-define(STREAM_HEADER,
""
"").
--define(INVALID_NS_ERR, ?SERR_INVALID_NAMESPACE).
--define(INVALID_XML_ERR, ?SERR_XML_NOT_WELL_FORMED).
--define(HOST_UNKNOWN_ERR, ?SERR_HOST_UNKNOWN).
+-define(INVALID_NS_ERR, exmpp_stream:error('invalid-namespace')).
+-define(INVALID_XML_ERR, exmpp_stream:error('xml-not-well-formed')).
+-define(HOST_UNKNOWN_ERR, exmpp_stream:error('host-unknown')).
+-define(SERRT_CONFLICT, exmpp_stream:error('conflict')).
-define(POLICY_VIOLATION_ERR(Lang, Text),
- ?SERRT_POLICY_VIOLATION(Lang, Text)).
--define(INVALID_FROM, ?SERR_INVALID_FROM).
+ exmpp_stream:error('policy-violation', {Lang, Text})).
+-define(INVALID_FROM, exmpp_stream:error('invalid-from')).
+
+-define(STANZA_ERROR(NS, Condition),
+ exmpp_xml:xmlel_to_xmlelement(exmpp_stanza:error(NS, Condition),
+ [?NS_JABBER_CLIENT], [{?NS_XMPP, "stream"}])).
+-define(ERR_FEATURE_NOT_IMPLEMENTED(NS),
+ ?STANZA_ERROR(NS, 'feature-not-implemented')).
%%%----------------------------------------------------------------------
%%% API
@@ -149,6 +165,11 @@ socket_type() ->
get_presence(FsmRef) ->
gen_fsm:sync_send_all_state_event(FsmRef, {get_presence}, 1000).
+
+%%TODO: for debug only
+get_state(FsmRef) ->
+ gen_fsm:sync_send_all_state_event(FsmRef, get_state, 1000).
+
stop(FsmRef) ->
gen_fsm:send_event(FsmRef, closed).
@@ -187,7 +208,6 @@ init([{SockMod, Socket}, Opts]) ->
(_) -> false
end, Opts),
TLSOpts = [verify_none | TLSOpts1],
- Zlib = lists:member(zlib, Opts) andalso (not StartTLSRequired),
IP = peerip(SockMod, Socket),
%% Check if IP is blacklisted:
case is_ip_blacklisted(IP) of
@@ -224,6 +244,7 @@ init([{SockMod, Socket}, Opts]) ->
get_subscribed(FsmRef) ->
gen_fsm:sync_send_all_state_event(FsmRef, get_subscribed, 1000).
+
%%----------------------------------------------------------------------
%% Func: StateName/2
%% Returns: {next_state, NextStateName, NextStateData} |
@@ -231,22 +252,27 @@ get_subscribed(FsmRef) ->
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
-wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
+wait_for_stream({xmlstreamstart, #xmlel{ns = NS} = Opening}, StateData) ->
DefaultLang = case ?MYLANG of
undefined ->
"en";
DL ->
DL
end,
- case xml:get_attr_s("xmlns:stream", Attrs) of
- ?NS_STREAM ->
- Server = jlib:nameprep(xml:get_attr_s("to", Attrs)),
+ Header = exmpp_stream:opening_reply(Opening,
+ StateData#state.streamid, DefaultLang),
+ case NS of
+ ?NS_XMPP ->
+ ServerB = exmpp_stringprep:nameprep(
+ exmpp_stream:get_receiving_entity(Opening)),
+ Server = binary_to_list(ServerB),
case lists:member(Server, ?MYHOSTS) of
true ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
- change_shaper(StateData, jlib:make_jid("", Server, "")),
- case xml:get_attr_s("version", Attrs) of
- "1.0" ->
+ Lang = exmpp_stream:get_lang(Opening),
+ change_shaper(StateData,
+ exmpp_jid:make(ServerB)),
+ case exmpp_stream:get_version(Opening) of
+ {1, 0} ->
send_header(StateData, Server, "1.0", DefaultLang),
case StateData#state.authenticated of
false ->
@@ -265,11 +291,8 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
ejabberd_auth:check_password_with_authmodule(
U, Server, P, D, DG)
end),
- Mechs = lists:map(
- fun(S) ->
- {xmlelement, "mechanism", [],
- [{xmlcdata, S}]}
- end, cyrsasl:listmech(Server)),
+ SASL_Mechs = [exmpp_server_sasl:feature(
+ cyrsasl:listmech(Server))],
SockMod =
(StateData#state.sockmod):get_sockmod(
StateData#state.socket),
@@ -279,10 +302,7 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
((SockMod == gen_tcp) orelse
(SockMod == tls)) of
true ->
- [{xmlelement, "compression",
- [{"xmlns", ?NS_FEATURE_COMPRESS}],
- [{xmlelement, "method",
- [], [{xmlcdata, "zlib"}]}]}];
+ [exmpp_server_compression:feature(["zlib"])];
_ ->
[]
end,
@@ -294,57 +314,46 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
(TLSEnabled == false) andalso
(SockMod == gen_tcp) of
true ->
- case TLSRequired of
- true ->
- [{xmlelement, "starttls",
- [{"xmlns", ?NS_TLS}],
- [{xmlelement, "required",
- [], []}]}];
- _ ->
- [{xmlelement, "starttls",
- [{"xmlns", ?NS_TLS}], []}]
- end;
+ [exmpp_server_tls:feature(TLSRequired)];
false ->
[]
end,
+ Other_Feats = ejabberd_hooks:run_fold(
+ c2s_stream_features,
+ ServerB,
+ [], []),
send_element(StateData,
- {xmlelement, "stream:features", [],
- TLSFeature ++ CompressFeature ++
- [{xmlelement, "mechanisms",
- [{"xmlns", ?NS_SASL}],
- Mechs}] ++
- ejabberd_hooks:run_fold(
- c2s_stream_features,
- Server,
- [], [])}),
+ exmpp_stream:features(
+ TLSFeature ++
+ CompressFeature ++
+ SASL_Mechs ++
+ Other_Feats)),
fsm_next_state(wait_for_feature_request,
StateData#state{
- server = Server,
+ server = ServerB,
sasl_state = SASLState,
lang = Lang});
_ ->
case StateData#state.resource of
- "" ->
- RosterVersioningFeature = ejabberd_hooks:run_fold(roster_get_versioning_feature, Server, [], [Server]),
- StreamFeatures = [{xmlelement, "bind",
- [{"xmlns", ?NS_BIND}], []},
- {xmlelement, "session",
- [{"xmlns", ?NS_SESSION}], []} | RosterVersioningFeature],
+ undefined ->
+ RosterVersioningFeature = ejabberd_hooks:run_fold(roster_get_versioning_feature, ServerB, [], [ServerB]),
send_element(
StateData,
- {xmlelement, "stream:features", [],
- StreamFeatures}),
+ exmpp_stream:features([
+ exmpp_server_binding:feature(),
+ exmpp_server_session:feature()
+ | RosterVersioningFeature])),
fsm_next_state(wait_for_bind,
StateData#state{
- server = Server,
+ server = ServerB,
lang = Lang});
_ ->
send_element(
StateData,
- {xmlelement, "stream:features", [], []}),
+ exmpp_stream:features([])),
fsm_next_state(wait_for_session,
StateData#state{
- server = Server,
+ server = ServerB,
lang = Lang})
end
end;
@@ -353,17 +362,17 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
if
(not StateData#state.tls_enabled) and
StateData#state.tls_required ->
- send_element(
- StateData,
- ?POLICY_VIOLATION_ERR(
- Lang,
- "Use of STARTTLS required")),
+ send_element(StateData,
+ exmpp_xml:append_child(Header,
+ exmpp_stream:error('policy-violation',
+ {"en", "Use of STARTTLS required"}))),
send_trailer(StateData),
{stop, normal, StateData};
true ->
+ send_element(StateData, Header),
fsm_next_state(wait_for_auth,
StateData#state{
- server = Server,
+ server = ServerB,
lang = Lang})
end
end;
@@ -404,122 +413,102 @@ wait_for_stream(closed, StateData) ->
wait_for_auth({xmlstreamelement, El}, StateData) ->
+ ServerString = binary_to_list(StateData#state.server),
case is_auth_packet(El) of
- {auth, _ID, get, {U, _, _, _}} ->
- {xmlelement, Name, Attrs, _Els} = jlib:make_result_iq_reply(El),
- case U of
- "" ->
- UCdata = [];
- _ ->
- UCdata = [{xmlcdata, U}]
+ {auth, _ID, get, {_U, _, _, _}} ->
+ Fields = case ejabberd_auth:plain_password_required(
+ ServerString) of
+ false -> both;
+ true -> plain
end,
- Res = case ejabberd_auth:plain_password_required(
- StateData#state.server) of
- false ->
- {xmlelement, Name, Attrs,
- [{xmlelement, "query", [{"xmlns", ?NS_AUTH}],
- [{xmlelement, "username", [], UCdata},
- {xmlelement, "password", [], []},
- {xmlelement, "digest", [], []},
- {xmlelement, "resource", [], []}
- ]}]};
- true ->
- {xmlelement, Name, Attrs,
- [{xmlelement, "query", [{"xmlns", ?NS_AUTH}],
- [{xmlelement, "username", [], UCdata},
- {xmlelement, "password", [], []},
- {xmlelement, "resource", [], []}
- ]}]}
- end,
- send_element(StateData, Res),
+ send_element(StateData,
+ exmpp_server_legacy_auth:fields(El, Fields)),
fsm_next_state(wait_for_auth, StateData);
- {auth, _ID, set, {_U, _P, _D, ""}} ->
- Err = jlib:make_error_reply(
- El,
- ?ERR_AUTH_NO_RESOURCE_PROVIDED(StateData#state.lang)),
- send_element(StateData, Err),
+ {auth, _ID, set, {_U, _P, _D, undefined}} ->
+ Err = exmpp_stanza:error(El#xmlel.ns, 'not-acceptable',
+ {"en", "No resource provided"}),
+ send_element(StateData, exmpp_iq:error(El, Err)),
fsm_next_state(wait_for_auth, StateData);
{auth, _ID, set, {U, P, D, R}} ->
- JID = jlib:make_jid(U, StateData#state.server, R),
- case (JID /= error) andalso
- (acl:match_rule(StateData#state.server,
- StateData#state.access, JID) == allow) of
- true ->
- DGen = fun(PW) ->
+ try
+ JID = exmpp_jid:make(U, StateData#state.server, R),
+ UBinary = exmpp_jid:prep_node(JID),
+ case acl:match_rule(ServerString,
+ StateData#state.access, JID) of
+ allow ->
+ DGen = fun(PW) ->
sha:sha(StateData#state.streamid ++ PW) end,
- case ejabberd_auth:check_password_with_authmodule(
- U, StateData#state.server, P, D, DGen) of
- {true, AuthModule} ->
- ?INFO_MSG(
- "(~w) Accepted legacy authentication for ~s by ~p",
- [StateData#state.socket,
- jlib:jid_to_string(JID), AuthModule]),
- SID = {now(), self()},
- Conn = get_conn_type(StateData),
- Info = [{ip, StateData#state.ip}, {conn, Conn},
- {auth_module, AuthModule}],
- ejabberd_sm:open_session(
- SID, U, StateData#state.server, R, Info),
- Res1 = jlib:make_result_iq_reply(El),
- Res = setelement(4, Res1, []),
- send_element(StateData, Res),
- change_shaper(StateData, JID),
- {Fs, Ts} = ejabberd_hooks:run_fold(
- roster_get_subscription_lists,
- StateData#state.server,
- {[], []},
- [U, StateData#state.server]),
- LJID = jlib:jid_tolower(
- jlib:jid_remove_resource(JID)),
- Fs1 = [LJID | Fs],
- Ts1 = [LJID | Ts],
- PrivList =
- ejabberd_hooks:run_fold(
+ case ejabberd_auth:check_password_with_authmodule(
+ U, ServerString, P,
+ D, DGen) of
+ {true, AuthModule} ->
+ ?INFO_MSG(
+ "(~w) Accepted legacy authentication for ~s by ~s",
+ [StateData#state.socket,
+ exmpp_jid:to_binary(JID), AuthModule]),
+ SID = {now(), self()},
+ Conn = get_conn_type(StateData),
+ Info = [{ip, StateData#state.ip}, {conn, Conn},
+ {auth_module, AuthModule}],
+ ejabberd_sm:open_session(
+ SID, exmpp_jid:make(U, StateData#state.server, R), Info),
+ Res = exmpp_server_legacy_auth:success(El),
+ send_element(StateData, Res),
+ change_shaper(StateData, JID),
+ {Fs, Ts} = ejabberd_hooks:run_fold(
+ roster_get_subscription_lists,
+ StateData#state.server,
+ {[], []},
+ [UBinary, StateData#state.server]),
+ LJID = jlib:short_prepd_bare_jid(JID),
+ Fs1 = [LJID | Fs],
+ Ts1 = [LJID | Ts],
+ PrivList = ejabberd_hooks:run_fold(
privacy_get_user_list, StateData#state.server,
#userlist{},
- [U, StateData#state.server]),
- NewStateData =
- StateData#state{
- user = U,
- resource = R,
- jid = JID,
- sid = SID,
- conn = Conn,
- auth_module = AuthModule,
- pres_f = ?SETS:from_list(Fs1),
- pres_t = ?SETS:from_list(Ts1),
- privacy_list = PrivList},
- fsm_next_state_pack(session_established,
- NewStateData);
- _ ->
- ?INFO_MSG(
- "(~w) Failed legacy authentication for ~s",
- [StateData#state.socket,
- jlib:jid_to_string(JID)]),
- Err = jlib:make_error_reply(
- El, ?ERR_NOT_AUTHORIZED),
- send_element(StateData, Err),
- fsm_next_state(wait_for_auth, StateData)
- end;
- _ ->
- if
- JID == error ->
- ?INFO_MSG(
- "(~w) Forbidden legacy authentication for "
- "username '~s' with resource '~s'",
- [StateData#state.socket, U, R]),
- Err = jlib:make_error_reply(El, ?ERR_JID_MALFORMED),
- send_element(StateData, Err),
- fsm_next_state(wait_for_auth, StateData);
- true ->
- ?INFO_MSG(
- "(~w) Forbidden legacy authentication for ~s",
- [StateData#state.socket,
- jlib:jid_to_string(JID)]),
- Err = jlib:make_error_reply(El, ?ERR_NOT_ALLOWED),
- send_element(StateData, Err),
- fsm_next_state(wait_for_auth, StateData)
- end
+ [UBinary, StateData#state.server]),
+ fsm_next_state(session_established,
+ StateData#state{
+ sasl_state = 'undefined',
+ %not used anymore, let the GC work.
+ user = list_to_binary(U),
+ resource = list_to_binary(R),
+ jid = JID,
+ sid = SID,
+ conn = Conn,
+ auth_module = AuthModule,
+ pres_f = ?SETS:from_list(Fs1),
+ pres_t = ?SETS:from_list(Ts1),
+ privacy_list = PrivList});
+ _ ->
+ ?INFO_MSG(
+ "(~w) Failed legacy authentication for ~s",
+ [StateData#state.socket,
+ exmpp_jid:to_binary(JID)]),
+ Res = exmpp_iq:error_without_original(El,
+ 'not-authorized'),
+ send_element(StateData, Res),
+ fsm_next_state(wait_for_auth, StateData)
+ end;
+ _ ->
+ ?INFO_MSG(
+ "(~w) Forbidden legacy authentication for ~s",
+ [StateData#state.socket,
+ exmpp_jid:to_binary(JID)]),
+ Res = exmpp_iq:error_without_original(El,
+ 'not-allowed'),
+ send_element(StateData, Res),
+ fsm_next_state(wait_for_auth, StateData)
+ end
+ catch
+ throw:_Exception ->
+ ?INFO_MSG(
+ "(~w) Forbidden legacy authentication for "
+ "username '~s' with resource '~s'",
+ [StateData#state.socket, U, R]),
+ Res1 = exmpp_iq:error_without_original(El, 'jid-malformed'),
+ send_element(StateData, Res1),
+ fsm_next_state(wait_for_auth, StateData)
end;
_ ->
process_unauthenticated_stanza(StateData, El),
@@ -542,42 +531,36 @@ wait_for_auth(closed, StateData) ->
{stop, normal, StateData}.
-wait_for_feature_request({xmlstreamelement, El}, StateData) ->
- {xmlelement, Name, Attrs, Els} = El,
+wait_for_feature_request({xmlstreamelement, #xmlel{ns = NS, name = Name} = El},
+ StateData) ->
Zlib = StateData#state.zlib,
TLS = StateData#state.tls,
TLSEnabled = StateData#state.tls_enabled,
TLSRequired = StateData#state.tls_required,
SockMod = (StateData#state.sockmod):get_sockmod(StateData#state.socket),
- case {xml:get_attr_s("xmlns", Attrs), Name} of
- {?NS_SASL, "auth"} when not ((SockMod == gen_tcp) and TLSRequired) ->
- Mech = xml:get_attr_s("mechanism", Attrs),
- ClientIn = jlib:decode_base64(xml:get_cdata(Els)),
+ case {NS, Name} of
+ {?NS_SASL, 'auth'} when not ((SockMod == gen_tcp) and TLSRequired) ->
+ {auth, Mech, ClientIn} = exmpp_server_sasl:next_step(El),
case cyrsasl:server_start(StateData#state.sasl_state,
Mech,
ClientIn) of
{ok, Props} ->
(StateData#state.sockmod):reset_stream(
StateData#state.socket),
- send_element(StateData,
- {xmlelement, "success",
- [{"xmlns", ?NS_SASL}], []}),
- U = xml:get_attr_s(username, Props),
- AuthModule = xml:get_attr_s(auth_module, Props),
- ?INFO_MSG("(~w) Accepted authentication for ~s by ~p",
+ send_element(StateData, exmpp_server_sasl:success()),
+ U = proplists:get_value(username, Props),
+ AuthModule = proplists:get_value(auth_module, Props),
+ ?INFO_MSG("(~w) Accepted authentication for ~s by ~s",
[StateData#state.socket, U, AuthModule]),
fsm_next_state(wait_for_stream,
StateData#state{
streamid = new_id(),
authenticated = true,
auth_module = AuthModule,
- user = U });
+ user = list_to_binary(U) });
{continue, ServerOut, NewSASLState} ->
send_element(StateData,
- {xmlelement, "challenge",
- [{"xmlns", ?NS_SASL}],
- [{xmlcdata,
- jlib:encode_base64(ServerOut)}]}),
+ exmpp_server_sasl:challenge(ServerOut)),
fsm_next_state(wait_for_sasl_response,
StateData#state{
sasl_state = NewSASLState});
@@ -587,23 +570,20 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) ->
[StateData#state.socket,
Username, StateData#state.server]),
send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_SASL}],
- [{xmlelement, Error, [], []}]}),
+ exmpp_server_sasl:failure(Error)),
{next_state, wait_for_feature_request, StateData,
?C2S_OPEN_TIMEOUT};
{error, Error} ->
send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_SASL}],
- [{xmlelement, Error, [], []}]}),
+ exmpp_server_sasl:failure(Error)),
fsm_next_state(wait_for_feature_request, StateData)
end;
- {?NS_TLS, "starttls"} when TLS == true,
+ {?NS_TLS, 'starttls'} when TLS == true,
TLSEnabled == false,
SockMod == gen_tcp ->
+ ServerString = binary_to_list(StateData#state.server),
TLSOpts = case ejabberd_config:get_local_option(
- {domain_certfile, StateData#state.server}) of
+ {domain_certfile, ServerString}) of
undefined ->
StateData#state.tls_options;
CertFile ->
@@ -612,55 +592,45 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) ->
certfile, 1, StateData#state.tls_options)]
end,
Socket = StateData#state.socket,
+ Proceed = exmpp_xml:node_to_list(
+ exmpp_server_tls:proceed(), [?DEFAULT_NS], ?PREFIXED_NS),
TLSSocket = (StateData#state.sockmod):starttls(
Socket, TLSOpts,
- xml:element_to_string(
- {xmlelement, "proceed", [{"xmlns", ?NS_TLS}], []})),
+ Proceed),
fsm_next_state(wait_for_stream,
StateData#state{socket = TLSSocket,
streamid = new_id(),
tls_enabled = true
});
- {?NS_COMPRESS, "compress"} when Zlib == true,
+ {?NS_COMPRESS, 'compress'} when Zlib == true,
((SockMod == gen_tcp) or
(SockMod == tls)) ->
- case xml:get_subtag(El, "method") of
- false ->
+ case exmpp_server_compression:selected_method(El) of
+ undefined ->
send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_COMPRESS}],
- [{xmlelement, "setup-failed", [], []}]}),
+ exmpp_server_compression:failure('setup-failed')),
fsm_next_state(wait_for_feature_request, StateData);
- Method ->
- case xml:get_tag_cdata(Method) of
- "zlib" ->
- Socket = StateData#state.socket,
- ZlibSocket = (StateData#state.sockmod):compress(
- Socket,
- xml:element_to_string(
- {xmlelement, "compressed",
- [{"xmlns", ?NS_COMPRESS}], []})),
- fsm_next_state(wait_for_stream,
- StateData#state{socket = ZlibSocket,
- streamid = new_id()
- });
- _ ->
- send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_COMPRESS}],
- [{xmlelement, "unsupported-method",
- [], []}]}),
- fsm_next_state(wait_for_feature_request,
- StateData)
- end
+ <<"zlib">> ->
+ Socket = StateData#state.socket,
+ ZlibSocket = (StateData#state.sockmod):compress(
+ Socket,
+ exmpp_server_compression:compressed()),
+ fsm_next_state(wait_for_stream,
+ StateData#state{socket = ZlibSocket,
+ streamid = new_id()
+ });
+ _ ->
+ send_element(StateData,
+ exmpp_server_compression:failure('unsupported-method')),
+ fsm_next_state(wait_for_feature_request,
+ StateData)
end;
_ ->
if
(SockMod == gen_tcp) and TLSRequired ->
Lang = StateData#state.lang,
- send_element(StateData, ?POLICY_VIOLATION_ERR(
- Lang,
- "Use of STARTTLS required")),
+ send_element(StateData, exmpp_stream:error(
+ 'policy-violation', {Lang, "Use of STARTTLS required"})),
send_trailer(StateData),
{stop, normal, StateData};
true ->
@@ -673,6 +643,7 @@ wait_for_feature_request(timeout, StateData) ->
{stop, normal, StateData};
wait_for_feature_request({xmlstreamend, _Name}, StateData) ->
+ send_element(StateData, exmpp_stream:closing()),
send_trailer(StateData),
{stop, normal, StateData};
@@ -685,35 +656,30 @@ wait_for_feature_request(closed, StateData) ->
{stop, normal, StateData}.
-wait_for_sasl_response({xmlstreamelement, El}, StateData) ->
- {xmlelement, Name, Attrs, Els} = El,
- case {xml:get_attr_s("xmlns", Attrs), Name} of
- {?NS_SASL, "response"} ->
- ClientIn = jlib:decode_base64(xml:get_cdata(Els)),
+wait_for_sasl_response({xmlstreamelement, #xmlel{ns = NS, name = Name} = El},
+ StateData) ->
+ case {NS, Name} of
+ {?NS_SASL, 'response'} ->
+ {response, ClientIn} = exmpp_server_sasl:next_step(El),
case cyrsasl:server_step(StateData#state.sasl_state,
ClientIn) of
{ok, Props} ->
(StateData#state.sockmod):reset_stream(
StateData#state.socket),
- send_element(StateData,
- {xmlelement, "success",
- [{"xmlns", ?NS_SASL}], []}),
- U = xml:get_attr_s(username, Props),
- AuthModule = xml:get_attr_s(auth_module, Props),
- ?INFO_MSG("(~w) Accepted authentication for ~s by ~p",
+ send_element(StateData, exmpp_server_sasl:success()),
+ U = proplists:get_value(username, Props),
+ AuthModule = proplists:get_value(auth_module, Props),
+ ?INFO_MSG("(~w) Accepted authentication for ~s by ~s",
[StateData#state.socket, U, AuthModule]),
fsm_next_state(wait_for_stream,
StateData#state{
streamid = new_id(),
authenticated = true,
auth_module = AuthModule,
- user = U});
+ user = list_to_binary(U)});
{continue, ServerOut, NewSASLState} ->
send_element(StateData,
- {xmlelement, "challenge",
- [{"xmlns", ?NS_SASL}],
- [{xmlcdata,
- jlib:encode_base64(ServerOut)}]}),
+ exmpp_server_sasl:challenge(ServerOut)),
fsm_next_state(wait_for_sasl_response,
StateData#state{sasl_state = NewSASLState});
{error, Error, Username} ->
@@ -722,15 +688,11 @@ wait_for_sasl_response({xmlstreamelement, El}, StateData) ->
[StateData#state.socket,
Username, StateData#state.server]),
send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_SASL}],
- [{xmlelement, Error, [], []}]}),
+ exmpp_server_sasl:failure(Error)),
fsm_next_state(wait_for_feature_request, StateData);
{error, Error} ->
send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_SASL}],
- [{xmlelement, Error, [], []}]}),
+ exmpp_server_sasl:failure(Error)),
fsm_next_state(wait_for_feature_request, StateData)
end;
_ ->
@@ -756,35 +718,24 @@ wait_for_sasl_response(closed, StateData) ->
wait_for_bind({xmlstreamelement, El}, StateData) ->
- case jlib:iq_query_info(El) of
- #iq{type = set, xmlns = ?NS_BIND, sub_el = SubEl} = IQ ->
- U = StateData#state.user,
- R1 = xml:get_path_s(SubEl, [{elem, "resource"}, cdata]),
- R = case jlib:resourceprep(R1) of
- error -> error;
- "" ->
- lists:concat(
- [randoms:get_string() | tuple_to_list(now())]);
- Resource -> Resource
- end,
- case R of
- error ->
- Err = jlib:make_error_reply(El, ?ERR_BAD_REQUEST),
- send_element(StateData, Err),
- fsm_next_state(wait_for_bind, StateData);
- _ ->
- JID = jlib:make_jid(U, StateData#state.server, R),
- Res = IQ#iq{type = result,
- sub_el = [{xmlelement, "bind",
- [{"xmlns", ?NS_BIND}],
- [{xmlelement, "jid", [],
- [{xmlcdata,
- jlib:jid_to_string(JID)}]}]}]},
- send_element(StateData, jlib:iq_to_xml(Res)),
- fsm_next_state(wait_for_session,
- StateData#state{resource = R, jid = JID})
- end;
- _ ->
+ try
+ R = case exmpp_server_binding:wished_resource(El) of
+ undefined ->
+ lists:concat([randoms:get_string() | tuple_to_list(now())]);
+ Resource ->
+ Resource
+ end,
+ JID = exmpp_jid:make(StateData#state.user, StateData#state.server, R),
+ Res = exmpp_server_binding:bind(El, JID),
+ send_element(StateData, Res),
+ fsm_next_state(wait_for_session,
+ StateData#state{resource = exmpp_jid:resource(JID), jid = JID})
+ catch
+ throw:{stringprep, resourceprep, _, _} ->
+ Err = exmpp_server_binding:error(El, 'bad-request'),
+ send_element(StateData, Err),
+ fsm_next_state(wait_for_bind, StateData);
+ throw:_Exception ->
fsm_next_state(wait_for_bind, StateData)
end;
@@ -806,59 +757,59 @@ wait_for_bind(closed, StateData) ->
wait_for_session({xmlstreamelement, El}, StateData) ->
- case jlib:iq_query_info(El) of
- #iq{type = set, xmlns = ?NS_SESSION} ->
- U = StateData#state.user,
- R = StateData#state.resource,
- JID = StateData#state.jid,
- case acl:match_rule(StateData#state.server,
- StateData#state.access, JID) of
- allow ->
- ?INFO_MSG("(~w) Opened session for ~s",
- [StateData#state.socket,
- jlib:jid_to_string(JID)]),
- SID = {now(), self()},
- Conn = get_conn_type(StateData),
- Info = [{ip, StateData#state.ip}, {conn, Conn},
- {auth_module, StateData#state.auth_module}],
- ejabberd_sm:open_session(
- SID, U, StateData#state.server, R, Info),
- Res = jlib:make_result_iq_reply(El),
- send_element(StateData, Res),
- change_shaper(StateData, JID),
- {Fs, Ts} = ejabberd_hooks:run_fold(
- roster_get_subscription_lists,
- StateData#state.server,
- {[], []},
- [U, StateData#state.server]),
- LJID = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
- Fs1 = [LJID | Fs],
- Ts1 = [LJID | Ts],
- PrivList =
- ejabberd_hooks:run_fold(
- privacy_get_user_list, StateData#state.server,
- #userlist{},
- [U, StateData#state.server]),
- NewStateData =
- StateData#state{
- sid = SID,
- conn = Conn,
- pres_f = ?SETS:from_list(Fs1),
- pres_t = ?SETS:from_list(Ts1),
- privacy_list = PrivList},
- fsm_next_state_pack(session_established,
- NewStateData);
- _ ->
- ejabberd_hooks:run(forbidden_session_hook,
- StateData#state.server, [JID]),
- ?INFO_MSG("(~w) Forbidden session for ~s",
- [StateData#state.socket,
- jlib:jid_to_string(JID)]),
- Err = jlib:make_error_reply(El, ?ERR_NOT_ALLOWED),
- send_element(StateData, Err),
- fsm_next_state(wait_for_session, StateData)
- end;
- _ ->
+ try
+ ServerString = binary_to_list(StateData#state.server),
+ JID = StateData#state.jid,
+ true = exmpp_server_session:want_establishment(El),
+ case acl:match_rule(ServerString,
+ StateData#state.access, JID) of
+ allow ->
+ ?INFO_MSG("(~w) Opened session for ~s",
+ [StateData#state.socket,
+ exmpp_jid:to_binary(JID)]),
+ SID = {now(), self()},
+ Conn = get_conn_type(StateData),
+ Info = [{ip, StateData#state.ip}, {conn, Conn},
+ {auth_module, StateData#state.auth_module}],
+ ejabberd_sm:open_session(
+ SID, JID, Info),
+ Res = exmpp_server_session:establish(El),
+ send_element(StateData, Res),
+ change_shaper(StateData, JID),
+ {Fs, Ts} = ejabberd_hooks:run_fold(
+ roster_get_subscription_lists,
+ StateData#state.server,
+ {[], []},
+ [StateData#state.user, StateData#state.server]),
+ LJID = jlib:short_prepd_bare_jid(JID),
+ Fs1 = [LJID | Fs],
+ Ts1 = [LJID | Ts],
+ PrivList =
+ ejabberd_hooks:run_fold(
+ privacy_get_user_list, StateData#state.server,
+ #userlist{},
+ [StateData#state.user, StateData#state.server]),
+ fsm_next_state(session_established,
+ StateData#state{
+ sasl_state = 'undefined',
+ %not used anymore, let the GC work.
+ sid = SID,
+ conn = Conn,
+ pres_f = ?SETS:from_list(Fs1),
+ pres_t = ?SETS:from_list(Ts1),
+ privacy_list = PrivList});
+ _ ->
+ ejabberd_hooks:run(forbidden_session_hook,
+ StateData#state.server, [JID]),
+ ?INFO_MSG("(~w) Forbidden session for ~s",
+ [StateData#state.socket,
+ exmpp_jid:to_binary(JID)]),
+ Err = exmpp_server_session:error(El, 'not-allowed'),
+ send_element(StateData, Err),
+ fsm_next_state(wait_for_session, StateData)
+ end
+ catch
+ _Exception ->
fsm_next_state(wait_for_session, StateData)
end;
@@ -879,15 +830,14 @@ wait_for_session(closed, StateData) ->
session_established({xmlstreamelement, El}, StateData) ->
- FromJID = StateData#state.jid,
- % Check 'from' attribute in stanza RFC 3920 Section 9.1.2
- case check_from(El, FromJID) of
- 'invalid-from' ->
+ %% Check 'from' attribute in stanza RFC 3920 Section 9.1.2
+ case check_from(El, StateData#state.jid) of
+ 'invalid-from' ->
send_element(StateData, ?INVALID_FROM),
send_trailer(StateData),
- {stop, normal, StateData};
- _NewEl ->
- session_established2(El, StateData)
+ {stop, normal, StateData};
+ _ ->
+ session_established2(El, StateData)
end;
%% We hibernate the process to reduce memory consumption after a
@@ -919,91 +869,93 @@ session_established(closed, StateData) ->
%% Process packets sent by user (coming from user on c2s XMPP
%% connection)
session_established2(El, StateData) ->
- {xmlelement, Name, Attrs, _Els} = El,
- User = StateData#state.user,
- Server = StateData#state.server,
- FromJID = StateData#state.jid,
- To = xml:get_attr_s("to", Attrs),
- ToJID = case To of
- "" ->
- jlib:make_jid(User, Server, "");
- _ ->
- jlib:string_to_jid(To)
- end,
- NewEl1 = jlib:remove_attr("xmlns", El),
- NewEl = case xml:get_attr_s("xml:lang", Attrs) of
- "" ->
- case StateData#state.lang of
- "" -> NewEl1;
- Lang ->
- xml:replace_tag_attr("xml:lang", Lang, NewEl1)
- end;
- _ ->
- NewEl1
- end,
- NewState =
- case ToJID of
- error ->
- case xml:get_attr_s("type", Attrs) of
- "error" -> StateData;
- "result" -> StateData;
+ try
+ User = StateData#state.user,
+ Server = StateData#state.server,
+
+ FromJID = StateData#state.jid,
+ To = exmpp_stanza:get_recipient(El),
+ ToJID = case To of
+ undefined ->
+ exmpp_jid:bare(StateData#state.jid);
_ ->
- Err = jlib:make_error_reply(NewEl, ?ERR_JID_MALFORMED),
- send_element(StateData, Err),
- StateData
+ exmpp_jid:parse(To)
+ end,
+ NewEl = case exmpp_stanza:get_lang(El) of
+ undefined ->
+ case StateData#state.lang of
+ undefined -> El;
+ Lang ->
+ exmpp_stanza:set_lang(El, Lang)
+ end;
+ _ ->
+ El
+ end,
+ NewState = case El of
+ #xmlel{ns = ?NS_JABBER_CLIENT, name = 'presence'} ->
+ PresenceEl = ejabberd_hooks:run_fold(
+ c2s_update_presence,
+ Server,
+ NewEl,
+ [User, Server]),
+ ejabberd_hooks:run(
+ user_send_packet,
+ Server,
+ [FromJID, ToJID, PresenceEl]),
+ case {exmpp_jid:node(ToJID),
+ exmpp_jid:domain(ToJID),
+ exmpp_jid:resource(ToJID)} of
+ {User, Server,undefined} ->
+ ?DEBUG("presence_update(~p,~n\t~p,~n\t~p)",
+ [FromJID, PresenceEl, StateData]),
+ presence_update(FromJID, PresenceEl,
+ StateData);
+ _ ->
+ presence_track(FromJID, ToJID, PresenceEl,
+ StateData)
end;
- _ ->
- case Name of
- "presence" ->
- PresenceEl = ejabberd_hooks:run_fold(
- c2s_update_presence,
- Server,
- NewEl,
- [User, Server]),
+ #xmlel{ns = ?NS_JABBER_CLIENT, name = 'iq'} ->
+ case exmpp_iq:xmlel_to_iq(El) of
+ #iq{kind = request, ns = ?NS_PRIVACY} = IQ_Rec ->
+ process_privacy_iq(
+ FromJID, ToJID, IQ_Rec, StateData);
+ _ ->
ejabberd_hooks:run(
user_send_packet,
Server,
- [FromJID, ToJID, PresenceEl]),
- case ToJID of
- #jid{user = User,
- server = Server,
- resource = ""} ->
- ?DEBUG("presence_update(~p,~n\t~p,~n\t~p)",
- [FromJID, PresenceEl, StateData]),
- presence_update(FromJID, PresenceEl,
- StateData);
- _ ->
- presence_track(FromJID, ToJID, PresenceEl,
- StateData)
- end;
- "iq" ->
- case jlib:iq_query_info(NewEl) of
- #iq{xmlns = ?NS_PRIVACY} = IQ ->
- process_privacy_iq(
- FromJID, ToJID, IQ, StateData);
- _ ->
- ejabberd_hooks:run(
- user_send_packet,
- Server,
- [FromJID, ToJID, NewEl]),
- ejabberd_router:route(
- FromJID, ToJID, NewEl),
- StateData
- end;
- "message" ->
- ejabberd_hooks:run(user_send_packet,
- Server,
- [FromJID, ToJID, NewEl]),
+ [FromJID, ToJID, NewEl]),
check_privacy_route(FromJID, StateData, FromJID,
ToJID, NewEl),
- StateData;
- _ ->
StateData
- end
+ end;
+ #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message'} ->
+ ejabberd_hooks:run(user_send_packet,
+ Server,
+ [FromJID, ToJID, NewEl]),
+ ejabberd_router:route(FromJID, ToJID, NewEl),
+ StateData;
+ _ ->
+ StateData
end,
- ejabberd_hooks:run(c2s_loop_debug, [{xmlstreamelement, El}]),
- fsm_next_state(session_established, NewState).
-
+ ejabberd_hooks:run(c2s_loop_debug, [{xmlstreamelement, El}]),
+ fsm_next_state(session_established, NewState)
+ catch
+ throw:{stringprep, _, _, _} ->
+ case exmpp_stanza:get_type(El) of
+ <<"error">> ->
+ ok;
+ <<"result">> ->
+ ok;
+ _ ->
+ Err = exmpp_stanza:reply_with_error(El, 'jid-malformed'),
+ send_element(StateData, Err)
+ end,
+ ejabberd_hooks:run(c2s_loop_debug, [{xmlstreamelement, El}]),
+ fsm_next_state(session_established, StateData);
+ throw:Exception ->
+ io:format("SESSION ESTABLISHED: Exception=~p~n", [Exception]),
+ fsm_next_state(session_established, StateData)
+ end.
%%----------------------------------------------------------------------
@@ -1037,21 +989,32 @@ handle_event(_Event, StateName, StateData) ->
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
+%TODO: for debug only
+handle_sync_event(get_state,_From,StateName,StateData) ->
+ {reply,{StateName, StateData}, StateName, StateData};
+
handle_sync_event({get_presence}, _From, StateName, StateData) ->
- User = StateData#state.user,
+ User = binary_to_list(StateData#state.user),
PresLast = StateData#state.pres_last,
- Show = get_showtag(PresLast),
- Status = get_statustag(PresLast),
- Resource = StateData#state.resource,
+ Show = case PresLast of
+ undefined -> "unavailable";
+ _ -> exmpp_presence:get_show(PresLast)
+ end,
+ Status = case PresLast of
+ undefined -> "";
+ _ -> exmpp_presence:get_status(PresLast)
+ end,
+ Resource = binary_to_list(StateData#state.resource),
- Reply = {User, Resource, Show, Status},
+ Reply = {User, Resource, atom_to_list(Show), Status},
fsm_reply(Reply, StateName, StateData);
handle_sync_event(get_subscribed, _From, StateName, StateData) ->
Subscribed = ?SETS:to_list(StateData#state.pres_f),
{reply, Subscribed, StateName, StateData};
+
handle_sync_event(_Event, _From, StateName, StateData) ->
Reply = ok,
fsm_reply(Reply, StateName, StateData).
@@ -1066,25 +1029,25 @@ code_change(_OldVsn, StateName, StateData, _Extra) ->
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_info({send_text, Text}, StateName, StateData) ->
+ % XXX OLD FORMAT: This clause should be removed.
send_text(StateData, Text),
ejabberd_hooks:run(c2s_loop_debug, [Text]),
fsm_next_state(StateName, StateData);
handle_info(replaced, _StateName, StateData) ->
- Lang = StateData#state.lang,
+ _Lang = StateData#state.lang,
send_element(StateData,
- ?SERRT_CONFLICT(Lang, "Replaced by new connection")),
+ ?SERRT_CONFLICT), %% (Lang, "Replaced by new connection")),
send_trailer(StateData),
{stop, normal, StateData#state{authenticated = replaced}};
%% Process Packets that are to be send to the user
handle_info({route, From, To, Packet}, StateName, StateData) ->
- {xmlelement, Name, Attrs, Els} = Packet,
{Pass, NewAttrs, NewState} =
- case Name of
- "presence" ->
- case xml:get_attr_s("type", Attrs) of
- "probe" ->
- LFrom = jlib:jid_tolower(From),
- LBFrom = jlib:jid_remove_resource(LFrom),
+ case Packet of
+ #xmlel{attrs = Attrs} when ?IS_PRESENCE(Packet) ->
+ case exmpp_presence:get_type(Packet) of
+ 'probe' ->
+ LFrom = jlib:short_prepd_jid(From),
+ LBFrom = jlib:short_prepd_bare_jid(From),
NewStateData =
case ?SETS:is_element(
LFrom, StateData#state.pres_a) orelse
@@ -1115,23 +1078,25 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
end,
process_presence_probe(From, To, NewStateData),
{false, Attrs, NewStateData};
- "error" ->
- NewA = remove_element(jlib:jid_tolower(From),
+ 'error' ->
+ LFrom = jlib:short_prepd_jid(From),
+ NewA = remove_element(LFrom,
StateData#state.pres_a),
{true, Attrs, StateData#state{pres_a = NewA}};
- "invisible" ->
- Attrs1 = lists:keydelete("type", 1, Attrs),
- {true, [{"type", "unavailable"} | Attrs1], StateData};
- "subscribe" ->
+ 'invisible' ->
+ Attrs1 = exmpp_stanza:set_type_in_attrs(Attrs,
+ 'unavailable'),
+ {true, Attrs1, StateData};
+ 'subscribe' ->
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
- "subscribed" ->
+ 'subscribed' ->
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
- "unsubscribe" ->
+ 'unsubscribe' ->
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
- "unsubscribed" ->
+ 'unsubscribed' ->
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
_ ->
@@ -1144,8 +1109,8 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
{From, To, Packet},
in]) of
allow ->
- LFrom = jlib:jid_tolower(From),
- LBFrom = jlib:jid_remove_resource(LFrom),
+ LFrom = jlib:short_prepd_jid(From),
+ LBFrom = jlib:short_prepd_bare_jid(From),
case ?SETS:is_element(
LFrom, StateData#state.pres_a) orelse
?SETS:is_element(
@@ -1179,10 +1144,13 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
{false, Attrs, StateData}
end
end;
- "broadcast" ->
- ?DEBUG("broadcast~n~p~n", [Els]),
- case Els of
- [{item, IJID, ISubscription}] ->
+ #xmlel{name = 'broadcast', attrs = Attrs} ->
+ ?DEBUG("broadcast~n~p~n", [Packet#xmlel.children]),
+ case Packet#xmlel.children of
+ [{item, {U, S, R} = _IJIDShort, ISubscription}] ->
+ IJID = exmpp_jid:make(U,
+ S,
+ R),
{false, Attrs,
roster_change(IJID, ISubscription,
StateData)};
@@ -1197,62 +1165,50 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
false ->
{false, Attrs, StateData};
NewPL ->
- PrivPushIQ =
- #iq{type = set, xmlns = ?NS_PRIVACY,
- id = "push" ++ randoms:get_string(),
- sub_el = [{xmlelement, "query",
- [{"xmlns", ?NS_PRIVACY}],
- [{xmlelement, "list",
- [{"name", PrivListName}],
- []}]}]},
- PrivPushEl =
- jlib:replace_from_to(
- jlib:jid_remove_resource(
- StateData#state.jid),
- StateData#state.jid,
- jlib:iq_to_xml(PrivPushIQ)),
+ PrivPushEl = exmpp_server_privacy:list_push(
+ StateData#state.jid, PrivListName),
send_element(StateData, PrivPushEl),
{false, Attrs, StateData#state{privacy_list = NewPL}}
end;
_ ->
{false, Attrs, StateData}
end;
- "iq" ->
- IQ = jlib:iq_query_info(Packet),
- case IQ of
- #iq{xmlns = ?NS_VCARD} ->
- Host = StateData#state.server,
- case ets:lookup(sm_iqtable, {?NS_VCARD, Host}) of
- [{_, 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,
- {false, Attrs, StateData};
- #iq{} ->
- case ejabberd_hooks:run_fold(
- privacy_check_packet, StateData#state.server,
- allow,
- [StateData#state.user,
- StateData#state.server,
- StateData#state.privacy_list,
- {From, To, Packet},
- in]) of
- allow ->
- {true, Attrs, StateData};
- deny ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
- ejabberd_router:route(To, From, Err),
- {false, Attrs, StateData}
+ #xmlel{attrs = Attrs} when ?IS_IQ(Packet) ->
+ case exmpp_iq:is_request(Packet) of
+ true ->
+ case exmpp_iq:get_request(Packet) of
+ #xmlel{ns = ?NS_VCARD} ->
+ Host = StateData#state.server,
+ case ets:lookup(sm_iqtable, {?NS_VCARD, Host}) of
+ [{_, Module, Function, Opts}] ->
+ gen_iq_handler:handle(Host, Module, Function, Opts,
+ From, To, exmpp_iq:xmlel_to_iq(Packet));
+ [] ->
+ Res = exmpp_iq:error(Packet, 'feature-not-implemented'),
+ ejabberd_router:route(To, From, Res)
+ end,
+ {false, Attrs, StateData};
+ _ ->
+ case ejabberd_hooks:run_fold(
+ privacy_check_packet, StateData#state.server,
+ allow,
+ [StateData#state.user,
+ StateData#state.server,
+ StateData#state.privacy_list,
+ {From, To, Packet},
+ in]) of
+ allow ->
+ {true, Attrs, StateData};
+ deny ->
+ Res = exmpp_iq:error(Packet, 'feature-not-implemented'),
+ ejabberd_router:route(To, From, Res),
+ {false, Attrs, StateData}
+ end
end;
- _ ->
+ false ->
{true, Attrs, StateData}
end;
- "message" ->
+ #xmlel{attrs = Attrs} when ?IS_MESSAGE(Packet) ->
case ejabberd_hooks:run_fold(
privacy_check_packet, StateData#state.server,
allow,
@@ -1266,21 +1222,20 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
deny ->
{false, Attrs, StateData}
end;
- _ ->
+ #xmlel{attrs = Attrs} ->
{true, Attrs, StateData}
end,
if
Pass == exit ->
%% When Pass==exit, NewState contains a string instead of a #state{}
- Lang = StateData#state.lang,
- send_element(StateData, ?SERRT_CONFLICT(Lang, NewState)),
+ _Lang = StateData#state.lang,
+ send_element(StateData, ?SERRT_CONFLICT), %% (Lang, NewState)),
send_trailer(StateData),
{stop, normal, StateData};
Pass ->
- Attrs2 = jlib:replace_from_to_attrs(jlib:jid_to_string(From),
- jlib:jid_to_string(To),
- NewAttrs),
- FixedPacket = {xmlelement, Name, Attrs2, Els},
+ Attrs2 = exmpp_stanza:set_sender_in_attrs(NewAttrs, From),
+ Attrs3 = exmpp_stanza:set_recipient_in_attrs(Attrs2, To),
+ FixedPacket = Packet#xmlel{attrs = Attrs3},
send_element(StateData, FixedPacket),
ejabberd_hooks:run(user_receive_packet,
StateData#state.server,
@@ -1304,32 +1259,30 @@ handle_info(Info, StateName, StateData) ->
%% Returns: any
%%----------------------------------------------------------------------
terminate(_Reason, StateName, StateData) ->
+ %%TODO: resource could be 'undefined' if terminate before bind?
case StateName of
session_established ->
case StateData#state.authenticated of
replaced ->
?INFO_MSG("(~w) Replaced session for ~s",
[StateData#state.socket,
- jlib:jid_to_string(StateData#state.jid)]),
+ exmpp_jid:to_binary(StateData#state.jid)]),
From = StateData#state.jid,
- Packet = {xmlelement, "presence",
- [{"type", "unavailable"}],
- [{xmlelement, "status", [],
- [{xmlcdata, "Replaced by new connection"}]}]},
+ Packet = exmpp_presence:unavailable(),
+ Packet1 = exmpp_presence:set_status(Packet,
+ "Replaced by new connection"),
ejabberd_sm:close_session_unset_presence(
StateData#state.sid,
- StateData#state.user,
- StateData#state.server,
- StateData#state.resource,
+ StateData#state.jid,
"Replaced by new connection"),
presence_broadcast(
- StateData, From, StateData#state.pres_a, Packet),
+ StateData, From, StateData#state.pres_a, Packet1),
presence_broadcast(
- StateData, From, StateData#state.pres_i, Packet);
+ StateData, From, StateData#state.pres_i, Packet1);
_ ->
?INFO_MSG("(~w) Close session for ~s",
[StateData#state.socket,
- jlib:jid_to_string(StateData#state.jid)]),
+ exmpp_jid:to_binary(StateData#state.jid)]),
EmptySet = ?SETS:new(),
case StateData of
@@ -1338,18 +1291,13 @@ terminate(_Reason, StateName, StateData) ->
pres_i = EmptySet,
pres_invis = false} ->
ejabberd_sm:close_session(StateData#state.sid,
- StateData#state.user,
- StateData#state.server,
- StateData#state.resource);
+ StateData#state.jid);
_ ->
From = StateData#state.jid,
- Packet = {xmlelement, "presence",
- [{"type", "unavailable"}], []},
+ Packet = exmpp_presence:unavailable(),
ejabberd_sm:close_session_unset_presence(
StateData#state.sid,
- StateData#state.user,
- StateData#state.server,
- StateData#state.resource,
+ StateData#state.jid,
""),
presence_broadcast(
StateData, From, StateData#state.pres_a, Packet),
@@ -1368,19 +1316,21 @@ terminate(_Reason, StateName, StateData) ->
%%%----------------------------------------------------------------------
change_shaper(StateData, JID) ->
- Shaper = acl:match_rule(StateData#state.server,
+ Shaper = acl:match_rule(binary_to_list(StateData#state.server),
StateData#state.shaper, JID),
(StateData#state.sockmod):change_shaper(StateData#state.socket, Shaper).
send_text(StateData, Text) ->
- ?DEBUG("Send XML on stream = ~p", [lists:flatten(Text)]),
+ ?DEBUG("Send XML on stream = ~s", [Text]),
(StateData#state.sockmod):send(StateData#state.socket, Text).
+send_element(StateData, #xmlel{ns = ?NS_XMPP, name = 'stream'} = El) ->
+ send_text(StateData, exmpp_stream:to_iolist(El));
send_element(StateData, El) when StateData#state.xml_socket ->
(StateData#state.sockmod):send_xml(StateData#state.socket,
{xmlstreamelement, El});
send_element(StateData, El) ->
- send_text(StateData, xml:element_to_string(El)).
+ send_text(StateData, exmpp_stanza:to_iolist(El)).
send_header(StateData, Server, Version, Lang)
when StateData#state.xml_socket ->
@@ -1428,34 +1378,38 @@ send_trailer(StateData) when StateData#state.xml_socket ->
StateData#state.socket,
{xmlstreamend, "stream:stream"});
send_trailer(StateData) ->
- send_text(StateData, ?STREAM_TRAILER).
+ send_element(StateData, exmpp_stream:closing()).
new_id() ->
randoms:get_string().
-is_auth_packet(El) ->
- case jlib:iq_query_info(El) of
- #iq{id = ID, type = Type, xmlns = ?NS_AUTH, sub_el = SubEl} ->
- {xmlelement, _, _, Els} = SubEl,
- {auth, ID, Type,
- get_auth_tags(Els, "", "", "", "")};
- _ ->
- false
- end.
+is_auth_packet(El) when ?IS_IQ(El) ->
+ case exmpp_iq:xmlel_to_iq(El) of
+ #iq{ns = ?NS_LEGACY_AUTH, kind = 'request'} = IQ_Rec ->
+ Children = exmpp_xml:get_child_elements(IQ_Rec#iq.payload),
+ {auth, IQ_Rec#iq.id, IQ_Rec#iq.type,
+ get_auth_tags(Children , undefined, undefined,
+ undefined, undefined)};
+ _ ->
+ false
+ end;
+is_auth_packet(_El) ->
+ false.
-get_auth_tags([{xmlelement, Name, _Attrs, Els}| L], U, P, D, R) ->
- CData = xml:get_cdata(Els),
+get_auth_tags([#xmlel{ns = ?NS_LEGACY_AUTH, name = Name, children = Els} | L],
+ U, P, D, R) ->
+ CData = exmpp_xml:get_cdata_from_list_as_list(Els),
case Name of
- "username" ->
+ 'username' ->
get_auth_tags(L, CData, P, D, R);
- "password" ->
+ 'password' ->
get_auth_tags(L, U, CData, D, R);
- "digest" ->
+ 'digest' ->
get_auth_tags(L, U, P, CData, R);
- "resource" ->
+ 'resource' ->
get_auth_tags(L, U, P, D, CData);
_ ->
get_auth_tags(L, U, P, D, R)
@@ -1483,8 +1437,8 @@ get_conn_type(StateData) ->
end.
process_presence_probe(From, To, StateData) ->
- LFrom = jlib:jid_tolower(From),
- LBFrom = setelement(3, LFrom, ""),
+ LFrom = jlib:short_prepd_jid(From),
+ LBFrom = jlib:short_prepd_bare_jid(From),
case StateData#state.pres_last of
undefined ->
ok;
@@ -1505,7 +1459,7 @@ process_presence_probe(From, To, StateData) ->
if
Cond1 ->
Timestamp = StateData#state.pres_timestamp,
- Packet = xml:append_subtags(
+ Packet = exmpp_xml:append_children(
StateData#state.pres_last,
%% To is the one sending the presence (the target of the probe)
[jlib:timestamp_to_xml(Timestamp, utc, To, ""),
@@ -1533,10 +1487,8 @@ process_presence_probe(From, To, StateData) ->
end
end;
Cond2 ->
- ejabberd_router:route(To, From,
- {xmlelement, "presence",
- [],
- []});
+ Packet = exmpp_presence:available(),
+ ejabberd_router:route(To, From, Packet);
true ->
ok
end
@@ -1544,21 +1496,16 @@ process_presence_probe(From, To, StateData) ->
%% User updates his presence (non-directed presence packet)
presence_update(From, Packet, StateData) ->
- {xmlelement, _Name, Attrs, _Els} = Packet,
- case xml:get_attr_s("type", Attrs) of
- "unavailable" ->
- Status = case xml:get_subtag(Packet, "status") of
- false ->
- "";
- StatusTag ->
- xml:get_tag_cdata(StatusTag)
- end,
+ case exmpp_presence:get_type(Packet) of
+ 'unavailable' ->
+ Status = case exmpp_presence:get_status(Packet) of
+ undefined -> <<>>;
+ S -> S
+ end,
Info = [{ip, StateData#state.ip}, {conn, StateData#state.conn},
{auth_module, StateData#state.auth_module}],
ejabberd_sm:unset_presence(StateData#state.sid,
- StateData#state.user,
- StateData#state.server,
- StateData#state.resource,
+ StateData#state.jid,
Status,
Info),
presence_broadcast(StateData, From, StateData#state.pres_a, Packet),
@@ -1568,8 +1515,12 @@ presence_update(From, Packet, StateData) ->
pres_a = ?SETS:new(),
pres_i = ?SETS:new(),
pres_invis = false};
- "invisible" ->
- NewPriority = get_priority_from_presence(Packet),
+ 'invisible' ->
+ NewPriority = try
+ exmpp_presence:get_priority(Packet)
+ catch
+ _Exception -> 0
+ end,
update_priority(NewPriority, Packet, StateData),
NewState =
if
@@ -1590,26 +1541,34 @@ presence_update(From, Packet, StateData) ->
StateData
end,
NewState;
- "error" ->
+ 'error' ->
StateData;
- "probe" ->
+ 'probe' ->
StateData;
- "subscribe" ->
+ 'subscribe' ->
StateData;
- "subscribed" ->
+ 'subscribed' ->
StateData;
- "unsubscribe" ->
+ 'unsubscribe' ->
StateData;
- "unsubscribed" ->
+ 'unsubscribed' ->
StateData;
_ ->
OldPriority = case StateData#state.pres_last of
undefined ->
0;
OldPresence ->
- get_priority_from_presence(OldPresence)
+ try
+ exmpp_presence:get_priority(OldPresence)
+ catch
+ _Exception -> 0
+ end
end,
- NewPriority = get_priority_from_presence(Packet),
+ NewPriority = try
+ exmpp_presence:get_priority(Packet)
+ catch
+ _Exception1 -> 0
+ end,
Timestamp = calendar:now_to_universal_time(now()),
update_priority(NewPriority, Packet, StateData),
FromUnavail = (StateData#state.pres_last == undefined) or
@@ -1653,55 +1612,53 @@ presence_update(From, Packet, StateData) ->
%% User sends a directed presence packet
presence_track(From, To, Packet, StateData) ->
- {xmlelement, _Name, Attrs, _Els} = Packet,
- LTo = jlib:jid_tolower(To),
- User = StateData#state.user,
- Server = StateData#state.server,
- case xml:get_attr_s("type", Attrs) of
- "unavailable" ->
+ LTo = jlib:short_prepd_jid(To),
+ case exmpp_presence:get_type(Packet) of
+ 'unavailable' ->
check_privacy_route(From, StateData, From, To, Packet),
I = remove_element(LTo, StateData#state.pres_i),
A = remove_element(LTo, StateData#state.pres_a),
StateData#state{pres_i = I,
pres_a = A};
- "invisible" ->
+ 'invisible' ->
+ ejabberd_router:route(From, To, Packet),
check_privacy_route(From, StateData, From, To, Packet),
I = ?SETS:add_element(LTo, StateData#state.pres_i),
A = remove_element(LTo, StateData#state.pres_a),
StateData#state{pres_i = I,
pres_a = A};
- "subscribe" ->
+ 'subscribe' ->
ejabberd_hooks:run(roster_out_subscription,
- Server,
- [User, Server, To, subscribe]),
- check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ StateData#state.server,
+ [StateData#state.user, StateData#state.server, To, subscribe]),
+ check_privacy_route(From, StateData, exmpp_jid:bare(From),
To, Packet),
StateData;
- "subscribed" ->
+ 'subscribed' ->
ejabberd_hooks:run(roster_out_subscription,
- Server,
- [User, Server, To, subscribed]),
- check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ StateData#state.server,
+ [StateData#state.user, StateData#state.server, To, subscribed]),
+ check_privacy_route(From, StateData, exmpp_jid:bare(From),
To, Packet),
StateData;
- "unsubscribe" ->
+ 'unsubscribe' ->
ejabberd_hooks:run(roster_out_subscription,
- Server,
- [User, Server, To, unsubscribe]),
- check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ StateData#state.server,
+ [StateData#state.user, StateData#state.server, To, unsubscribe]),
+ check_privacy_route(From, StateData, exmpp_jid:bare(From),
To, Packet),
StateData;
- "unsubscribed" ->
+ 'unsubscribed' ->
ejabberd_hooks:run(roster_out_subscription,
- Server,
- [User, Server, To, unsubscribed]),
- check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ StateData#state.server,
+ [StateData#state.user, StateData#state.server, To, unsubscribed]),
+ check_privacy_route(From, StateData, exmpp_jid:bare(From),
To, Packet),
StateData;
- "error" ->
+ 'error' ->
check_privacy_route(From, StateData, From, To, Packet),
StateData;
- "probe" ->
+ 'probe' ->
check_privacy_route(From, StateData, From, To, Packet),
StateData;
_ ->
@@ -1729,8 +1686,8 @@ check_privacy_route(From, StateData, FromRoute, To, Packet) ->
%% Check if privacy rules allow this delivery
is_privacy_allow(From, To, Packet, PrivacyList) ->
- User = To#jid.user,
- Server = To#jid.server,
+ User = exmpp_jid:prep_node(To),
+ Server = exmpp_jid:prep_domain(To),
allow == ejabberd_hooks:run_fold(
privacy_check_packet, Server,
allow,
@@ -1741,8 +1698,8 @@ is_privacy_allow(From, To, Packet, PrivacyList) ->
in]).
presence_broadcast(StateData, From, JIDSet, Packet) ->
- lists:foreach(fun(JID) ->
- FJID = jlib:make_jid(JID),
+ lists:foreach(fun({U, S, R}) ->
+ FJID = exmpp_jid:make(U, S, R),
case ejabberd_hooks:run_fold(
privacy_check_packet, StateData#state.server,
allow,
@@ -1760,10 +1717,10 @@ presence_broadcast(StateData, From, JIDSet, Packet) ->
presence_broadcast_to_trusted(StateData, From, T, A, Packet) ->
lists:foreach(
- fun(JID) ->
+ fun({U, S, R} = JID) ->
case ?SETS:is_element(JID, T) of
true ->
- FJID = jlib:make_jid(JID),
+ FJID = exmpp_jid:make(U, S, R),
case ejabberd_hooks:run_fold(
privacy_check_packet, StateData#state.server,
allow,
@@ -1784,13 +1741,13 @@ presence_broadcast_to_trusted(StateData, From, T, A, Packet) ->
presence_broadcast_first(From, StateData, Packet) ->
- ?SETS:fold(fun(JID, X) ->
+ Probe = exmpp_presence:probe(),
+ ?SETS:fold(fun({U, S, R}, X) ->
+ FJID = exmpp_jid:make(U, S, R),
ejabberd_router:route(
From,
- jlib:make_jid(JID),
- {xmlelement, "presence",
- [{"type", "probe"}],
- []}),
+ FJID,
+ Probe),
X
end,
[],
@@ -1800,8 +1757,8 @@ presence_broadcast_first(From, StateData, Packet) ->
StateData;
true ->
As = ?SETS:fold(
- fun(JID, A) ->
- FJID = jlib:make_jid(JID),
+ fun({U, S, R} = JID, A) ->
+ FJID = exmpp_jid:make(U, S, R),
case ejabberd_hooks:run_fold(
privacy_check_packet, StateData#state.server,
allow,
@@ -1833,7 +1790,7 @@ remove_element(E, Set) ->
roster_change(IJID, ISubscription, StateData) ->
- LIJID = jlib:jid_tolower(IJID),
+ LIJID = jlib:short_prepd_jid(IJID),
IsFrom = (ISubscription == both) or (ISubscription == from),
IsTo = (ISubscription == both) or (ISubscription == to),
OldIsFrom = ?SETS:is_element(LIJID, StateData#state.pres_f),
@@ -1855,7 +1812,7 @@ roster_change(IJID, ISubscription, StateData) ->
P ->
?DEBUG("roster changed for ~p~n", [StateData#state.user]),
From = StateData#state.jid,
- To = jlib:make_jid(IJID),
+ To = IJID,
Cond1 = (not StateData#state.pres_invis) and IsFrom
and (not OldIsFrom),
Cond2 = (not IsFrom) and OldIsFrom
@@ -1884,8 +1841,7 @@ roster_change(IJID, ISubscription, StateData) ->
pres_t = TSet};
Cond2 ->
?DEBUG("C2: ~p~n", [LIJID]),
- PU = {xmlelement, "presence",
- [{"type", "unavailable"}], []},
+ PU = exmpp_presence:unavailable(),
case ejabberd_hooks:run_fold(
privacy_check_packet, StateData#state.server,
allow,
@@ -1917,42 +1873,27 @@ update_priority(Priority, Packet, StateData) ->
Info = [{ip, StateData#state.ip}, {conn, StateData#state.conn},
{auth_module, StateData#state.auth_module}],
ejabberd_sm:set_presence(StateData#state.sid,
- StateData#state.user,
- StateData#state.server,
- StateData#state.resource,
+ StateData#state.jid,
Priority,
Packet,
Info).
-get_priority_from_presence(PresencePacket) ->
- case xml:get_subtag(PresencePacket, "priority") of
- false ->
- 0;
- SubEl ->
- case catch list_to_integer(xml:get_tag_cdata(SubEl)) of
- P when is_integer(P) ->
- P;
- _ ->
- 0
- end
- end.
-
process_privacy_iq(From, To,
- #iq{type = Type, sub_el = SubEl} = IQ,
+ #iq{type = Type, iq_ns = IQ_NS} = IQ_Rec,
StateData) ->
{Res, NewStateData} =
case Type of
get ->
R = ejabberd_hooks:run_fold(
- privacy_iq_get, StateData#state.server,
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED},
- [From, To, IQ, StateData#state.privacy_list]),
+ privacy_iq_get, StateData#state.server ,
+ {error, ?ERR_FEATURE_NOT_IMPLEMENTED(IQ_NS)},
+ [From, To, IQ_Rec, StateData#state.privacy_list]),
{R, StateData};
set ->
case ejabberd_hooks:run_fold(
privacy_iq_set, StateData#state.server,
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED},
- [From, To, IQ]) of
+ {error, ?ERR_FEATURE_NOT_IMPLEMENTED(IQ_NS)},
+ [From, To, IQ_Rec]) of
{result, R, NewPrivList} ->
{{result, R},
StateData#state{privacy_list = NewPrivList}};
@@ -1961,32 +1902,35 @@ process_privacy_iq(From, To,
end,
IQRes =
case Res of
+ {result, []} ->
+ exmpp_iq:result(IQ_Rec);
{result, Result} ->
- IQ#iq{type = result, sub_el = Result};
+ exmpp_iq:result(IQ_Rec, Result);
{error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
+ exmpp_iq:error(IQ_Rec, Error)
end,
ejabberd_router:route(
- To, From, jlib:iq_to_xml(IQRes)),
+ To, From, exmpp_iq:iq_to_xmlel(IQRes)),
NewStateData.
-resend_offline_messages(#state{user = User,
- server = Server,
+resend_offline_messages(#state{user = UserB,
+ server = ServerB,
privacy_list = PrivList} = StateData) ->
+
case ejabberd_hooks:run_fold(resend_offline_messages_hook,
- Server,
+ StateData#state.server,
[],
- [User, Server]) of
+ [UserB, ServerB]) of
Rs when is_list(Rs) ->
lists:foreach(
fun({route,
- From, To, {xmlelement, Name, Attrs, Els} = Packet}) ->
+ From, To, Packet}) ->
Pass = case ejabberd_hooks:run_fold(
- privacy_check_packet, Server,
+ privacy_check_packet, StateData#state.server,
allow,
- [User,
- Server,
+ [StateData#state.user,
+ StateData#state.server,
PrivList,
{From, To, Packet},
in]) of
@@ -1997,72 +1941,60 @@ resend_offline_messages(#state{user = User,
end,
if
Pass ->
- Attrs2 = jlib:replace_from_to_attrs(
- jlib:jid_to_string(From),
- jlib:jid_to_string(To),
- Attrs),
+ Attrs1 = exmpp_stanza:set_sender_in_attrs(
+ Packet#xmlel.attrs, From),
+ Attrs2 = exmpp_stanza:set_recipient_in_attrs(
+ Attrs1, To),
send_element(StateData,
- {xmlelement, Name, Attrs2, Els});
+ Packet#xmlel{attrs = Attrs2});
true ->
ok
end
end, Rs)
end.
-resend_subscription_requests(#state{user = User,
- server = Server} = StateData) ->
+resend_subscription_requests(#state{user = UserB,
+ server = ServerB} = StateData) ->
PendingSubscriptions = ejabberd_hooks:run_fold(
resend_subscription_requests_hook,
- Server,
+ StateData#state.server,
[],
- [User, Server]),
+ [UserB, ServerB]),
lists:foreach(fun(XMLPacket) ->
send_element(StateData,
XMLPacket)
end,
PendingSubscriptions).
-get_showtag(undefined) ->
- "unavailable";
-get_showtag(Presence) ->
- case xml:get_path_s(Presence, [{elem, "show"}, cdata]) of
- "" -> "available";
- ShowTag -> ShowTag
- end.
-
-get_statustag(undefined) ->
- "";
-get_statustag(Presence) ->
- case xml:get_path_s(Presence, [{elem, "status"}, cdata]) of
- ShowTag -> ShowTag
- end.
-
-process_unauthenticated_stanza(StateData, El) ->
- case jlib:iq_query_info(El) of
- #iq{} = IQ ->
+process_unauthenticated_stanza(StateData, El) when ?IS_IQ(El) ->
+ case exmpp_iq:get_kind(El) of
+ request ->
+ IQ_Rec = exmpp_iq:xmlel_to_iq(El),
Res = ejabberd_hooks:run_fold(c2s_unauthenticated_iq,
StateData#state.server,
empty,
- [StateData#state.server, IQ,
+ [StateData#state.server, IQ_Rec,
StateData#state.ip]),
case Res of
empty ->
% The only reasonable IQ's here are auth and register IQ's
% They contain secrets, so don't include subelements to response
- ResIQ = IQ#iq{type = error,
- sub_el = [?ERR_SERVICE_UNAVAILABLE]},
- Res1 = jlib:replace_from_to(
- jlib:make_jid("", StateData#state.server, ""),
- jlib:make_jid("", "", ""),
- jlib:iq_to_xml(ResIQ)),
- send_element(StateData, jlib:remove_attr("to", Res1));
+ ResIQ = exmpp_iq:error_without_original(El,
+ 'service-unavailable'),
+ Res1 = exmpp_stanza:set_sender(ResIQ,
+ exmpp_jid:make(StateData#state.server)),
+ Res2 = exmpp_stanza:remove_recipient(Res1),
+ send_element(StateData, Res2);
_ ->
send_element(StateData, Res)
end;
_ ->
- % Drop any stanza, which isn't IQ stanza
+ % Drop any stanza, which isn't an IQ request stanza
ok
- end.
+ end;
+process_unauthenticated_stanza(_StateData,_El) ->
+ ok.
+
peerip(SockMod, Socket) ->
IP = case SockMod of
@@ -2074,17 +2006,6 @@ peerip(SockMod, Socket) ->
_ -> undefined
end.
-%% fsm_next_state_pack: Pack the StateData structure to improve
-%% sharing.
-fsm_next_state_pack(StateName, StateData) ->
- fsm_next_state_gc(StateName, pack(StateData)).
-
-%% fsm_next_state_gc: Garbage collect the process heap to make use of
-%% the newly packed StateData structure.
-fsm_next_state_gc(StateName, PackedStateData) ->
- erlang:garbage_collect(),
- fsm_next_state(StateName, PackedStateData).
-
%% fsm_next_state: Generate the next_state FSM tuple with different
%% timeout, depending on the future state
fsm_next_state(session_established, StateData) ->
@@ -2108,75 +2029,32 @@ is_ip_blacklisted({IP,_Port}) ->
%% Check from attributes
%% returns invalid-from|NewElement
check_from(El, FromJID) ->
- case xml:get_tag_attr("from", El) of
- false ->
+ case exmpp_stanza:get_sender(El) of
+ undefined ->
El;
{value, SJID} ->
- JID = jlib:string_to_jid(SJID),
- case JID of
- error ->
- 'invalid-from';
- #jid{} ->
- if
- (JID#jid.luser == FromJID#jid.luser) and
- (JID#jid.lserver == FromJID#jid.lserver) and
- (JID#jid.lresource == FromJID#jid.lresource) ->
- El;
- (JID#jid.luser == FromJID#jid.luser) and
- (JID#jid.lserver == FromJID#jid.lserver) and
- (JID#jid.lresource == "") ->
- El;
- true ->
- 'invalid-from'
- end
+ try
+ JIDEl = exmpp_jid:parse(SJID),
+ case exmpp_jid:prep_resource(JIDEl) of
+ undefined ->
+ %% Matching JID: The stanza is ok
+ case exmpp_jid:bare_compare(JIDEl, FromJID) of
+ true ->
+ El;
+ false ->
+ 'invalid-from'
+ end;
+ _ ->
+ %% Matching JID: The stanza is ok
+ case exmpp_jid:compare(JIDEl, FromJID) of
+ true ->
+ El;
+ false ->
+ 'invalid-from'
+ end
+ end
+ catch
+ _:_ ->
+ 'invalid-from'
end
end.
-
-%%%----------------------------------------------------------------------
-%%% JID Set memory footprint reduction code
-%%%----------------------------------------------------------------------
-
-%% Try to reduce the heap footprint of the four presence sets
-%% by ensuring that we re-use strings and Jids wherever possible.
-pack(S = #state{pres_a=A,
- pres_i=I,
- pres_f=F,
- pres_t=T}) ->
- {NewA, Pack1} = pack_jid_set(A, gb_trees:empty()),
- {NewI, Pack2} = pack_jid_set(I, Pack1),
- {NewF, Pack3} = pack_jid_set(F, Pack2),
- {NewT, _Pack4} = pack_jid_set(T, Pack3),
- %% Throw away Pack4 so that if we delete references to
- %% Strings or Jids in any of the sets there will be
- %% no live references for the GC to find.
- S#state{pres_a=NewA,
- pres_i=NewI,
- pres_f=NewF,
- pres_t=NewT}.
-
-pack_jid_set(Set, Pack) ->
- Jids = ?SETS:to_list(Set),
- {PackedJids, NewPack} = pack_jids(Jids, Pack, []),
- {?SETS:from_list(PackedJids), NewPack}.
-
-pack_jids([], Pack, Acc) -> {Acc, Pack};
-pack_jids([{U,S,R}=Jid | Jids], Pack, Acc) ->
- case gb_trees:lookup(Jid, Pack) of
- {value, PackedJid} ->
- pack_jids(Jids, Pack, [PackedJid | Acc]);
- none ->
- {NewU, Pack1} = pack_string(U, Pack),
- {NewS, Pack2} = pack_string(S, Pack1),
- {NewR, Pack3} = pack_string(R, Pack2),
- NewJid = {NewU, NewS, NewR},
- NewPack = gb_trees:insert(NewJid, NewJid, Pack3),
- pack_jids(Jids, NewPack, [NewJid | Acc])
- end.
-
-pack_string(String, Pack) ->
- case gb_trees:lookup(String, Pack) of
- {value, PackedString} ->
- {PackedString, Pack};
- none ->
- {String, gb_trees:insert(String, String, Pack)}
- end.
diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl
index 317798862..07e2a44c6 100644
--- a/src/ejabberd_captcha.erl
+++ b/src/ejabberd_captcha.erl
@@ -38,6 +38,8 @@
-export([create_captcha/6, build_captcha_html/2, check_captcha/2,
process_reply/1, process/2, is_feature_available/0]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("jlib.hrl").
-include("ejabberd.hrl").
-include("web/ejabberd_http.hrl").
@@ -72,12 +74,11 @@ start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
create_captcha(Id, SID, From, To, Lang, Args)
- when is_list(Id), is_list(Lang), is_list(SID),
- is_record(From, jid), is_record(To, jid) ->
+ when is_list(Id), is_list(SID) ->
case create_image() of
{ok, Type, Key, Image} ->
B64Image = jlib:encode_base64(binary_to_list(Image)),
- JID = jlib:jid_to_string(From),
+ JID = exmpp_jid:to_list(From),
CID = "sha1+" ++ sha:sha(Image) ++ "@bob.xmpp.org",
Data = {xmlelement, "data",
[{"xmlns", ?NS_BOB}, {"cid", CID},
@@ -85,9 +86,10 @@ create_captcha(Id, SID, From, To, Lang, Args)
[{xmlcdata, B64Image}]},
Captcha =
{xmlelement, "captcha", [{"xmlns", ?NS_CAPTCHA}],
- [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}],
+ %% ?NS_DATA_FORMS is 'jabber:x:data'
+ [{xmlelement, "x", [{"xmlns", "jabber:x:data"}, {"type", "form"}],
[?VFIELD("hidden", "FORM_TYPE", {xmlcdata, ?NS_CAPTCHA}),
- ?VFIELD("hidden", "from", {xmlcdata, jlib:jid_to_string(To)}),
+ ?VFIELD("hidden", "from", {xmlcdata, exmpp_jid:to_list(To)}),
?VFIELD("hidden", "challenge", {xmlcdata, Id}),
?VFIELD("hidden", "sid", {xmlcdata, SID}),
{xmlelement, "field", [{"var", "ocr"}, {"label", ?CAPTCHA_TEXT(Lang)}],
@@ -165,12 +167,14 @@ check_captcha(Id, ProvidedKey) ->
captcha_not_found
end).
-
-process_reply({xmlelement, "captcha", _, _} = El) ->
- case xml:get_subtag(El, "x") of
- false ->
+process_reply(El) ->
+ case {exmpp_xml:element_matches(El, captcha),
+ exmpp_xml:get_element(El, x)} of
+ {false, _} ->
{error, malformed};
- Xdata ->
+ {_, undefined} ->
+ {error, malformed};
+ {true, Xdata} ->
Fields = jlib:parse_xdata_submit(Xdata),
case {proplists:get_value("challenge", Fields),
proplists:get_value("ocr", Fields)} of
@@ -192,9 +196,7 @@ process_reply({xmlelement, "captcha", _, _} = El) ->
_ ->
{error, malformed}
end
- end;
-process_reply(_) ->
- {error, malformed}.
+ end.
process(_Handlers, #request{method='GET', lang=Lang, path=[_, Id]}) ->
@@ -244,7 +246,6 @@ process(_Handlers, #request{method='POST', q=Q, lang=Lang, path=[_, Id]}) ->
process(_Handlers, _Request) ->
ejabberd_web:error(not_found).
-
%%====================================================================
%% gen_server callbacks
%%====================================================================
diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl
index b3e9bd692..0be1edcb6 100644
--- a/src/ejabberd_commands.erl
+++ b/src/ejabberd_commands.erl
@@ -396,7 +396,7 @@ get_md5(AccountPass) ->
check_access(Access, User, Server) ->
%% Check this user has access permission
- case acl:match_rule(Server, Access, jlib:make_jid(User, Server, "")) of
+ case acl:match_rule(Server, Access, exmpp_jid:make(User, Server, "")) of
allow -> true;
deny -> false
end.
diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl
index 4e4f776ab..c980da477 100644
--- a/src/ejabberd_config.erl
+++ b/src/ejabberd_config.erl
@@ -160,13 +160,14 @@ normalize_hosts(Hosts) ->
normalize_hosts([], PrepHosts) ->
lists:reverse(PrepHosts);
normalize_hosts([Host|Hosts], PrepHosts) ->
- case jlib:nodeprep(Host) of
- error ->
+ try
+ PrepHost = exmpp_stringprep:nodeprep(Host),
+ normalize_hosts(Hosts, [PrepHost|PrepHosts])
+ catch
+ _ ->
?ERROR_MSG("Can't load config file: "
"invalid host name [~p]", [Host]),
- exit("invalid hostname");
- PrepHost ->
- normalize_hosts(Hosts, [PrepHost|PrepHosts])
+ exit("invalid hostname")
end.
@@ -377,12 +378,12 @@ process_term(Term, State) ->
add_option(watchdog_large_heap, LH, State);
{registration_timeout, Timeout} ->
add_option(registration_timeout, Timeout, State);
+ {ejabberdctl_access_commands, ACs} ->
+ add_option(ejabberdctl_access_commands, ACs, State);
{captcha_cmd, Cmd} ->
add_option(captcha_cmd, Cmd, State);
{captcha_host, Host} ->
add_option(captcha_host, Host, State);
- {ejabberdctl_access_commands, ACs} ->
- add_option(ejabberdctl_access_commands, ACs, State);
{loglevel, Loglevel} ->
ejabberd_loglevel:set(Loglevel),
State;
diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl
index 7919986ae..9e398f8c3 100644
--- a/src/ejabberd_ctl.erl
+++ b/src/ejabberd_ctl.erl
@@ -277,7 +277,7 @@ try_call_command(Args, Auth, AccessCommands) ->
%% @spec (Args::[string()], Auth, AccessCommands) -> string() | integer() | {string(), integer()} | {error, ErrorType}
call_command([CmdString | Args], Auth, AccessCommands) ->
- {ok, CmdStringU, _} = regexp:gsub(CmdString, "-", "_"),
+ CmdStringU = re:replace(CmdString, "-", "_", [global,{return,list}]),
Command = list_to_atom(CmdStringU),
case ejabberd_commands:get_command_format(Command) of
{error, command_unknown} ->
@@ -673,13 +673,13 @@ filter_commands(All, SubString) ->
end.
filter_commands_regexp(All, Glob) ->
- RegExp = regexp:sh_to_awk(Glob),
+ RegExp = xmerl_regexp:sh_to_awk(Glob),
lists:filter(
fun(Command) ->
- case regexp:first_match(Command, RegExp) of
- {match, _, _} ->
+ case re:run(Command, RegExp, [{capture, none}]) of
+ match ->
true;
- _ ->
+ nomatch ->
false
end
end,
diff --git a/src/ejabberd_frontend_socket.erl b/src/ejabberd_frontend_socket.erl
index b0cdec71f..b8a36f3b0 100644
--- a/src/ejabberd_frontend_socket.erl
+++ b/src/ejabberd_frontend_socket.erl
@@ -95,8 +95,7 @@ start(Module, SockMod, Socket, Opts) ->
end.
starttls(FsmRef, _TLSOpts) ->
- %% TODO: Frontend improvements planned by Aleksey
- %%gen_server:call(FsmRef, {starttls, TLSOpts}),
+ %gen_server:call(FsmRef, {starttls, TLSOpts}),
FsmRef.
starttls(FsmRef, TLSOpts, Data) ->
@@ -139,8 +138,7 @@ sockname(FsmRef) ->
gen_server:call(FsmRef, sockname).
peername(_FsmRef) ->
- %% TODO: Frontend improvements planned by Aleksey
- %%gen_server:call(FsmRef, peername).
+ %gen_server:call(FsmRef, peername).
{ok, {{0, 0, 0, 0}, 0}}.
diff --git a/src/ejabberd_hooks.erl b/src/ejabberd_hooks.erl
index bb71f14e1..0f3782f52 100644
--- a/src/ejabberd_hooks.erl
+++ b/src/ejabberd_hooks.erl
@@ -81,7 +81,8 @@ add(Hook, Host, Function, Seq) when is_function(Function) ->
add(Hook, Module, Function, Seq) ->
add(Hook, global, Module, Function, Seq).
-add(Hook, Host, Module, Function, Seq) ->
+add(Hook, Host, Module, Function, Seq)
+ when is_binary(Host) orelse is_atom(Host) ->
gen_server:call(ejabberd_hooks, {add, Hook, Host, Module, Function, Seq}).
add_dist(Hook, Node, Module, Function, Seq) ->
@@ -104,7 +105,8 @@ delete(Hook, Host, Function, Seq) when is_function(Function) ->
delete(Hook, Module, Function, Seq) ->
delete(Hook, global, Module, Function, Seq).
-delete(Hook, Host, Module, Function, Seq) ->
+delete(Hook, Host, Module, Function, Seq)
+ when is_binary(Host) orelse is_atom(Host) ->
gen_server:call(ejabberd_hooks, {delete, Hook, Host, Module, Function, Seq}).
delete_dist(Hook, Node, Module, Function, Seq) ->
@@ -119,7 +121,7 @@ delete_dist(Hook, Host, Node, Module, Function, Seq) ->
run(Hook, Args) ->
run(Hook, global, Args).
-run(Hook, Host, Args) ->
+run(Hook, Host, Args) when is_binary(Host) orelse is_atom(Host) ->
case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
run1(Ls, Hook, Args);
@@ -136,7 +138,7 @@ run(Hook, Host, Args) ->
run_fold(Hook, Val, Args) ->
run_fold(Hook, global, Val, Args).
-run_fold(Hook, Host, Val, Args) ->
+run_fold(Hook, Host, Val, Args) when is_binary(Host) orelse is_atom(Host) ->
case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
run_fold1(Ls, Hook, Val, Args);
diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl
index b0af736c0..d45b68205 100644
--- a/src/ejabberd_local.erl
+++ b/src/ejabberd_local.erl
@@ -48,8 +48,9 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(state, {}).
@@ -60,6 +61,13 @@
%% This value is used in SIP and Megaco for a transaction lifetime.
-define(IQ_TIMEOUT, 32000).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_CLIENT).
+-define(PREFIXED_NS, [
+ {?NS_XMPP, ?NS_XMPP_pfx}, {?NS_DIALBACK, ?NS_DIALBACK_pfx}
+]).
+
%%====================================================================
%% API
%%====================================================================
@@ -71,33 +79,31 @@ 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 exmpp_iq:xmlel_to_iq(Packet) of
+ #iq{kind = request, ns = XMLNS} = IQ_Rec ->
+ Host = exmpp_jid:prep_domain(To),
case ets:lookup(?IQTABLE, {XMLNS, Host}) of
[{_, Module, Function}] ->
- ResIQ = Module:Function(From, To, IQ),
+ ResIQ = Module:Function(From, To, IQ_Rec),
if
ResIQ /= ignore ->
- ejabberd_router:route(
- To, From, jlib:iq_to_xml(ResIQ));
+ Reply = exmpp_iq:iq_to_xmlel(ResIQ, To, From),
+ ejabberd_router:route(To, From, Reply);
true ->
ok
end;
[{_, Module, Function, Opts}] ->
gen_iq_handler:handle(Host, Module, Function, Opts,
- From, To, IQ);
+ From, To, IQ_Rec);
[] ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
+ Err = exmpp_iq:error(Packet, '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);
+ #iq{kind = response} = IQReply ->
+ %%IQReply = jlib:iq_query_or_response_info(IQ_Rec),
+ process_iq_reply(From, To, IQReply);
_ ->
- Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST),
+ Err = exmpp_iq:error(Packet, 'bad-request'),
ejabberd_router:route(To, From, Err),
ok
end.
@@ -113,7 +119,17 @@ process_iq_reply(From, To, #iq{id = ID} = IQ) ->
_ ->
nothing
end.
-
+
+route(FromOld, ToOld, #xmlelement{} = PacketOld) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nLOCAL: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ route(From, To, Packet);
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -125,12 +141,12 @@ route(From, To, Packet) ->
route_iq(From, To, #iq{type = Type} = IQ, F) when is_function(F) ->
Packet = if Type == set; Type == get ->
- ID = randoms:get_string(),
- Host = From#jid.lserver,
+ ID = list_to_binary(randoms:get_string()),
+ Host = exmpp_jid:prep_domain(From),
register_iq_response_handler(Host, ID, undefined, F),
- jlib:iq_to_xml(IQ#iq{id = ID});
+ exmpp_iq:iq_to_xmlel(IQ#iq{id = ID});
true ->
- jlib:iq_to_xml(IQ)
+ exmpp_iq:iq_to_xmlel(IQ)
end,
ejabberd_router:route(From, To, Packet).
@@ -158,7 +174,7 @@ refresh_iq_handlers() ->
ejabberd_local ! refresh_iq_handlers.
bounce_resource_packet(From, To, Packet) ->
- Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND),
+ Err = exmpp_stanza:reply_with_error(Packet, 'item-not-found'),
ejabberd_router:route(To, From, Err),
stop.
@@ -177,7 +193,7 @@ init([]) ->
lists:foreach(
fun(Host) ->
ejabberd_router:register_route(Host, {apply, ?MODULE, route}),
- ejabberd_hooks:add(local_send_to_resource_hook, Host,
+ ejabberd_hooks:add(local_send_to_resource_hook, list_to_binary(Host),
?MODULE, bounce_resource_packet, 100)
end, ?MYHOSTS),
catch ets:new(?IQTABLE, [named_table, public]),
@@ -216,6 +232,16 @@ handle_cast(_Msg, State) ->
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
+handle_info({route, FromOld, ToOld, #xmlelement{} = PacketOld}, State) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nLOCAL: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ handle_info({route, From, To, Packet}, State);
handle_info({route, From, To, Packet}, State) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -285,29 +311,30 @@ code_change(_OldVsn, State, _Extra) ->
do_route(From, To, Packet) ->
?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
[From, To, Packet, 8]),
+
+ LNode = exmpp_jid:prep_node(To),
+ LResource = exmpp_jid:prep_resource(To),
if
- To#jid.luser /= "" ->
+ LNode /= undefined ->
ejabberd_sm:route(From, To, Packet);
- To#jid.lresource == "" ->
- {xmlelement, Name, _Attrs, _Els} = Packet,
- case Name of
- "iq" ->
+ LResource == undefined ->
+ case Packet of
+ _ when ?IS_IQ(Packet) ->
process_iq(From, To, Packet);
- "message" ->
+ _ when ?IS_MESSAGE(Packet) ->
ok;
- "presence" ->
+ _ when ?IS_PRESENCE(Packet) ->
ok;
_ ->
ok
end;
true ->
- {xmlelement, _Name, Attrs, _Els} = Packet,
- case xml:get_attr_s("type", Attrs) of
- "error" -> ok;
- "result" -> ok;
+ case exmpp_stanza:get_type(Packet) of
+ <<"error">> -> ok;
+ <<"result">> -> ok;
_ ->
ejabberd_hooks:run(local_send_to_resource_hook,
- To#jid.lserver,
+ exmpp_jid:prep_domain(To),
[From, To, Packet])
end
end.
diff --git a/src/ejabberd_piefxis.erl b/src/ejabberd_piefxis.erl
index 4cc391fb8..ea66f529a 100644
--- a/src/ejabberd_piefxis.erl
+++ b/src/ejabberd_piefxis.erl
@@ -25,7 +25,6 @@
%%%----------------------------------------------------------------------
%%% Not implemented:
-%%% - write mod_piefxis with ejabberdctl commands
%%% - Export from mod_offline_odbc.erl
%%% - Export from mod_private_odbc.erl
%%% - XEP-227: 6. Security Considerations
@@ -41,42 +40,8 @@
-record(parsing_state, {parser, host, dir}).
-include("ejabberd.hrl").
-
-%%-include_lib("exmpp/include/exmpp.hrl").
-%%-include_lib("exmpp/include/exmpp_client.hrl").
-%% Copied from exmpp header files:
--define(NS_ROSTER, "jabber:iq:roster").
--define(NS_VCARD, "vcard-temp").
--record(xmlcdata, {
- cdata = <<>>
- }).
--record(xmlattr, {
- ns = undefined,
- name,
- value
- }).
--record(xmlel, {
- ns = undefined,
- declared_ns = [],
- name,
- attrs = [],
- children = []
- }).
--record(iq, {
- kind,
- type,
- id,
- ns,
- payload,
- error,
- lang,
- iq_ns
- }).
--record(xmlendtag, {
- ns = undefined,
- name
- }).
-
+-include_lib("exmpp/include/exmpp.hrl").
+-include_lib("exmpp/include/exmpp_client.hrl").
%% Copied from mod_private.erl
-record(private_storage, {usns, xml}).
@@ -96,7 +61,6 @@
%%%% Import file
import_file(FileName) ->
- _ = #xmlattr{}, %% this stupid line is only to prevent compilation warning about "recod xmlattr is unused"
import_file(FileName, 2).
import_file(FileName, RootDepth) ->
@@ -159,7 +123,7 @@ process_element(El=#xmlel{name=user, ns=_XMLNS},
State;
process_element(H=#xmlel{name=host},State) ->
- State#parsing_state{host=?BTL(exmpp_xml:get_attribute(H,"jid",none))};
+ State#parsing_state{host=exmpp_xml:get_attribute(H,"jid",none)};
process_element(#xmlel{name='server-data'},State) ->
State;
@@ -196,7 +160,7 @@ process_element(El,State) ->
add_user(El, Domain) ->
User = exmpp_xml:get_attribute(El,name,none),
Password = exmpp_xml:get_attribute(El,password,none),
- add_user(El, Domain, ?BTL(User), ?BTL(Password)).
+ add_user(El, Domain, User, Password).
%% @spec (El::xmlel(), Domain::string(), User::string(), Password::string())
%% -> ok | {atomic, exists} | {error, not_allowed}
@@ -228,7 +192,7 @@ add_user(El, Domain, User, Password) ->
%% -> ok | {atomic, exists} | {error, not_allowed}
%% @doc Create a new user
create_user(User,Password,Domain) ->
- case ejabberd_auth:try_register(User,Domain,Password) of
+ case ejabberd_auth:try_register(?BTL(User),?BTL(Domain),?BTL(Password)) of
{atomic,ok} -> ok;
{atomic, exists} -> {atomic, exists};
{error, not_allowed} -> {error, not_allowed};
@@ -265,7 +229,7 @@ populate_user(User,Domain,El=#xmlel{name='query', ns='jabber:iq:roster'}) ->
io:format("Trying to add/update roster list...",[]),
case loaded_module(Domain,[mod_roster_odbc,mod_roster]) of
{ok, M} ->
- case M:set_items(User, Domain, exmpp_xml:xmlel_to_xmlelement(El)) of
+ case M:set_items(User, Domain, El) of
{atomic, ok} ->
io:format(" DONE.~n",[]),
ok;
@@ -305,8 +269,8 @@ populate_user(User,Domain,El=#xmlel{name='query', ns='jabber:iq:roster'}) ->
populate_user(User,Domain,El=#xmlel{name='vCard', ns='vcard-temp'}) ->
io:format("Trying to add/update vCards...",[]),
case loaded_module(Domain,[mod_vcard,mod_vcard_odbc]) of
- {ok, M} -> FullUser = jid_to_old_jid(exmpp_jid:make(User, Domain)),
- IQ = iq_to_old_iq(#iq{type = set, payload = El}),
+ {ok, M} -> FullUser = exmpp_jid:make(User, Domain),
+ IQ = #iq{type = set, payload = El},
case M:process_sm_iq(FullUser, FullUser , IQ) of
{error,_Err} ->
io:format(" ERROR.~n",[]),
@@ -337,11 +301,9 @@ populate_user(User,Domain,El=#xmlel{name='offline-messages'}) ->
ok;
(_Element, Child) ->
From = exmpp_xml:get_attribute(Child,from,none),
- FullFrom = jid_to_old_jid(exmpp_jid:parse(From)),
- FullUser = jid_to_old_jid(exmpp_jid:make(User,
- Domain)),
- OldChild = exmpp_xml:xmlel_to_xmlelement(Child),
- _R = M:store_packet(FullFrom, FullUser, OldChild)
+ FullFrom = exmpp_jid:parse(From),
+ FullUser = exmpp_jid:make(User, Domain),
+ _R = M:store_packet(FullFrom, FullUser, Child)
end, El), io:format(" DONE.~n",[]);
_ ->
io:format(" ERROR.~n",[]),
@@ -360,12 +322,12 @@ populate_user(User,Domain,El=#xmlel{name='query', ns='jabber:iq:private'}) ->
io:format("Trying to add/update private storage...",[]),
case loaded_module(Domain,[mod_private_odbc,mod_private]) of
{ok, M} ->
- FullUser = jid_to_old_jid(exmpp_jid:make(User, Domain)),
- IQ = iq_to_old_iq(#iq{type = set,
- ns = 'jabber:iq:private',
- kind = request,
- iq_ns = 'jabberd:client',
- payload = El}),
+ FullUser = exmpp_jid:make(User, Domain),
+ IQ = #iq{type = set,
+ ns = 'jabber:iq:private',
+ kind = request,
+ iq_ns = 'jabberd:client',
+ payload = El},
case M:process_sm_iq(FullUser, FullUser, IQ ) of
{error, _Err} ->
io:format(" ERROR.~n",[]),
@@ -375,7 +337,7 @@ populate_user(User,Domain,El=#xmlel{name='query', ns='jabber:iq:private'}) ->
end;
_ ->
io:format(" ERROR.~n",[]),
- ?ERROR_MSG("No modules loaded [mod_private, mod_private_odbc] ~s ~n",
+ ?ERROR_MSG("No modules loaded [mod_private, mod_private_odbc] ~s~n",
[exmpp_xml:document_to_list(El)]),
{error, not_found}
end;
@@ -389,6 +351,8 @@ populate_user(_User, _Domain, _El) ->
%%%==================================
%%%% Utilities
+loaded_module(Domain,Options) when is_binary(Domain) ->
+ loaded_module(?BTL(Domain),Options);
loaded_module(Domain,Options) ->
LoadedModules = gen_mod:loaded_modules(Domain),
case lists:filter(fun(Module) ->
@@ -398,30 +362,12 @@ loaded_module(Domain,Options) ->
[] -> {error,not_found}
end.
-jid_to_old_jid(Jid) ->
- {jid, to_list(exmpp_jid:node_as_list(Jid)),
- to_list(exmpp_jid:domain_as_list(Jid)),
- to_list(exmpp_jid:resource_as_list(Jid)),
- to_list(exmpp_jid:prep_node_as_list(Jid)),
- to_list(exmpp_jid:prep_domain_as_list(Jid)),
- to_list(exmpp_jid:prep_resource_as_list(Jid))}.
-
-iq_to_old_iq(#iq{id = ID, type = Type, lang = Lang, ns= NS, payload = El }) ->
- {iq, to_list(ID), Type, to_list(NS), to_list(Lang),
- exmpp_xml:xmlel_to_xmlelement(El)}.
-
-to_list(L) when is_list(L) -> L;
-to_list(B) when is_binary(B) -> binary_to_list(B);
-to_list(undefined) -> "";
-to_list(B) when is_atom(B) -> atom_to_list(B).
-
%%%==================================
%%%% Export server
%% @spec (Dir::string()) -> ok
export_server(Dir) ->
- try_start_exmpp(),
FnT = make_filename_template(),
DFn = make_main_basefilename(Dir, FnT),
@@ -447,7 +393,6 @@ export_server(Dir) ->
%% @spec (Dir::string(), Host::string()) -> ok
export_host(Dir, Host) ->
- try_start_exmpp(),
FnT = make_filename_template(),
FnH = make_host_filename(FnT, Host),
export_host(Dir, FnH, Host).
@@ -525,16 +470,13 @@ extract_user(Username, Host) ->
extract_user_info(roster, Username, Host) ->
case loaded_module(Host,[mod_roster_odbc,mod_roster]) of
{ok, M} ->
- From = To = jlib:make_jid(Username, Host, ""),
- SubelGet = {xmlelement, "query", [{"xmlns",?NS_ROSTER}], []},
- %%IQGet = #iq{type=get, xmlns=?NS_ROSTER, payload=SubelGet}, % this is for 3.0.0 version
- IQGet = {iq, "", get, ?NS_ROSTER, "" , SubelGet},
+ From = To = exmpp_jid:make(Username, Host, ""),
+ SubelGet = exmpp_xml:element(?NS_ROSTER, 'query', [], []),
+ IQGet = #iq{type=get, ns=?NS_ROSTER, payload=[SubelGet]},
Res = M:process_local_iq(From, To, IQGet),
- %%[El] = Res#iq.payload, % this is for 3.0.0 version
- {iq, _, result, _, _, Els} = Res,
- case Els of
- [El] -> exmpp_xml:document_to_list(El);
- [] -> ""
+ case Res#iq.payload of
+ undefined -> "";
+ El -> exmpp_xml:document_to_list(El)
end;
_E ->
""
@@ -569,16 +511,13 @@ extract_user_info(private, Username, Host) ->
extract_user_info(vcard, Username, Host) ->
case loaded_module(Host,[mod_vcard, mod_vcard_odbc, mod_vcard_odbc]) of
{ok, M} ->
- From = To = jlib:make_jid(Username, Host, ""),
- SubelGet = {xmlelement, "vCard", [{"xmlns",?NS_VCARD}], []},
- %%IQGet = #iq{type=get, xmlns=?NS_VCARD, payload=SubelGet}, % this is for 3.0.0 version
- IQGet = {iq, "", get, ?NS_VCARD, "" , SubelGet},
+ From = To = exmpp_jid:make(Username, Host, ""),
+ SubelGet = exmpp_xml:element(?NS_VCARD, 'vCard', [], []),
+ IQGet = #iq{type=get, ns=?NS_VCARD, payload=[SubelGet]},
Res = M:process_sm_iq(From, To, IQGet),
- %%[El] = Res#iq.payload, % this is for 3.0.0 version
- {iq, _, result, _, _, Els} = Res,
- case Els of
- [El] -> exmpp_xml:document_to_list(El);
- [] -> ""
+ case Res#iq.payload of
+ undefined -> "";
+ El -> exmpp_xml:document_to_list(El)
end;
_E ->
""
@@ -590,49 +529,63 @@ extract_user_info(vcard, Username, Host) ->
%% Copied from mod_offline.erl and customized
-record(offline_msg, {us, timestamp, expire, from, to, packet}).
mnesia_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,
- FromString = jlib:jid_to_string(R#offline_msg.from),
- Attrs2 = lists:keystore("from", 1, Attrs, {"from", FromString}),
- Attrs3 = lists:keystore("xmlns", 1, Attrs2, {"xmlns", "jabber:client"}),
- {xmlelement, Name, Attrs3,
- Els ++
- [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)));
+ try
+ LUser = User,
+ LServer = 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) ->
+ Packet = R#offline_msg.packet,
+ FromString = exmpp_jid:prep_to_list(R#offline_msg.from),
+ Packet2 = exmpp_xml:set_attribute(Packet, "from", FromString),
+ Packet3 = Packet2#xmlel{ns = ?NS_JABBER_CLIENT},
+ exmpp_xml:append_children(
+ Packet3,
+ [jlib:timestamp_to_xml(
+ calendar:now_to_universal_time(
+ R#offline_msg.timestamp),
+ utc,
+ exmpp_jid:make("", 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
+ catch
_ ->
Ls
end.
+
%%%==================================
%%%% Interface with ejabberd private storage
get_user_private_mnesia(Username, Host) ->
ListNsEl = mnesia:dirty_select(private_storage,
- [{#private_storage{usns={Username, Host, '$1'}, xml = '$2'},
+ [{#private_storage{usns={?LTB(Username), ?LTB(Host), '$1'}, xml = '$2'},
[], ['$$']}]),
Els = [exmpp_xml:document_to_list(El) || [_Ns, El] <- ListNsEl],
case lists:flatten(Els) of
diff --git a/src/ejabberd_rdbms.erl b/src/ejabberd_rdbms.erl
index 32f295a0e..2496e56a5 100644
--- a/src/ejabberd_rdbms.erl
+++ b/src/ejabberd_rdbms.erl
@@ -70,9 +70,14 @@ start_odbc(Host) ->
%% Returns true if we have configured odbc_server for the given host
needs_odbc(Host) ->
- LHost = jlib:nameprep(Host),
- case ejabberd_config:get_local_option({odbc_server, LHost}) of
- undefined ->
- false;
- _ -> true
+ try
+ LHost = exmpp_stringprep:nameprep(Host),
+ case ejabberd_config:get_local_option({odbc_server, LHost}) of
+ undefined ->
+ false;
+ _ -> true
+ end
+ catch
+ _ ->
+ false
end.
diff --git a/src/ejabberd_receiver.erl b/src/ejabberd_receiver.erl
index 5a7a3bf73..6cfc3ae36 100644
--- a/src/ejabberd_receiver.erl
+++ b/src/ejabberd_receiver.erl
@@ -132,47 +132,40 @@ init([Socket, SockMod, Shaper, MaxStanzaSize]) ->
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
-handle_call({starttls, TLSSocket}, _From,
- #state{xml_stream_state = XMLStreamState,
- c2s_pid = C2SPid,
- max_stanza_size = MaxStanzaSize} = State) ->
- close_stream(XMLStreamState),
- NewXMLStreamState = xml_stream:new(C2SPid, MaxStanzaSize),
+handle_call({starttls, TLSSocket}, _From, State) ->
+ NewXMLStreamState = do_reset_stream(State),
NewState = State#state{socket = TLSSocket,
sock_mod = tls,
xml_stream_state = NewXMLStreamState},
case tls:recv_data(TLSSocket, "") of
{ok, TLSData} ->
- {reply, ok, process_data(TLSData, NewState), ?HIBERNATE_TIMEOUT};
+ {NextState, Hib} = process_data(TLSData, NewState),
+ {reply, ok, NextState, Hib};
{error, _Reason} ->
{stop, normal, ok, NewState}
end;
handle_call({compress, ZlibSocket}, _From,
- #state{xml_stream_state = XMLStreamState,
- c2s_pid = C2SPid,
- max_stanza_size = MaxStanzaSize} = State) ->
- close_stream(XMLStreamState),
- NewXMLStreamState = xml_stream:new(C2SPid, MaxStanzaSize),
+ #state{xml_stream_state = XMLStreamState} = State) ->
+ NewXMLStreamState = exmpp_xmlstream:reset(XMLStreamState),
NewState = State#state{socket = ZlibSocket,
sock_mod = ejabberd_zlib,
xml_stream_state = NewXMLStreamState},
case ejabberd_zlib:recv_data(ZlibSocket, "") of
{ok, ZlibData} ->
- {reply, ok, process_data(ZlibData, NewState), ?HIBERNATE_TIMEOUT};
+ {NextState, Hib} = process_data(ZlibData, NewState),
+ {reply, ok, NextState, Hib};
{error, _Reason} ->
{stop, normal, ok, NewState}
end;
handle_call(reset_stream, _From,
- #state{xml_stream_state = XMLStreamState,
- c2s_pid = C2SPid,
- max_stanza_size = MaxStanzaSize} = State) ->
- close_stream(XMLStreamState),
- NewXMLStreamState = xml_stream:new(C2SPid, MaxStanzaSize),
+ #state{xml_stream_state = XMLStreamState} = State) ->
+ NewXMLStreamState = exmpp_xmlstream:reset(XMLStreamState),
Reply = ok,
{reply, Reply, State#state{xml_stream_state = NewXMLStreamState},
?HIBERNATE_TIMEOUT};
handle_call({become_controller, C2SPid}, _From, State) ->
- XMLStreamState = xml_stream:new(C2SPid, State#state.max_stanza_size),
+ close_stream(State#state.xml_stream_state),
+ XMLStreamState = new_xmlstream(C2SPid, State#state.max_stanza_size),
NewState = State#state{c2s_pid = C2SPid,
xml_stream_state = XMLStreamState},
activate_socket(NewState),
@@ -210,21 +203,22 @@ handle_info({Tag, _TCPSocket, Data},
tls ->
case tls:recv_data(Socket, Data) of
{ok, TLSData} ->
- {noreply, process_data(TLSData, State),
- ?HIBERNATE_TIMEOUT};
+ {NextState, Hib} = process_data(TLSData, State),
+ {noreply, NextState, Hib};
{error, _Reason} ->
{stop, normal, State}
end;
ejabberd_zlib ->
case ejabberd_zlib:recv_data(Socket, Data) of
{ok, ZlibData} ->
- {noreply, process_data(ZlibData, State),
- ?HIBERNATE_TIMEOUT};
+ {NextState, Hib} = process_data(ZlibData, State),
+ {noreply, NextState, Hib};
{error, _Reason} ->
{stop, normal, State}
end;
_ ->
- {noreply, process_data(Data, State), ?HIBERNATE_TIMEOUT}
+ {NextState, Hib} = process_data(Data, State),
+ {noreply, NextState, Hib}
end;
handle_info({Tag, _TCPSocket}, State)
when (Tag == tcp_closed) or (Tag == ssl_closed) ->
@@ -241,8 +235,8 @@ handle_info({timeout, _Ref, activate}, State) ->
activate_socket(State),
{noreply, State, ?HIBERNATE_TIMEOUT};
handle_info(timeout, State) ->
- proc_lib:hibernate(gen_server, enter_loop, [?MODULE, [], State]),
- {noreply, State, ?HIBERNATE_TIMEOUT};
+ {noreply, State, hibernate};
+
handle_info(_Info, State) ->
{noreply, State, ?HIBERNATE_TIMEOUT}.
@@ -317,19 +311,23 @@ process_data(Data,
#state{xml_stream_state = XMLStreamState,
shaper_state = ShaperState,
c2s_pid = C2SPid} = State) ->
- ?DEBUG("Received XML on stream = ~p", [binary_to_list(Data)]),
- XMLStreamState1 = xml_stream:parse(XMLStreamState, Data),
+ ?DEBUG("Received XML on stream = ~p", [Data]),
+ {ok, XMLStreamState1} = exmpp_xmlstream:parse(XMLStreamState, Data),
{NewShaperState, Pause} = shaper:update(ShaperState, size(Data)),
- if
- C2SPid == undefined ->
- ok;
- Pause > 0 ->
- erlang:start_timer(Pause, self(), activate);
- true ->
- activate_socket(State)
- end,
- State#state{xml_stream_state = XMLStreamState1,
- shaper_state = NewShaperState}.
+ HibTimeout =
+ if
+ C2SPid == undefined ->
+ infinity;
+ Pause > 0 ->
+ erlang:start_timer(Pause, self(), activate),
+ hibernate;
+
+ true ->
+ activate_socket(State),
+ ?HIBERNATE_TIMEOUT
+ end,
+ {State#state{xml_stream_state = XMLStreamState1,
+ shaper_state = NewShaperState}, HibTimeout}.
%% Element coming from XML parser are wrapped inside xmlstreamelement
%% When we receive directly xmlelement tuple (from a socket module
@@ -344,4 +342,26 @@ element_wrapper(Element) ->
close_stream(undefined) ->
ok;
close_stream(XMLStreamState) ->
- xml_stream:close(XMLStreamState).
+ exmpp_xml:stop_parser(exmpp_xmlstream:get_parser(XMLStreamState)),
+ exmpp_xmlstream:stop(XMLStreamState).
+
+
+do_reset_stream(#state{xml_stream_state = undefined, c2s_pid = C2SPid, max_stanza_size = MaxStanzaSize}) ->
+ new_xmlstream(C2SPid, MaxStanzaSize);
+
+do_reset_stream(#state{xml_stream_state = XMLStreamState}) ->
+ exmpp_xmlstream:reset(XMLStreamState).
+
+
+new_xmlstream(C2SPid, MaxStanzaSize) ->
+ Parser = exmpp_xml:start_parser([
+ {names_as_atom, true},
+ {check_nss, xmpp},
+ {check_elems, xmpp},
+ {check_attrs, xmpp},
+ {max_size, MaxStanzaSize}
+ ]),
+ exmpp_xmlstream:start(
+ {gen_fsm, C2SPid}, Parser,
+ [{xmlstreamstart, new}]
+ ).
diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl
index 023048090..696a55970 100644
--- a/src/ejabberd_router.erl
+++ b/src/ejabberd_router.erl
@@ -46,8 +46,9 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(route, {domain, pid, local_hint}).
-record(state, {}).
@@ -63,6 +64,16 @@ start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+route(FromOld, ToOld, #xmlelement{} = PacketOld) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nROUTER: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ route(From, To, Packet);
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -76,51 +87,53 @@ 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:read({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
+ try
+ LDomain = exmpp_stringprep:nameprep(Domain),
+ LDomainB = list_to_binary(LDomain),
+ Pid = self(),
+ case get_component_number(LDomain) of
+ undefined ->
+ F = fun() ->
+ mnesia:write(#route{domain = LDomainB,
+ pid = Pid,
+ local_hint = LocalHint})
+ end,
+ mnesia:transaction(F);
+ N ->
+ F = fun() ->
+ case mnesia:read({route, LDomainB}) of
+ [] ->
+ mnesia:write(
+ #route{domain = LDomainB,
+ pid = Pid,
+ local_hint = 1}),
+ lists:foreach(
+ fun(I) ->
+ mnesia:write(
+ #route{domain = LDomainB,
+ 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 = LDomainB,
+ pid = Pid,
+ local_hint = I}),
+ mnesia:delete_object(R),
+ true;
+ (_) ->
+ false
+ end, Rs)
+ end
+ end,
+ mnesia:transaction(F)
+ end
+ catch
+ _ ->
+ erlang:error({invalid_domain, Domain})
end.
register_routes(Domains) ->
@@ -129,43 +142,45 @@ register_routes(Domains) ->
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
+ try
+ LDomain = exmpp_stringprep:nameprep(Domain),
+ LDomainB = list_to_binary(LDomain),
+ Pid = self(),
+ case get_component_number(LDomain) of
+ undefined ->
+ F = fun() ->
+ case mnesia:match_object(
+ #route{domain = LDomainB,
+ pid = Pid,
+ _ = '_'}) of
+ [R] ->
+ mnesia:delete_object(R);
+ _ ->
+ ok
+ end
+ end,
+ mnesia:transaction(F);
+ _ ->
+ F = fun() ->
+ case mnesia:match_object(#route{domain=LDomainB,
+ pid = Pid,
+ _ = '_'}) of
+ [R] ->
+ I = R#route.local_hint,
+ mnesia:write(
+ #route{domain = LDomainB,
+ pid = undefined,
+ local_hint = I}),
+ mnesia:delete_object(R);
+ _ ->
+ ok
+ end
+ end,
+ mnesia:transaction(F)
+ end
+ catch
+ _ ->
+ erlang:error({invalid_domain, Domain})
end.
unregister_routes(Domains) ->
@@ -175,10 +190,14 @@ unregister_routes(Domains) ->
dirty_get_all_routes() ->
- lists:usort(mnesia:dirty_all_keys(route)) -- ?MYHOSTS.
+ lists:usort(
+ lists:map(fun erlang:binary_to_list/1,
+ mnesia:dirty_all_keys(route))) -- ?MYHOSTS.
dirty_get_all_domains() ->
- lists:usort(mnesia:dirty_all_keys(route)).
+ lists:usort(
+ lists:map(fun erlang:binary_to_list/1,
+ mnesia:dirty_all_keys(route))).
%%====================================================================
@@ -236,6 +255,16 @@ handle_cast(_Msg, State) ->
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
+handle_info({route, FromOld, ToOld, #xmlelement{} = PacketOld}, State) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nROUTER: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ handle_info({route, From, To, Packet}, State);
handle_info({route, From, To, Packet}, State) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -303,8 +332,8 @@ do_route(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
+ LDomain = exmpp_jid:prep_domain(To),
+ case mnesia:dirty_read(route, LDomain) of
[] ->
ejabberd_s2s:route(From, To, Packet);
[R] ->
@@ -323,18 +352,17 @@ do_route(OrigFrom, OrigTo, OrigPacket) ->
drop
end;
Rs ->
+ LDstDomain = exmpp_jid:prep_domain_as_list(To),
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);
+ source -> jlib:short_prepd_jid(From);
+ destination -> jlib:short_prepd_jid(To);
bare_source ->
- jlib:jid_remove_resource(
- jlib:jid_tolower(From));
+ jlib:short_prepd_bare_jid(From);
bare_destination ->
- jlib:jid_remove_resource(
- jlib:jid_tolower(To))
+ jlib:short_prepd_bare_jid(To)
end,
case get_component_number(LDstDomain) of
undefined ->
@@ -401,4 +429,3 @@ update_tables() ->
false ->
ok
end.
-
diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl
index d1c6303b7..33af46f76 100644
--- a/src/ejabberd_s2s.erl
+++ b/src/ejabberd_s2s.erl
@@ -49,13 +49,21 @@
%% ejabberd API
-export([get_info_s2s_connections/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("ejabberd_commands.hrl").
-define(DEFAULT_MAX_S2S_CONNECTIONS_NUMBER, 1).
-define(DEFAULT_MAX_S2S_CONNECTIONS_NUMBER_PER_NODE, 1).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_CLIENT).
+-define(PREFIXED_NS, [
+ {?NS_XMPP, ?NS_XMPP_pfx}, {?NS_DIALBACK, ?NS_DIALBACK_pfx}
+]).
+
-record(s2s, {fromto, pid, key}).
-record(state, {}).
@@ -69,6 +77,16 @@
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+route(FromOld, ToOld, #xmlelement{} = PacketOld) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nS2S: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ route(From, To, Packet);
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -201,6 +219,16 @@ handle_cast(_Msg, State) ->
handle_info({mnesia_system_event, {mnesia_down, Node}}, State) ->
clean_table_from_bad_node(Node),
{noreply, State};
+handle_info({route, FromOld, ToOld, #xmlelement{} = PacketOld}, State) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nS2S: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ handle_info({route, From, To, Packet}, State);
handle_info({route, From, To, Packet}, State) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -253,32 +281,30 @@ do_route(From, To, Packet) ->
case find_connection(From, To) of
{atomic, Pid} when is_pid(Pid) ->
?DEBUG("sending to process ~p~n", [Pid]),
- {xmlelement, Name, Attrs, Els} = Packet,
- NewAttrs = jlib:replace_from_to_attrs(jlib:jid_to_string(From),
- jlib:jid_to_string(To),
- Attrs),
- #jid{lserver = MyServer} = From,
+ NewPacket1 = exmpp_stanza:set_sender(Packet, From),
+ NewPacket = exmpp_stanza:set_recipient(NewPacket1, To),
+ MyServer = exmpp_jid:prep_domain(From),
ejabberd_hooks:run(
s2s_send_packet,
MyServer,
- [From, To, Packet]),
- send_element(Pid, {xmlelement, Name, NewAttrs, Els}),
+ [From, To, NewPacket]),
+ send_element(Pid, NewPacket),
ok;
{aborted, _Reason} ->
- case xml:get_tag_attr_s("type", Packet) of
- "error" -> ok;
- "result" -> ok;
+ case exmpp_stanza:get_type(Packet) of
+ <<"error">> -> ok;
+ <<"result">> -> ok;
_ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_SERVICE_UNAVAILABLE),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ 'service-unavailable'),
ejabberd_router:route(To, From, Err)
end,
false
end.
find_connection(From, To) ->
- #jid{lserver = MyServer} = From,
- #jid{lserver = Server} = To,
+ MyServer = exmpp_jid:prep_domain_as_list(From),
+ Server = exmpp_jid:prep_domain_as_list(To),
FromTo = {MyServer, Server},
MaxS2SConnectionsNumber = max_s2s_connections_number(FromTo),
MaxS2SConnectionsNumberPerNode =
@@ -331,7 +357,7 @@ choose_pid(From, Pids) ->
% Use sticky connections based on the JID of the sender (whithout
% the resource to ensure that a muc room always uses the same
% connection)
- Pid = lists:nth(erlang:phash(jlib:jid_remove_resource(From), length(Pids1)),
+ Pid = lists:nth(erlang:phash(exmpp_jid:bare(From), length(Pids1)),
Pids1),
?DEBUG("Using ejabberd_s2s_out ~p~n", [Pid]),
Pid.
@@ -382,14 +408,14 @@ new_connection(MyServer, Server, From, FromTo,
max_s2s_connections_number({From, To}) ->
case acl:match_rule(
- From, max_s2s_connections, jlib:make_jid("", To, "")) of
+ From, max_s2s_connections, exmpp_jid:make(To)) of
Max when is_integer(Max) -> Max;
_ -> ?DEFAULT_MAX_S2S_CONNECTIONS_NUMBER
end.
max_s2s_connections_number_per_node({From, To}) ->
case acl:match_rule(
- From, max_s2s_connections_per_node, jlib:make_jid("", To, "")) of
+ From, max_s2s_connections_per_node, exmpp_jid:make(To)) of
Max when is_integer(Max) -> Max;
_ -> ?DEFAULT_MAX_S2S_CONNECTIONS_NUMBER_PER_NODE
end.
@@ -406,12 +432,12 @@ needed_connections_number(Ls, MaxS2SConnectionsNumber,
%% service.
%% --------------------------------------------------------------------
is_service(From, To) ->
- LFromDomain = From#jid.lserver,
+ LFromDomain = exmpp_jid:prep_domain_as_list(From),
case ejabberd_config:get_local_option({route_subdomains, LFromDomain}) of
s2s -> % bypass RFC 3920 10.3
false;
_ ->
- LDstDomain = To#jid.lserver,
+ LDstDomain = exmpp_jid:prep_domain_as_list(To),
P = fun(Domain) -> is_subdomain(LDstDomain, Domain) end,
lists:any(P, ?MYHOSTS)
end.
diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl
index 6a38ae272..5ba3ecb49 100644
--- a/src/ejabberd_s2s_in.erl
+++ b/src/ejabberd_s2s_in.erl
@@ -46,19 +46,13 @@
handle_info/3,
terminate/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
--ifdef(SSL39).
+-include("XmppAddr.hrl").
-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.
--include("XmppAddr.hrl").
-define(DICT, dict).
@@ -92,28 +86,12 @@
[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)).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_SERVER).
+-define(PREFIXED_NS, [
+ {?NS_XMPP, ?NS_XMPP_pfx}, {?NS_DIALBACK, ?NS_DIALBACK_pfx}
+]).
%%%----------------------------------------------------------------------
%%% API
@@ -174,13 +152,16 @@ init([{SockMod, Socket}, Opts]) ->
%% {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("version", Attrs) == "1.0"} of
- {"jabber:server", _, true} when
+wait_for_stream({xmlstreamstart, Opening}, StateData) ->
+ case {exmpp_stream:get_default_ns(Opening),
+ exmpp_xml:is_ns_declared_here(Opening, ?NS_DIALBACK),
+ exmpp_stream:get_version(Opening) == {1, 0}} of
+ {?NS_JABBER_SERVER, _, true} when
StateData#state.tls and (not StateData#state.authenticated) ->
- send_text(StateData, ?STREAM_HEADER(" version='1.0'")),
+ Opening_Reply = exmpp_stream:opening_reply(Opening,
+ StateData#state.streamid),
+ send_element(StateData,
+ exmpp_stream:set_dialback_support(Opening_Reply)),
SASL =
if
StateData#state.tls_enabled ->
@@ -190,10 +171,8 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
case (StateData#state.sockmod):get_verify_result(
StateData#state.socket) of
0 ->
- [{xmlelement, "mechanisms",
- [{"xmlns", ?NS_SASL}],
- [{xmlelement, "mechanism", [],
- [{xmlcdata, "EXTERNAL"}]}]}];
+ [exmpp_server_sasl:feature(
+ ["EXTERNAL"])];
_ ->
[]
end;
@@ -207,30 +186,35 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
StateData#state.tls_enabled ->
[];
true ->
- [{xmlelement, "starttls",
- [{"xmlns", ?NS_TLS}], []}]
+ [exmpp_server_tls:feature()]
end,
- send_element(StateData,
- {xmlelement, "stream:features", [],
- SASL ++ StartTLS}),
+ send_element(StateData, exmpp_stream:features(SASL ++ StartTLS)),
{next_state, wait_for_feature_request, StateData};
- {"jabber:server", _, true} when
+ {?NS_JABBER_SERVER, _, true} when
StateData#state.authenticated ->
- send_text(StateData, ?STREAM_HEADER(" version='1.0'")),
+ Opening_Reply = exmpp_stream:opening_reply(Opening,
+ StateData#state.streamid),
send_element(StateData,
- {xmlelement, "stream:features", [], []}),
+ exmpp_stream:set_dialback_support(Opening_Reply)),
+ send_element(StateData, exmpp_stream:features([])),
{next_state, stream_established, StateData};
- {"jabber:server", "jabber:server:dialback", _} ->
- send_text(StateData, ?STREAM_HEADER("")),
+ {?NS_JABBER_SERVER, true, _} ->
+ Opening_Reply = exmpp_stream:opening_reply(Opening,
+ StateData#state.streamid),
+ send_element(StateData,
+ exmpp_stream:set_dialback_support(Opening_Reply)),
{next_state, stream_established, StateData};
_ ->
- send_text(StateData, ?INVALID_NAMESPACE_ERR),
+ send_element(StateData, exmpp_stream:error('invalid-namespace')),
{stop, normal, StateData}
end;
wait_for_stream({xmlstreamerror, _}, StateData) ->
- send_text(StateData,
- ?STREAM_HEADER("") ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ Opening_Reply = exmpp_stream:opening_reply(undefined, ?NS_JABBER_SERVER,
+ "", StateData#state.streamid),
+ send_element(StateData, Opening_Reply),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
wait_for_stream(timeout, StateData) ->
@@ -241,67 +225,64 @@ wait_for_stream(closed, 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,
+ case El of
+ #xmlel{ns = ?NS_TLS, name = 'starttls'} when TLS == true,
TLSEnabled == false,
SockMod == gen_tcp ->
?DEBUG("starttls", []),
Socket = StateData#state.socket,
+ Proceed = exmpp_xml:node_to_list(
+ exmpp_server_tls:proceed(), [?DEFAULT_NS], ?PREFIXED_NS),
TLSOpts = StateData#state.tls_options,
TLSSocket = (StateData#state.sockmod):starttls(
Socket, TLSOpts,
- xml:element_to_string(
- {xmlelement, "proceed", [{"xmlns", ?NS_TLS}], []})),
+ Proceed),
{next_state, wait_for_stream,
StateData#state{socket = TLSSocket,
streamid = new_id(),
tls_enabled = true
}};
- {?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(
+ #xmlel{ns = ?NS_SASL, name = 'auth'} when TLSEnabled ->
+ case exmpp_server_sasl:next_step(El) of
+ {auth, "EXTERNAL", Auth} ->
+ {AuthDomain, AuthRes} = try
+ AuthDomain0 = exmpp_stringprep:nameprep(Auth),
+ AuthRes0 = 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 ->
+ case idna:domain_utf8_to_ascii(AuthDomain0) of
+ false ->
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
+ PCAuthDomain ->
+ lists:any(
+ fun(D) ->
+ match_domain(
+ PCAuthDomain, D)
+ end, get_cert_domains(Cert))
end;
_ ->
false
end;
error ->
- false
+ {undefined, false}
end,
+ {AuthDomain0, AuthRes0}
+ catch
+ _ ->
+ false
+ end,
if
AuthRes ->
(StateData#state.sockmod):reset_stream(
StateData#state.socket),
send_element(StateData,
- {xmlelement, "success",
- [{"xmlns", ?NS_SASL}], []}),
+ exmpp_server_sasl:success()),
?DEBUG("(~w) Accepted s2s authentication for ~s",
[StateData#state.socket, AuthDomain]),
{next_state, wait_for_stream,
@@ -311,16 +292,14 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) ->
}};
true ->
send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_SASL}], []}),
- send_text(StateData, ?STREAM_TRAILER),
+ exmpp_server_sasl:failure()),
+ send_element(StateData,
+ exmpp_stream:closing()),
{stop, normal, StateData}
end;
_ ->
send_element(StateData,
- {xmlelement, "failure",
- [{"xmlns", ?NS_SASL}],
- [{xmlelement, "invalid-mechanism", [], []}]}),
+ exmpp_server_sasl:failure('invalid-mechanism')),
{stop, normal, StateData}
end;
_ ->
@@ -328,11 +307,12 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) ->
end;
wait_for_feature_request({xmlstreamend, _Name}, StateData) ->
- send_text(StateData, ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
wait_for_feature_request({xmlstreamerror, _}, StateData) ->
- send_text(StateData, ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
wait_for_feature_request(closed, StateData) ->
@@ -345,8 +325,8 @@ stream_established({xmlstreamelement, El}, StateData) ->
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),
+ LTo = exmpp_stringprep:nameprep(To),
+ LFrom = exmpp_stringprep:nameprep(From),
%% Checks if the from domain is allowed and if the to
%% domain is handled by this server:
case {ejabberd_s2s:allow_host(To, From),
@@ -358,49 +338,53 @@ stream_established({xmlstreamelement, El}, StateData) ->
Key, StateData#state.streamid}),
Conns = ?DICT:store({LFrom, LTo}, wait_for_verification,
StateData#state.connections),
- change_shaper(StateData, LTo, jlib:make_jid("", LFrom, "")),
+ change_shaper(StateData, LTo,
+ exmpp_jid:make(LFrom)),
{next_state,
stream_established,
StateData#state{connections = Conns,
timer = Timer}};
{_, false} ->
- send_text(StateData, ?HOST_UNKNOWN_ERR),
+ send_element(StateData, exmpp_stream:error('host-unknown')),
{stop, normal, StateData};
{false, _} ->
- send_text(StateData, ?INVALID_FROM_ERR),
+ send_element(StateData, exmpp_stream:error('invalid-from')),
{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}],
- []}),
+ LTo = exmpp_stringprep:nameprep(To),
+ LFrom = exmpp_stringprep:nameprep(From),
+ send_element(StateData, exmpp_dialback:verify_response(
+ El, ejabberd_s2s:has_key({LTo, LFrom}, Key))),
{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),
+ From = case exmpp_stanza:get_sender(El) of
+ undefined ->
+ error;
+ F ->
+ try
+ exmpp_jid:parse(F)
+ catch
+ _Exception1 -> error
+ end
+ end,
+ To = case exmpp_stanza:get_recipient(El) of
+ undefined ->
+ error;
+ T ->
+ try
+ exmpp_jid:parse(T)
+ catch
+ _Exception2 -> error
+ end
+ end,
+ % No namespace conversion (:server <-> :client) is done.
+ % This is handled by C2S and S2S send_element functions.
if
(To /= error) and (From /= error) ->
- LFrom = From#jid.lserver,
- LTo = To#jid.lserver,
+ LFrom = exmpp_jid:prep_domain_as_list(From),
+ LTo = exmpp_jid:prep_domain_as_list(To),
if
StateData#state.authenticated ->
case (LFrom == StateData#state.auth_domain)
@@ -409,15 +393,16 @@ stream_established({xmlstreamelement, El}, StateData) ->
LTo,
ejabberd_router:dirty_get_all_domains()) of
true ->
- if ((Name == "iq") or
- (Name == "message") or
- (Name == "presence")) ->
+ Name = El#xmlel.name,
+ if ((Name == 'iq') or
+ (Name == 'message') or
+ (Name == 'presence')) ->
ejabberd_hooks:run(
s2s_receive_packet,
- LTo,
- [From, To, NewEl]),
+ exmpp_jid:prep_domain(To),
+ [From, To, El]),
ejabberd_router:route(
- From, To, NewEl);
+ From, To, El);
true ->
error
end;
@@ -428,15 +413,16 @@ stream_established({xmlstreamelement, El}, StateData) ->
case ?DICT:find({LFrom, LTo},
StateData#state.connections) of
{ok, established} ->
- if ((Name == "iq") or
- (Name == "message") or
- (Name == "presence")) ->
+ Name = El#xmlel.name,
+ if ((Name == 'iq') or
+ (Name == 'message') or
+ (Name == 'presence')) ->
ejabberd_hooks:run(
s2s_receive_packet,
- LTo,
- [From, To, NewEl]),
+ exmpp_jid:prep_domain(To),
+ [From, To, El]),
ejabberd_router:route(
- From, To, NewEl);
+ From, To, El);
true ->
error
end;
@@ -452,30 +438,19 @@ stream_established({xmlstreamelement, El}, StateData) ->
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),
+ send_element(StateData, exmpp_dialback:validate(From, To)),
+ LFrom = exmpp_stringprep:nameprep(From),
+ LTo = exmpp_stringprep: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),
+ Valid = exmpp_dialback:validate(From, To),
+ send_element(StateData, exmpp_stanza:set_type(Valid, "invalid")),
+ LFrom = exmpp_stringprep:nameprep(From),
+ LTo = exmpp_stringprep:nameprep(To),
NSD = StateData#state{
connections = ?DICT:erase({LFrom, LTo},
StateData#state.connections)},
@@ -485,8 +460,8 @@ stream_established({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
stream_established({xmlstreamerror, _}, StateData) ->
- send_text(StateData,
- ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
stream_established(timeout, StateData) ->
@@ -608,8 +583,11 @@ terminate(Reason, _StateName, StateData) ->
send_text(StateData, Text) ->
(StateData#state.sockmod):send(StateData#state.socket, Text).
+
+send_element(StateData, #xmlel{ns = ?NS_XMPP, name = 'stream'} = El) ->
+ send_text(StateData, exmpp_stream:to_iolist(El));
send_element(StateData, El) ->
- send_text(StateData, xml:element_to_string(El)).
+ send_text(StateData, exmpp_stanza:to_iolist(El)).
change_shaper(StateData, Host, JID) ->
@@ -630,18 +608,20 @@ cancel_timer(Timer) ->
end.
-is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:result" ->
+is_key_packet(#xmlel{ns = ?NS_DIALBACK, name = 'result',
+ attrs = Attrs} = El) ->
{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" ->
+ binary_to_list(exmpp_stanza:get_recipient_from_attrs(Attrs)),
+ binary_to_list(exmpp_stanza:get_sender_from_attrs(Attrs)),
+ exmpp_stanza:get_id_from_attrs(Attrs),
+ exmpp_xml:get_cdata_as_list(El)};
+is_key_packet(#xmlel{ns = ?NS_DIALBACK, name = 'verify',
+ attrs = Attrs} = El) ->
{verify,
- xml:get_attr_s("to", Attrs),
- xml:get_attr_s("from", Attrs),
- xml:get_attr_s("id", Attrs),
- xml:get_cdata(Els)};
+ binary_to_list(exmpp_stanza:get_recipient_from_attrs(Attrs)),
+ binary_to_list(exmpp_stanza:get_sender_from_attrs(Attrs)),
+ exmpp_stanza:get_id_from_attrs(Attrs),
+ exmpp_xml:get_cdata_as_list(El)};
is_key_packet(_) ->
false.
@@ -663,10 +643,11 @@ get_cert_domains(Cert) ->
end,
if
D /= error ->
- case jlib:string_to_jid(D) of
- #jid{luser = "",
- lserver = LD,
- lresource = ""} ->
+ JID = exmpp_jid:parse(D),
+ case {exmpp_jid:prep_node_as_list(JID),
+ exmpp_jid:prep_domain_as_list(JID),
+ exmpp_jid:prep_resource_as_list(JID)} of
+ {undefined, LD, undefined} ->
[LD];
_ ->
[]
@@ -698,11 +679,11 @@ get_cert_domains(Cert) ->
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 = ""} ->
+ JID2 = exmpp_jid:parse(binary_to_list(D)),
+ case {exmpp_jid:prep_node_as_list(JID2),
+ exmpp_jid:prep_domain_as_list(JID2),
+ exmpp_jid:prep_resource_as_list(JID2)} of
+ { undefined, LD, undefined} ->
case idna:domain_utf8_to_ascii(LD) of
false ->
[];
@@ -716,10 +697,11 @@ get_cert_domains(Cert) ->
[]
end;
({dNSName, D}) when is_list(D) ->
- case jlib:string_to_jid(D) of
- #jid{luser = "",
- lserver = LD,
- lresource = ""} ->
+ JID3 = exmpp_jid:parse(D),
+ case {exmpp_jid:prep_node_as_list(JID3),
+ exmpp_jid:prep_domain_as_list(JID3),
+ exmpp_jid:prep_resource_as_list(JID3)} of
+ {undefined, LD, undefined} ->
[LD];
_ ->
[]
@@ -753,11 +735,11 @@ match_labels([DL | DLabels], [PL | PLabels]) ->
orelse (C == $-) orelse (C == $*)
end, PL) of
true ->
- Regexp = regexp:sh_to_awk(PL),
- case regexp:match(DL, Regexp) of
- {match, _, _} ->
+ Regexp = xmerl_regexp:sh_to_awk(PL),
+ case re:run(DL, Regexp, [{capture, none}]) of
+ match ->
match_labels(DLabels, PLabels);
- _ ->
+ nomatch ->
false
end;
false ->
diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl
index 726d624ee..261562f8c 100644
--- a/src/ejabberd_s2s_out.erl
+++ b/src/ejabberd_s2s_out.erl
@@ -55,8 +55,9 @@
test_get_addr_port/1,
get_addr_port/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(state, {socket,
streamid,
@@ -73,7 +74,7 @@
new = false, verify = false,
timer}).
-%%-define(DBGFSM, true).
+%-define(DBGFSM, true).
-ifdef(DBGFSM).
-define(FSMOPTS, [{debug, [trace]}]).
@@ -99,25 +100,13 @@
%% Specified in miliseconds. Default value is 5 minutes.
-define(MAX_RETRY_DELAY, 300000).
--define(STREAM_HEADER,
- ""
- ""
- ).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_SERVER).
+-define(PREFIXED_NS, [
+ {?NS_XMPP, ?NS_XMPP_pfx}, {?NS_DIALBACK, ?NS_DIALBACK_pfx}
+]).
--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}).
@@ -212,16 +201,19 @@ open_socket(init, StateData) ->
{ok, Socket} ->
Version = if
StateData#state.use_v10 ->
- " version='1.0'";
+ "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.server,
- Version])),
+ Opening = exmpp_stream:opening(
+ StateData#state.server,
+ ?NS_JABBER_SERVER,
+ Version),
+ send_element(NewStateData,
+ exmpp_stream:set_dialback_support(Opening)),
{next_state, wait_for_stream, NewStateData, ?FSMTIMEOUT};
{error, _Reason} ->
?INFO_MSG("s2s connection: ~s -> ~s (remote server not found)",
@@ -287,28 +279,29 @@ open_socket2(Type, Addr, Port) ->
%%----------------------------------------------------------------------
-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} ->
+wait_for_stream({xmlstreamstart, Opening}, StateData) ->
+ case {exmpp_stream:get_default_ns(Opening),
+ exmpp_xml:is_ns_declared_here(Opening, ?NS_DIALBACK),
+ exmpp_stream:get_version(Opening) == {1, 0}} of
+ {?NS_JABBER_SERVER, true, false} ->
send_db_request(StateData);
- {"jabber:server", "jabber:server:dialback", true} when
+ {?NS_JABBER_SERVER, true, true} when
StateData#state.use_v10 ->
{next_state, wait_for_features, StateData, ?FSMTIMEOUT};
- {"jabber:server", "", true} when StateData#state.use_v10 ->
+ {?NS_JABBER_SERVER, false, true} when StateData#state.use_v10 ->
{next_state, wait_for_features, StateData#state{db_enabled = false}, ?FSMTIMEOUT};
{NSProvided, _, _} ->
- send_text(StateData, ?INVALID_NAMESPACE_ERR),
- ?INFO_MSG("Closing s2s connection: ~s -> ~s (invalid namespace).~n"
- "Namespace provided: ~p~nNamespace expected: \"jabber:server\"",
- [StateData#state.myname, StateData#state.server, NSProvided]),
+ send_element(StateData, exmpp_stream:error('invalid-namespace')),
+ ?INFO_MSG("Closing s2s connection: ~s -> ~s (invalid namespace)~n"
+ "Namespace provided: ~p~nNamespace expected: ~p",
+ [StateData#state.myname, StateData#state.server,
+ NSProvided, ?NS_JABBER_SERVER]),
{stop, normal, StateData}
end;
wait_for_stream({xmlstreamerror, _}, StateData) ->
- send_text(StateData,
- ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("Closing s2s connection: ~s -> ~s (invalid xml)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
@@ -392,8 +385,8 @@ wait_for_validation({xmlstreamend, _Name}, 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),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
wait_for_validation(timeout, #state{verify = {VPid, VKey, SID}} = StateData)
@@ -417,41 +410,37 @@ wait_for_validation(closed, StateData) ->
wait_for_features({xmlstreamelement, El}, StateData) ->
case El of
- {xmlelement, "stream:features", _Attrs, Els} ->
+ #xmlel{ns = ?NS_XMPP, name = 'features'} = Features ->
{SASLEXT, StartTLS, StartTLSRequired} =
lists:foldl(
- fun({xmlelement, "mechanisms", Attrs1, Els1} = _El1,
+ fun(#xmlel{ns = ?NS_SASL, name = 'mechanisms'},
{_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};
- _ ->
+ try
+ Mechs = exmpp_client_sasl:announced_mechanisms(
+ El),
+ NewSEXT = lists:member("EXTERNAL", Mechs),
+ {NewSEXT, STLS, STLSReq}
+ catch
+ _Exception ->
Acc
end;
- ({xmlelement, "starttls", Attrs1, _Els1} = El1,
+ (#xmlel{ns = ?NS_TLS, name ='starttls'},
{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};
- _ ->
+ try
+ Support = exmpp_client_tls:announced_support(
+ El),
+ case Support of
+ none -> Acc;
+ optional -> {SEXT, true, false};
+ required -> {SEXT, true, true}
+ end
+ catch
+ _Exception ->
Acc
end;
(_, Acc) ->
Acc
- end, {false, false, false}, Els),
+ end, {false, false, false}, Features#xmlel.children),
if
(not SASLEXT) and (not StartTLS) and
StateData#state.authenticated ->
@@ -466,19 +455,14 @@ wait_for_features({xmlstreamelement, El}, StateData) ->
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)}]}),
+ exmpp_client_sasl:selected_mechanism("EXTERNAL",
+ 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}], []}),
+ exmpp_client_tls:starttls()),
{next_state, wait_for_starttls_proceed, StateData,
?FSMTIMEOUT};
StartTLSRequired and (not StateData#state.tls) ->
@@ -499,9 +483,8 @@ wait_for_features({xmlstreamelement, El}, StateData) ->
use_v10 = false}, ?FSMTIMEOUT}
end;
_ ->
- send_text(StateData,
- xml:element_to_string(?SERR_BAD_FORMAT) ++
- ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('bad-format')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
@@ -512,8 +495,8 @@ wait_for_features({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
wait_for_features({xmlstreamerror, _}, StateData) ->
- send_text(StateData,
- ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("wait for features: xmlstreamerror", []),
{stop, normal, StateData};
@@ -528,48 +511,29 @@ wait_for_features(closed, 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.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;
+ #xmlel{ns = ?NS_SASL, name = 'success'} ->
+ ?DEBUG("auth: ~p", [{StateData#state.myname,
+ StateData#state.server}]),
+ ejabberd_socket:reset_stream(StateData#state.socket),
+ Opening = exmpp_stream:opening(
+ StateData#state.server,
+ ?NS_JABBER_SERVER,
+ "1.0"),
+ send_element(StateData,
+ exmpp_stream:set_dialback_support(Opening)),
+ {next_state, wait_for_stream,
+ StateData#state{streamid = new_id(),
+ authenticated = true
+ }, ?FSMTIMEOUT};
+ #xmlel{ns = ?NS_SASL, name = 'failure'} ->
+ ?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),
+ send_element(StateData, exmpp_stream:error('bad-format')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
@@ -580,8 +544,8 @@ wait_for_auth_result({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
wait_for_auth_result({xmlstreamerror, _}, StateData) ->
- send_text(StateData,
- ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("wait for auth result: xmlstreamerror", []),
{stop, normal, StateData};
@@ -596,42 +560,36 @@ wait_for_auth_result(closed, 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.server}) 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
- },
- send_text(NewStateData,
- io_lib:format(?STREAM_HEADER,
- [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;
+ #xmlel{ns = ?NS_TLS, name = 'proceed'} ->
+ ?DEBUG("starttls: ~p", [{StateData#state.myname,
+ StateData#state.server}]),
+ 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 = ejabberd_socket:starttls(Socket, TLSOpts),
+ NewStateData = StateData#state{socket = TLSSocket,
+ streamid = new_id(),
+ tls_enabled = true
+ },
+ Opening = exmpp_stream:opening(
+ StateData#state.server,
+ ?NS_JABBER_SERVER,
+ "1.0"),
+ send_element(NewStateData,
+ exmpp_stream:set_dialback_support(Opening)),
+ {next_state, wait_for_stream, NewStateData, ?FSMTIMEOUT};
_ ->
+ send_element(StateData, exmpp_stream:error('bad-format')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
@@ -642,8 +600,8 @@ wait_for_starttls_proceed({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
wait_for_starttls_proceed({xmlstreamerror, _}, StateData) ->
- send_text(StateData,
- ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("wait for starttls proceed: xmlstreamerror", []),
{stop, normal, StateData};
@@ -706,8 +664,8 @@ stream_established({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
stream_established({xmlstreamerror, _}, StateData) ->
- send_text(StateData,
- ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
?INFO_MSG("stream established: ~s -> ~s (xmlstreamerror)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
@@ -821,7 +779,7 @@ handle_info({send_element, El}, StateName, StateData) ->
%% 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),
+ bounce_element(El, 'remote-server-not-found'),
{next_state, StateName, StateData};
_ ->
Q = queue:in(El, StateData#state.queue),
@@ -863,8 +821,8 @@ terminate(Reason, StateName, StateData) ->
{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),
+ bounce_queue(StateData#state.queue, 'remote-server-not-found'),
+ bounce_messages('remote-server-not-found'),
case StateData#state.socket of
undefined ->
ok;
@@ -880,8 +838,10 @@ terminate(Reason, StateName, StateData) ->
send_text(StateData, Text) ->
ejabberd_socket:send(StateData#state.socket, Text).
+send_element(StateData, #xmlel{ns = ?NS_XMPP, name = 'stream'} = El) ->
+ send_text(StateData, exmpp_stream:to_iolist(El));
send_element(StateData, El) ->
- send_text(StateData, xml:element_to_string(El)).
+ send_text(StateData, exmpp_stanza:to_iolist(El)).
send_queue(StateData, Q) ->
case queue:out(Q) of
@@ -892,24 +852,25 @@ send_queue(StateData, Q) ->
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;
+%% Bounce a single message (xmlel)
+bounce_element(El, Condition) ->
+ case exmpp_stanza:get_type(El) 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)),
+ Err = exmpp_stanza:reply_with_error(El, Condition),
+ From = exmpp_jid:parse(exmpp_stanza:get_sender(El)),
+ To = exmpp_jid:parse(exmpp_stanza:get_recipient(El)),
+ % No namespace conversion (:server <-> :client) is done.
+ % This is handled by C2S and S2S send_element functions.
ejabberd_router:route(To, From, Err)
end.
-bounce_queue(Q, Error) ->
+bounce_queue(Q, Condition) ->
case queue:out(Q) of
{{value, El}, Q1} ->
- bounce_element(El, Error),
- bounce_queue(Q1, Error);
+ bounce_element(El, Condition),
+ bounce_queue(Q1, Condition);
{empty, _} ->
ok
end.
@@ -926,11 +887,11 @@ cancel_timer(Timer) ->
ok
end.
-bounce_messages(Error) ->
+bounce_messages(Condition) ->
receive
{send_element, El} ->
- bounce_element(El, Error),
- bounce_messages(Error)
+ bounce_element(El, Condition),
+ bounce_messages(Condition)
after 0 ->
ok
end.
@@ -954,40 +915,33 @@ send_db_request(StateData) ->
false ->
ok;
Key1 ->
- send_element(StateData,
- {xmlelement,
- "db:result",
- [{"from", StateData#state.myname},
- {"to", Server}],
- [{xmlcdata, Key1}]})
+ send_element(StateData, exmpp_dialback:key(
+ StateData#state.myname, Server, 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}]})
+ send_element(StateData, exmpp_dialback:verify_request(
+ StateData#state.myname, StateData#state.server, SID, Key2))
end,
{next_state, wait_for_validation, StateData#state{new = New}, ?FSMTIMEOUT*6}.
-is_verify_res({xmlelement, Name, Attrs, _Els}) when Name == "db:result" ->
+is_verify_res(#xmlel{ns = ?NS_DIALBACK, name = 'result',
+ attrs = Attrs}) ->
{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" ->
+ exmpp_stanza:get_recipient_from_attrs(Attrs),
+ exmpp_stanza:get_sender_from_attrs(Attrs),
+ exmpp_stanza:get_id_from_attrs(Attrs),
+ binary_to_list(exmpp_stanza:get_type_from_attrs(Attrs))};
+is_verify_res(#xmlel{ns = ?NS_DIALBACK, name = 'verify',
+ attrs = Attrs}) ->
{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)};
+ exmpp_stanza:get_recipient_from_attrs(Attrs),
+ exmpp_stanza:get_sender_from_attrs(Attrs),
+ exmpp_stanza:get_id_from_attrs(Attrs),
+ binary_to_list(exmpp_stanza:get_type_from_attrs(Attrs))};
is_verify_res(_) ->
false.
@@ -1157,8 +1111,8 @@ get_timeout_interval(StateName) ->
%% 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),
+ bounce_queue(StateData#state.queue, 'remote-server-not-found'),
+ bounce_messages('remote-server-not-found'),
cancel_timer(StateData#state.timer),
Delay = case StateData#state.delay_to_retry of
undefined_delay ->
diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl
index 09b19c9b7..f06d7cc23 100644
--- a/src/ejabberd_service.erl
+++ b/src/ejabberd_service.erl
@@ -49,8 +49,9 @@
handle_info/3,
terminate/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(state, {socket, sockmod, streamid,
hosts, password, access,
@@ -64,36 +65,10 @@
-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)).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_COMPONENT_ACCEPT).
+-define(PREFIXED_NS, [{?NS_XMPP, ?NS_XMPP_pfx}]).
%%%----------------------------------------------------------------------
%%% API
@@ -162,7 +137,7 @@ init([{SockMod, Socket}, Opts]) ->
{ok, wait_for_stream, #state{socket = Socket,
sockmod = SockMod,
streamid = new_id(),
- hosts = Hosts,
+ hosts = [list_to_binary(H) || H <- Hosts],
password = Password,
access = Access,
check_from = CheckFrom
@@ -175,28 +150,36 @@ init([{SockMod, Socket}, Opts]) ->
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
-wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
- case xml:get_attr_s("xmlns", Attrs) of
- "jabber:component:accept" ->
+wait_for_stream({xmlstreamstart, El = #xmlel{ns = _NS, attrs = Attrs}}, StateData) ->
+ case exmpp_xml:is_ns_declared_here(El, ?NS_COMPONENT_ACCEPT) of
+ true ->
%% 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),
+ To = exmpp_stanza:get_recipient_from_attrs(Attrs),
+ Opening_Reply = exmpp_stream:opening_reply(To,
+ ?NS_COMPONENT_ACCEPT,
+ {0, 0}, StateData#state.streamid),
+ send_element(StateData, Opening_Reply),
{next_state, wait_for_handshake, StateData};
- _ ->
- send_text(StateData, ?INVALID_HEADER_ERR),
+ false ->
+ Error = #xmlel{ns = ?NS_XMPP, name = 'stream', children = [
+ #xmlel{ns = ?NS_XMPP, name = 'error', children = [
+ #xmlcdata{cdata = <<"Invalid Stream Header">>}
+ ]}
+ ]},
+ send_element(StateData, Error),
{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),
+ Opening_Reply = exmpp_stream:opening_reply(?MYNAME,
+ ?NS_COMPONENT_ACCEPT,
+ {0, 0}, "none"),
+ send_element(StateData, Opening_Reply),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
wait_for_stream(closed, StateData) ->
@@ -204,21 +187,38 @@ wait_for_stream(closed, StateData) ->
wait_for_handshake({xmlstreamelement, El}, StateData) ->
- {xmlelement, Name, _Attrs, Els} = El,
- case {Name, xml:get_cdata(Els)} of
- {"handshake", Digest} ->
+ case {El#xmlel.name, exmpp_xml:get_cdata_as_list(El)} of
+ {'handshake', Digest} ->
case sha:sha(StateData#state.streamid ++
StateData#state.password) of
Digest ->
- send_text(StateData, ""),
+ send_element(StateData,
+ #xmlel{ns = ?NS_COMPONENT_ACCEPT, name = 'handshake'}),
lists:foreach(
fun(H) ->
- ejabberd_router:register_route(H),
+ ejabberd_router:register_route(binary_to_list(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),
+ _ ->
+ TextEl =
+ #xmlel{ns = ?NS_STANZA_ERRORS,
+ name = 'text',
+ children =
+ [#xmlcdata{cdata = <<"Invalid Handshake">>}]
+ },
+ NotAuthorizedEl =
+ #xmlel{ns = ?NS_STANZA_ERRORS,
+ name = 'not-authorized',
+ children = [TextEl]
+ },
+ InvalidHandshakeEl =
+ #xmlel{ns = ?NS_XMPP,
+ name = 'error',
+ children = [NotAuthorizedEl]
+ },
+ send_element(StateData, InvalidHandshakeEl),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData}
end;
_ ->
@@ -229,7 +229,8 @@ wait_for_handshake({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
wait_for_handshake({xmlstreamerror, _}, StateData) ->
- send_text(StateData, ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
wait_for_handshake(closed, StateData) ->
@@ -237,39 +238,34 @@ wait_for_handshake(closed, StateData) ->
stream_established({xmlstreamelement, El}, StateData) ->
- NewEl = jlib:remove_attr("xmlns", El),
- {xmlelement, Name, Attrs, _Els} = NewEl,
- From = xml:get_attr_s("from", Attrs),
+ From = exmpp_stanza:get_sender(El),
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);
+ false -> exmpp_jid:parse(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
+ FromJID1 = exmpp_jid:parse(From),
+ Server = exmpp_jid:prep_domain(FromJID1),
+ case lists:member(Server, StateData#state.hosts) of
true -> FromJID1;
false -> error
- end;
- _ -> error
- end
+ end
end,
- To = xml:get_attr_s("to", Attrs),
+ To = exmpp_stanza:get_recipient(El),
ToJID = case To of
- "" -> error;
- _ -> jlib:string_to_jid(To)
+ undefined -> error;
+ _ -> exmpp_jid:parse(To)
end,
- if ((Name == "iq") or
- (Name == "message") or
- (Name == "presence")) and
+ if ((El#xmlel.name == 'iq') or
+ (El#xmlel.name == 'message') or
+ (El#xmlel.name == 'presence')) and
(ToJID /= error) and (FromJID /= error) ->
- ejabberd_router:route(FromJID, ToJID, NewEl);
+ ejabberd_router:route(FromJID, ToJID, El);
true ->
- Err = jlib:make_error_reply(NewEl, ?ERR_BAD_REQUEST),
+ Err = exmpp_stanza:reply_with_error(El, 'bad-request'),
send_element(StateData, Err),
error
end,
@@ -280,7 +276,8 @@ stream_established({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
stream_established({xmlstreamerror, _}, StateData) ->
- send_text(StateData, ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
+ send_element(StateData, exmpp_stream:error('xml-not-well-formed')),
+ send_element(StateData, exmpp_stream:closing()),
{stop, normal, StateData};
stream_established(closed, StateData) ->
@@ -334,22 +331,21 @@ code_change(_OldVsn, StateName, StateData, _Extra) ->
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_info({send_text, Text}, StateName, StateData) ->
+ % XXX OLD FORMAT: This clause should be removed.
send_text(StateData, Text),
{next_state, StateName, StateData};
handle_info({send_element, El}, StateName, StateData) ->
+ io:format("ejabberd_service send_element ~p~n",[ El]),
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_string({xmlelement, Name, Attrs2, Els}),
- send_text(StateData, Text);
+ El1 = exmpp_stanza:set_sender(Packet, From),
+ El2 = exmpp_stanza:set_recipient(El1, To),
+ send_element(StateData, El2);
deny ->
- Err = jlib:make_error_reply(Packet, ?ERR_NOT_ALLOWED),
+ Err = exmpp_stanza:reply_with_error(Packet, 'not-allowed'),
ejabberd_router:route(To, From, Err)
end,
{next_state, StateName, StateData}.
@@ -366,7 +362,7 @@ terminate(Reason, StateName, StateData) ->
stream_established ->
lists:foreach(
fun(H) ->
- ejabberd_router:unregister_route(H)
+ ejabberd_router:unregister_route(binary_to_list(H))
end, StateData#state.hosts);
_ ->
ok
@@ -379,10 +375,13 @@ terminate(Reason, StateName, StateData) ->
%%%----------------------------------------------------------------------
send_text(StateData, Text) ->
+ io:format(">>~n ~s ~n", [Text]),
(StateData#state.sockmod):send(StateData#state.socket, Text).
+send_element(StateData, #xmlel{ns = ?NS_XMPP, name = 'stream'} = El) ->
+ send_text(StateData, exmpp_stream:to_iolist(El));
send_element(StateData, El) ->
- send_text(StateData, xml:element_to_string(El)).
+ send_text(StateData, exmpp_stanza:to_iolist(El)).
new_id() ->
randoms:get_string().
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index b42746ea8..009d32bd7 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -32,14 +32,14 @@
%% API
-export([start_link/0,
route/3,
- open_session/5, close_session/4,
+ open_session/3, close_session/2,
check_in_subscription/6,
bounce_offline_message/3,
disconnect_removed_user/2,
get_user_resources/2,
- set_presence/7,
- unset_presence/6,
- close_session_unset_presence/5,
+ set_presence/5,
+ unset_presence/4,
+ close_session_unset_presence/3,
dirty_get_sessions_list/0,
dirty_get_my_sessions_list/0,
get_vh_session_list/1,
@@ -50,17 +50,18 @@
connected_users/0,
connected_users_number/0,
user_resources/2,
- get_session_pid/3,
+ get_session_pid/1,
get_user_info/3,
- get_user_ip/3
+ get_user_ip/1
]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("ejabberd_commands.hrl").
-include("mod_privacy.hrl").
@@ -71,6 +72,16 @@
%% default value for the maximum number of user connections
-define(MAX_USER_SESSIONS, infinity).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_CLIENT).
+-define(PREFIXED_NS, [
+ {?NS_XMPP, ?NS_XMPP_pfx}, {?NS_DIALBACK, ?NS_DIALBACK_pfx}
+]).
+
+
+-define(IS_BINARY_OR_UNDEF(X),
+ (is_binary(X) orelse X == 'undefined')).
%%====================================================================
%% API
%%====================================================================
@@ -81,6 +92,16 @@
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+route(FromOld, ToOld, #xmlelement{} = PacketOld) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nSM: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ route(From, To, Packet);
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -90,30 +111,29 @@ route(From, To, Packet) ->
ok
end.
-open_session(SID, User, Server, Resource, Info) ->
- set_session(SID, User, Server, Resource, undefined, Info),
- inc_session_counter(jlib:nameprep(Server)),
- check_for_sessions_to_replace(User, Server, Resource),
- JID = jlib:make_jid(User, Server, Resource),
- ejabberd_hooks:run(sm_register_connection_hook, JID#jid.lserver,
+open_session(SID, JID, Info) when ?IS_JID(JID) ->
+ set_session(SID, JID, undefined, Info),
+ inc_session_counter(exmpp_jid:domain(JID)),
+ check_for_sessions_to_replace(JID),
+ ejabberd_hooks:run(sm_register_connection_hook, exmpp_jid:prep_domain(JID),
[SID, JID, Info]).
-close_session(SID, User, Server, Resource) ->
+close_session(SID, JID ) when ?IS_JID(JID)->
Info = case mnesia:dirty_read({session, SID}) of
[] -> [];
[#session{info=I}] -> I
end,
F = fun() ->
mnesia:delete({session, SID}),
- dec_session_counter(jlib:nameprep(Server))
+ dec_session_counter(exmpp_jid:domain(JID))
end,
mnesia:sync_dirty(F),
- JID = jlib:make_jid(User, Server, Resource),
- ejabberd_hooks:run(sm_remove_connection_hook, JID#jid.lserver,
+ ejabberd_hooks:run(sm_remove_connection_hook, exmpp_jid:prep_domain(JID),
[SID, JID, Info]).
-check_in_subscription(Acc, User, Server, _JID, _Type, _Reason) ->
- case ejabberd_auth:is_user_exists(User, Server) of
+check_in_subscription(Acc, User, Server, _JID, _Type, _Reason)
+ when is_binary(User), is_binary(Server)->
+ case ejabberd_auth:is_user_exists(binary_to_list(User), binary_to_list(Server)) of
true ->
Acc;
false ->
@@ -121,20 +141,20 @@ check_in_subscription(Acc, User, Server, _JID, _Type, _Reason) ->
end.
bounce_offline_message(From, To, Packet) ->
- Err = jlib:make_error_reply(Packet, ?ERR_SERVICE_UNAVAILABLE),
+ Err = exmpp_stanza:reply_with_error(Packet, 'service-unavailable'),
ejabberd_router:route(To, From, Err),
stop.
disconnect_removed_user(User, Server) ->
- ejabberd_sm:route(jlib:make_jid("", "", ""),
- jlib:make_jid(User, Server, ""),
- {xmlelement, "broadcast", [],
- [{exit, "User removed"}]}).
+ ejabberd_sm:route(exmpp_jid:make(),
+ exmpp_jid:make(User,
+ Server),
+ #xmlel{name = 'broadcast',
+ children = [{exit, "User removed"}]}).
-get_user_resources(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- US = {LUser, LServer},
+get_user_resources(User, Server)
+ when is_binary(User), is_binary(Server) ->
+ US = {User, Server},
case catch mnesia:dirty_index_read(session, US, #session.us) of
{'EXIT', _Reason} ->
[];
@@ -142,11 +162,10 @@ get_user_resources(User, Server) ->
[element(3, S#session.usr) || S <- clean_session_list(Ss)]
end.
-get_user_ip(User, Server, Resource) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- LResource = jlib:resourceprep(Resource),
- USR = {LUser, LServer, LResource},
+get_user_ip(JID) when ?IS_JID(JID) ->
+ USR = {exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID)},
case mnesia:dirty_index_read(session, USR, #session.usr) of
[] ->
undefined;
@@ -155,11 +174,16 @@ get_user_ip(User, Server, Resource) ->
proplists:get_value(ip, Session#session.info)
end.
-get_user_info(User, Server, Resource) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- LResource = jlib:resourceprep(Resource),
- USR = {LUser, LServer, LResource},
+get_user_info(User, Server, Resource)
+ when is_binary(User),
+ is_binary(Server),
+ is_binary(Resource) ->
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ LResource = exmpp_stringprep:resourceprep(Resource),
+ USR = {LUser,
+ LServer,
+ LResource},
case mnesia:dirty_index_read(session, USR, #session.usr) of
[] ->
offline;
@@ -171,26 +195,37 @@ get_user_info(User, Server, Resource) ->
[{node, Node}, {conn, Conn}, {ip, IP}]
end.
-set_presence(SID, User, Server, Resource, Priority, Presence, Info) ->
- set_session(SID, User, Server, Resource, Priority, Info),
- ejabberd_hooks:run(set_presence_hook, jlib:nameprep(Server),
- [User, Server, Resource, Presence]).
+set_presence(SID, JID, Priority, Presence, Info) when ?IS_JID(JID) ->
+ set_session(SID, JID, Priority, Info),
+ ejabberd_hooks:run(set_presence_hook,
+ exmpp_jid:prep_domain(JID),
+ [exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID),
+ Presence]).
-unset_presence(SID, User, Server, Resource, Status, Info) ->
- set_session(SID, User, Server, Resource, undefined, Info),
- ejabberd_hooks:run(unset_presence_hook, jlib:nameprep(Server),
- [User, Server, Resource, Status]).
+unset_presence(SID, JID, Status, Info) when ?IS_JID(JID)->
+ set_session(SID, JID, undefined, Info),
+ ejabberd_hooks:run(unset_presence_hook,
+ exmpp_jid:prep_domain(JID),
+ [exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID),
+ Status]).
-close_session_unset_presence(SID, User, Server, Resource, Status) ->
- close_session(SID, User, Server, Resource),
- ejabberd_hooks:run(unset_presence_hook, jlib:nameprep(Server),
- [User, Server, Resource, Status]).
+close_session_unset_presence(SID, JID, Status) when ?IS_JID(JID) ->
+ close_session(SID, JID),
+ ejabberd_hooks:run(unset_presence_hook,
+ exmpp_jid:prep_domain(JID),
+ [exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID),
+ Status]).
-get_session_pid(User, Server, Resource) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- LResource = jlib:resourceprep(Resource),
- USR = {LUser, LServer, LResource},
+get_session_pid(JID) when ?IS_JID(JID) ->
+ USR = {exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID)},
case catch mnesia:dirty_index_read(session, USR, #session.usr) of
[#session{sid = {_, Pid}}] -> Pid;
_ -> none
@@ -210,8 +245,8 @@ dirty_get_my_sessions_list() ->
[{'==', {node, '$1'}, node()}],
['$_']}]).
-get_vh_session_list(Server) ->
- LServer = jlib:nameprep(Server),
+get_vh_session_list(Server) when is_binary(Server) ->
+ LServer = exmpp_stringprep:nameprep(Server),
mnesia:dirty_select(
session,
[{#session{usr = '$1', _ = '_'},
@@ -219,7 +254,7 @@ get_vh_session_list(Server) ->
['$1']}]).
get_vh_session_number(Server) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_jid:prep_domain(exmpp_jid:parse(Server)),
Query = mnesia:dirty_select(
session_counter,
[{#session_counter{vhost = LServer, count = '$1'},
@@ -267,11 +302,12 @@ init([]) ->
ets:new(sm_iqtable, [named_table]),
lists:foreach(
fun(Host) ->
- ejabberd_hooks:add(roster_in_subscription, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:add(roster_in_subscription, HostB,
ejabberd_sm, check_in_subscription, 20),
- ejabberd_hooks:add(offline_message_hook, Host,
+ ejabberd_hooks:add(offline_message_hook, HostB,
ejabberd_sm, bounce_offline_message, 100),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
ejabberd_sm, disconnect_removed_user, 100)
end, ?MYHOSTS),
ejabberd_commands:register_commands(commands()),
@@ -306,6 +342,16 @@ handle_cast(_Msg, State) ->
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
+handle_info({route, FromOld, ToOld, #xmlelement{} = PacketOld}, State) ->
+ catch throw(for_stacktrace), % To have a stacktrace.
+ io:format("~nSM: old #xmlelement:~n~p~n~p~n~n",
+ [PacketOld, erlang:get_stacktrace()]),
+ % XXX OLD FORMAT: From, To, Packet.
+ From = jlib:from_old_jid(FromOld),
+ To = jlib:from_old_jid(ToOld),
+ Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld, [?NS_JABBER_CLIENT],
+ [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ handle_info({route, From, To, Packet}, State);
handle_info({route, From, To, Packet}, State) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
@@ -358,12 +404,11 @@ code_change(_OldVsn, State, _Extra) ->
%%% Internal functions
%%--------------------------------------------------------------------
-set_session(SID, User, Server, Resource, Priority, Info) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- LResource = jlib:resourceprep(Resource),
- US = {LUser, LServer},
- USR = {LUser, LServer, LResource},
+set_session(SID, JID, Priority, Info) ->
+ US = {exmpp_jid:prep_node(JID), exmpp_jid:prep_domain(JID)},
+ USR = {exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID)},
F = fun() ->
mnesia:write(#session{sid = SID,
usr = USR,
@@ -393,95 +438,93 @@ clean_table_from_bad_node(Node) ->
do_route(From, To, Packet) ->
?DEBUG("session manager~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
[From, To, Packet, 8]),
- #jid{user = User, server = Server,
- luser = LUser, lserver = LServer, lresource = LResource} = To,
- {xmlelement, Name, Attrs, _Els} = Packet,
- case LResource of
- "" ->
- case Name of
- "presence" ->
+ case exmpp_jid:prep_resource(To) of
+ undefined ->
+ case Packet of
+ _ when ?IS_PRESENCE(Packet) ->
{Pass, _Subsc} =
- case xml:get_attr_s("type", Attrs) of
- "subscribe" ->
- Reason = xml:get_path_s(
- Packet,
- [{elem, "status"}, cdata]),
+ case exmpp_presence:get_type(Packet) of
+ 'subscribe' ->
+ Reason = exmpp_presence:get_status(Packet),
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
- LServer,
+ exmpp_jid:prep_domain(To),
false,
- [User, Server, From, subscribe, Reason]),
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), From, subscribe, Reason]),
true};
- "subscribed" ->
+ 'subscribed' ->
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
- LServer,
+ exmpp_jid:prep_domain(To),
false,
- [User, Server, From, subscribed, ""]),
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), From, subscribed, <<>>]),
true};
- "unsubscribe" ->
+ 'unsubscribe' ->
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
- LServer,
+ exmpp_jid:prep_domain(To),
false,
- [User, Server, From, unsubscribe, ""]),
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), From, unsubscribe, <<>>]),
true};
- "unsubscribed" ->
+ 'unsubscribed' ->
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
- LServer,
+ exmpp_jid:prep_domain(To),
false,
- [User, Server, From, unsubscribed, ""]),
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), From, unsubscribed, <<>>]),
true};
_ ->
{true, false}
end,
if Pass ->
PResources = get_user_present_resources(
- LUser, LServer),
+ exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To)),
lists:foreach(
fun({_, R}) ->
do_route(
From,
- jlib:jid_replace_resource(To, R),
+ exmpp_jid:full(To, R),
Packet)
end, PResources);
true ->
ok
end;
- "message" ->
+ _ when ?IS_MESSAGE(Packet) ->
route_message(From, To, Packet);
- "iq" ->
+ _ when ?IS_IQ(Packet) ->
process_iq(From, To, Packet);
- "broadcast" ->
+ #xmlel{name = 'broadcast'} ->
lists:foreach(
fun(R) ->
do_route(From,
- jlib:jid_replace_resource(To, R),
+ exmpp_jid:full(To, R),
Packet)
- end, get_user_resources(User, Server));
+ end, get_user_resources(exmpp_jid:prep_node(To),
+ exmpp_jid:prep_domain(To)));
_ ->
ok
end;
_ ->
- USR = {LUser, LServer, LResource},
+ USR = {exmpp_jid:prep_node(To),
+ exmpp_jid:prep_domain(To),
+ exmpp_jid:prep_resource(To)},
case mnesia:dirty_index_read(session, USR, #session.usr) of
[] ->
- case Name of
- "message" ->
+ case Packet of
+ _ when ?IS_MESSAGE(Packet) ->
route_message(From, To, Packet);
- "iq" ->
- case xml:get_attr_s("type", Attrs) of
- "error" -> ok;
- "result" -> ok;
+ _ when ?IS_IQ(Packet) ->
+ case exmpp_iq:get_type(Packet) of
+ 'error' -> ok;
+ 'result' -> ok;
_ ->
Err =
- jlib:make_error_reply(
- Packet, ?ERR_RECIPIENT_UNAVAILABLE),
+ exmpp_iq:error(Packet,
+ 'service-unavailable'),
ejabberd_router:route(To, From, Err)
end;
_ ->
@@ -500,8 +543,8 @@ do_route(From, To, Packet) ->
%% for the target session/resource to which a stanza is addressed,
%% or if there are no current sessions for the user.
is_privacy_allow(From, To, Packet) ->
- User = To#jid.user,
- Server = To#jid.server,
+ User = exmpp_jid:prep_node(To),
+ Server = exmpp_jid:prep_domain(To),
PrivacyList = ejabberd_hooks:run_fold(privacy_get_user_list, Server,
#userlist{}, [User, Server]),
is_privacy_allow(From, To, Packet, PrivacyList).
@@ -509,8 +552,8 @@ is_privacy_allow(From, To, Packet) ->
%% Check if privacy rules allow this delivery
%% Function copied from ejabberd_c2s.erl
is_privacy_allow(From, To, Packet, PrivacyList) ->
- User = To#jid.user,
- Server = To#jid.server,
+ User = exmpp_jid:prep_node(To),
+ Server = exmpp_jid:prep_domain(To),
allow == ejabberd_hooks:run_fold(
privacy_check_packet, Server,
allow,
@@ -521,8 +564,8 @@ is_privacy_allow(From, To, Packet, PrivacyList) ->
in]).
route_message(From, To, Packet) ->
- LUser = To#jid.luser,
- LServer = To#jid.lserver,
+ LUser = exmpp_jid:prep_node(To),
+ LServer = exmpp_jid:prep_domain(To),
PrioRes = get_user_present_resources(LUser, LServer),
case catch lists:max(PrioRes) of
{Priority, _R} when is_integer(Priority), Priority >= 0 ->
@@ -530,8 +573,7 @@ route_message(From, To, Packet) ->
%% Route messages to all priority that equals the max, if
%% positive
fun({P, R}) when P == Priority ->
- LResource = jlib:resourceprep(R),
- USR = {LUser, LServer, LResource},
+ USR = {LUser, LServer, R},
case mnesia:dirty_index_read(session, USR, #session.usr) of
[] ->
ok; % Race condition
@@ -547,22 +589,23 @@ route_message(From, To, Packet) ->
end,
PrioRes);
_ ->
- case xml:get_tag_attr_s("type", Packet) of
- "error" ->
+ case exmpp_message:get_type(Packet) of
+ 'error' ->
ok;
- "groupchat" ->
+ 'groupchat' ->
bounce_offline_message(From, To, Packet);
- "headline" ->
+ 'headline' ->
bounce_offline_message(From, To, Packet);
_ ->
- case ejabberd_auth:is_user_exists(LUser, LServer) of
+ case ejabberd_auth:is_user_exists(exmpp_jid:prep_node_as_list(To),
+ exmpp_jid:prep_domain_as_list(To)) of
true ->
ejabberd_hooks:run(offline_message_hook,
- LServer,
+ exmpp_jid:prep_domain(To),
[From, To, Packet]);
_ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_SERVICE_UNAVAILABLE),
+ Err = exmpp_stanza:reply_with_error(
+ Packet, 'service-unaivailable'),
ejabberd_router:route(To, From, Err)
end
end
@@ -607,18 +650,16 @@ get_user_present_resources(LUser, LServer) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% On new session, check if some existing connections need to be replace
-check_for_sessions_to_replace(User, Server, Resource) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- LResource = jlib:resourceprep(Resource),
-
+check_for_sessions_to_replace(JID) ->
%% TODO: Depending on how this is executed, there could be an unneeded
%% replacement for max_sessions. We need to check this at some point.
- check_existing_resources(LUser, LServer, LResource),
- check_max_sessions(LUser, LServer).
+ check_existing_resources(JID),
+ check_max_sessions(JID).
-check_existing_resources(LUser, LServer, LResource) ->
- USR = {LUser, LServer, LResource},
+check_existing_resources(JID) ->
+ USR = {exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID)},
%% A connection exist with the same resource. We replace it:
SIDs = mnesia:dirty_select(
session,
@@ -634,14 +675,16 @@ check_existing_resources(LUser, LServer, LResource) ->
end, SIDs)
end.
-check_max_sessions(LUser, LServer) ->
+check_max_sessions(JID) ->
%% If the max number of sessions for a given is reached, we replace the
%% first one
SIDs = mnesia:dirty_select(
session,
- [{#session{sid = '$1', us = {LUser, LServer}, _ = '_'}, [],
+ [{#session{sid = '$1',
+ us = {exmpp_jid:prep_node(JID), exmpp_jid:prep_domain(JID)},
+ _ = '_'}, [],
['$1']}]),
- MaxSessions = get_max_user_sessions(LUser, LServer),
+ MaxSessions = get_max_user_sessions(JID),
if
length(SIDs) =< MaxSessions ->
ok;
@@ -655,9 +698,9 @@ check_max_sessions(LUser, LServer) ->
%% This option defines the max number of time a given users are allowed to
%% log in
%% Defaults to infinity
-get_max_user_sessions(LUser, Host) ->
+get_max_user_sessions(JID) ->
case acl:match_rule(
- Host, max_user_sessions, jlib:make_jid(LUser, Host, "")) of
+ exmpp_jid:prep_domain_as_list(JID), max_user_sessions, exmpp_jid:bare(JID)) of
Max when is_integer(Max) -> Max;
infinity -> infinity;
_ -> ?MAX_USER_SESSIONS
@@ -694,32 +737,30 @@ dec_session_counter(LServer) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
process_iq(From, To, Packet) ->
- IQ = jlib:iq_query_info(Packet),
- case IQ of
- #iq{xmlns = XMLNS} ->
- Host = To#jid.lserver,
- case ets:lookup(sm_iqtable, {XMLNS, Host}) of
+ case exmpp_iq:xmlel_to_iq(Packet) of
+ #iq{kind = request, ns = XMLNS} = IQ_Rec ->
+ LServer = exmpp_jid:prep_domain(To),
+ case ets:lookup(sm_iqtable, {XMLNS, LServer}) of
[{_, Module, Function}] ->
- ResIQ = Module:Function(From, To, IQ),
+ ResIQ = Module:Function(From, To, IQ_Rec),
if
ResIQ /= ignore ->
- ejabberd_router:route(To, From,
- jlib:iq_to_xml(ResIQ));
+ Reply = exmpp_iq:iq_to_xmlel(ResIQ, To, From),
+ ejabberd_router:route(To, From, Reply);
true ->
ok
end;
[{_, Module, Function, Opts}] ->
- gen_iq_handler:handle(Host, Module, Function, Opts,
- From, To, IQ);
+ gen_iq_handler:handle(LServer,
+ Module, Function, Opts, From, To, IQ_Rec);
[] ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_SERVICE_UNAVAILABLE),
+ Err = exmpp_iq:error(Packet, 'service-unavailable'),
ejabberd_router:route(To, From, Err)
end;
- reply ->
+ #iq{kind = response} ->
ok;
_ ->
- Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST),
+ Err = exmpp_iq:error(Packet, 'bad-request'),
ejabberd_router:route(To, From, Err),
ok
end.
@@ -759,7 +800,8 @@ connected_users_number() ->
length(dirty_get_sessions_list()).
user_resources(User, Server) ->
- Resources = get_user_resources(User, Server),
+ Resources = get_user_resources(list_to_binary(User),
+ list_to_binary(Server)),
lists:sort(Resources).
diff --git a/src/ejabberd_system_monitor.erl b/src/ejabberd_system_monitor.erl
index 505b0994b..583340184 100644
--- a/src/ejabberd_system_monitor.erl
+++ b/src/ejabberd_system_monitor.erl
@@ -38,8 +38,9 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(state, {}).
@@ -59,16 +60,16 @@ end,
gen_server:start_link({local, ?MODULE}, ?MODULE, Opts, []).
process_command(From, To, Packet) ->
- case To of
- #jid{luser = "", lresource = "watchdog"} ->
- {xmlelement, Name, _Attrs, _Els} = Packet,
- case Name of
- "message" ->
- LFrom = jlib:jid_tolower(jlib:jid_remove_resource(From)),
- case lists:member(LFrom, get_admin_jids()) of
+ case {exmpp_jid:prep_node(To), exmpp_jid:prep_resource(To) } of
+ {undefined, <<"watchdog">>} ->
+ case Packet#xmlel.name of
+ 'message' ->
+ case lists:any(fun(J) ->
+ exmpp_jid:compare(J,From)
+ end, get_admin_jids()) of
true ->
- Body = xml:get_path_s(
- Packet, [{elem, "body"}, cdata]),
+ Body = exmpp_xml:get_path(
+ Packet, [{element, 'body'}, cdata_as_list]),
spawn(fun() ->
process_flag(priority, high),
process_command1(From, To, Body)
@@ -101,7 +102,8 @@ init(Opts) ->
erlang:system_monitor(self(), [{large_heap, LH}]),
lists:foreach(
fun(Host) ->
- ejabberd_hooks:add(local_send_to_resource_hook, Host,
+ ejabberd_hooks:add(local_send_to_resource_hook,
+ list_to_binary(Host),
?MODULE, process_command, 50)
end, ?MYHOSTS),
{ok, #state{}}.
@@ -188,13 +190,15 @@ process_large_heap(Pid, Info) ->
"(~w) The process ~w is consuming too much memory:~n~p~n"
"~s",
[node(), Pid, Info, DetailedInfo]),
- From = jlib:make_jid("", Host, "watchdog"),
+ From = exmpp_jid:make(undefined, Host, <<"watchdog">>),
lists:foreach(
fun(S) ->
- case jlib:string_to_jid(S) of
- error -> ok;
- JID ->
- send_message(From, JID, Body)
+ try
+ JID = exmpp_jid:parse(S),
+ send_message(From, JID, Body)
+ catch
+ _ ->
+ ok
end
end, JIDs);
_ ->
@@ -204,18 +208,21 @@ process_large_heap(Pid, Info) ->
send_message(From, To, Body) ->
ejabberd_router:route(
From, To,
- {xmlelement, "message", [{"type", "chat"}],
- [{xmlelement, "body", [],
- [{xmlcdata, lists:flatten(Body)}]}]}).
+ exmpp_message:chat(lists:flatten(Body))).
get_admin_jids() ->
case ejabberd_config:get_local_option(watchdog_admins) of
JIDs when is_list(JIDs) ->
lists:flatmap(
fun(S) ->
- case jlib:string_to_jid(S) of
- error -> [];
- JID -> [jlib:jid_tolower(JID)]
+ try
+ JID = exmpp_jid:parse(S),
+ [{exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID)}]
+ catch
+ _ ->
+ []
end
end, JIDs);
_ ->
diff --git a/src/ejd2odbc.erl b/src/ejd2odbc.erl
index 7b5c8ec43..ed1292d09 100644
--- a/src/ejd2odbc.erl
+++ b/src/ejd2odbc.erl
@@ -36,8 +36,9 @@
export_vcard_search/2,
export_private_storage/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_roster.hrl").
-record(offline_msg, {us, timestamp, expire, from, to, packet}).
@@ -88,10 +89,10 @@ export_passwd(Server, Output) ->
export_roster(Server, Output) ->
export_common(
Server, roster, Output,
- fun(Host, #roster{usj = {LUser, LServer, LJID}} = R)
+ fun(Host, #roster{usj = {LUser, LServer, {N, D, Res} = _LJID}} = R)
when LServer == Host ->
Username = ejabberd_odbc:escape(LUser),
- SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)),
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_list(N, D, Res)),
ItemVals = record_to_string(R),
ItemGroups = groups_to_string(R),
["delete from rosterusers "
@@ -123,26 +124,22 @@ export_offline(Server, Output) ->
packet = Packet})
when LServer == Host ->
Username = ejabberd_odbc:escape(LUser),
- {xmlelement, Name, Attrs, Els} = Packet,
- Attrs2 = jlib:replace_from_to_attrs(
- jlib:jid_to_string(From),
- jlib:jid_to_string(To),
- Attrs),
- NewPacket = {xmlelement, Name, Attrs2,
- Els ++
- [jlib:timestamp_to_xml(
- calendar:now_to_universal_time(TimeStamp),
+ Packet0 = exmpp_stanza:set_jids(Packet,
+ exmpp_jid:to_list(From),
+ exmpp_jid:to_list(To)),
+ Packet0b = exmpp_xml:append_child(Packet0,
+ jlib:timestamp_to_xml(
+ calendar:now_to_universal_time(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(
- TimeStamp))]},
+ exmpp_jid:make("", Server, ""),
+ "Offline Storage")),
+ %% TODO: Delete the next three lines once XEP-0091 is Obsolete
+ Packet1 = exmpp_xml:append_child(Packet0b,
+ jlib:timestamp_to_xml(
+ calendar:now_to_universal_time(TimeStamp))),
XML =
ejabberd_odbc:escape(
- lists:flatten(
- xml:element_to_string(NewPacket))),
+ exmpp_xml:document_to_list(Packet1)),
["insert into spool(username, xml) "
"values ('", Username, "', '",
XML,
@@ -176,7 +173,7 @@ export_vcard(Server, Output) ->
when LServer == Host ->
Username = ejabberd_odbc:escape(LUser),
SVCARD = ejabberd_odbc:escape(
- lists:flatten(xml:element_to_string(VCARD))),
+ exmpp_xml:document_to_list(VCARD)),
["delete from vcard where username='", Username, "';"
"insert into vcard(username, vcard) "
"values ('", Username, "', '", SVCARD, "');"];
@@ -260,7 +257,7 @@ export_private_storage(Server, Output) ->
Username = ejabberd_odbc:escape(LUser),
LXMLNS = ejabberd_odbc:escape(XMLNS),
SData = ejabberd_odbc:escape(
- lists:flatten(xml:element_to_string(Data))),
+ exmpp_xml:document_to_list(Data)),
odbc_queries:set_private_data_sql(Username, LXMLNS, SData);
(_Host, _R) ->
[]
@@ -281,7 +278,7 @@ export_common(Server, Table, Output, ConvertFun) ->
mnesia:transaction(
fun() ->
mnesia:read_lock_table(Table),
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
{_N, SQLs} =
mnesia:foldl(
fun(R, {N, SQLs} = Acc) ->
@@ -317,13 +314,13 @@ output(LServer, IO, SQL) ->
file:write(IO, [SQL, $;, $\n])
end.
-record_to_string(#roster{usj = {User, _Server, JID},
+record_to_string(#roster{usj = {User, _Server, {N, D, R} = _JID},
name = Name,
subscription = Subscription,
ask = Ask,
askmessage = AskMessage}) ->
Username = ejabberd_odbc:escape(User),
- SJID = ejabberd_odbc:escape(jlib:jid_to_string(JID)),
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_list(N, D, R)),
Nick = ejabberd_odbc:escape(Name),
SSubscription = case Subscription of
both -> "B";
@@ -356,10 +353,10 @@ record_to_string(#roster{usj = {User, _Server, JID},
"'", SAskMessage, "',"
"'N', '', 'item')"].
-groups_to_string(#roster{usj = {User, _Server, JID},
+groups_to_string(#roster{usj = {User, _Server, {N, D, R} = _JID},
groups = Groups}) ->
Username = ejabberd_odbc:escape(User),
- SJID = ejabberd_odbc:escape(jlib:jid_to_string(JID)),
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_list(N, D, R)),
[["("
"'", Username, "',"
"'", SJID, "',"
diff --git a/src/eldap/eldap_filter.erl b/src/eldap/eldap_filter.erl
index 46510e0d6..d0c795958 100644
--- a/src/eldap/eldap_filter.erl
+++ b/src/eldap/eldap_filter.erl
@@ -182,7 +182,7 @@ parse_attr(less, {Name, Value}, ListOfSubValues) ->
eldap:lessOrEqual(Name, NewValue);
parse_attr(equal, {Name, Value}, ListOfSubValues) ->
- {ok, RegSList} = regexp:split(remove_extra_asterisks(Value), "[*]"),
+ RegSList = re:split(remove_extra_asterisks(Value), "[*]", [{return, list}]),
Pattern = case [do_sub(X, ListOfSubValues) || X <- RegSList] of
[Head | Tail] when Tail /= [] ->
{Head, lists:sublist(Tail, length(Tail)-1), lists:last(Tail)};
@@ -228,14 +228,15 @@ do_sub(S, [{RegExp, New, Times} | T]) ->
do_sub(Result, T).
do_sub(S, {RegExp, New}, Iter) ->
- case regexp:sub(S, RegExp, New) of
- {ok, NewS, 0} ->
+ try re:replace(S, RegExp, New, [{return, list}]) of
+ NewS when NewS == S ->
NewS;
- {ok, NewS, _} when Iter =< ?MAX_RECURSION ->
+ NewS when Iter =< ?MAX_RECURSION ->
do_sub(NewS, {RegExp, New}, Iter+1);
- {ok, _, _} when Iter > ?MAX_RECURSION ->
- throw({regexp, max_substitute_recursion});
- _ ->
+ _ when Iter > ?MAX_RECURSION ->
+ throw({regexp, max_substitute_recursion})
+ catch
+ _:_ ->
throw({regexp, bad_regexp})
end;
@@ -243,14 +244,15 @@ do_sub(S, {_, _, N}, _) when N<1 ->
S;
do_sub(S, {RegExp, New, Times}, Iter) ->
- case regexp:sub(S, RegExp, New) of
- {ok, NewS, 0} ->
+ try re:replace(S, RegExp, New, [{return, list}]) of
+ NewS when NewS == S ->
NewS;
- {ok, NewS, _} when Iter < Times ->
+ NewS when Iter < Times ->
do_sub(NewS, {RegExp, New, Times}, Iter+1);
- {ok, NewS, _} ->
- NewS;
- _ ->
+ NewS ->
+ NewS
+ catch
+ _:_ ->
throw({regexp, bad_regexp})
end.
diff --git a/src/eldap/eldap_utils.erl b/src/eldap/eldap_utils.erl
index e2c13b4f1..0459bee05 100644
--- a/src/eldap/eldap_utils.erl
+++ b/src/eldap/eldap_utils.erl
@@ -89,8 +89,8 @@ get_user_part(String, Pattern) ->
{'EXIT', _} ->
{error, badmatch};
Result ->
- case regexp:sub(Pattern, "%u", Result) of
- {ok, String, _} -> {ok, Result};
+ case re:replace(Pattern, "%u", Result, [{return, list}]) of
+ String -> {ok, Result};
_ -> {error, badmatch}
end
end.
@@ -121,8 +121,8 @@ make_filter(Data, UIDs) ->
end.
case_insensitive_match(X, Y) ->
- X1 = stringprep:tolower(X),
- Y1 = stringprep:tolower(Y),
+ X1 = exmpp_stringprep:to_lower(X),
+ Y1 = exmpp_stringprep:to_lower(Y),
if
X1 == Y1 -> true;
true -> false
diff --git a/src/expat_erl.c b/src/expat_erl.c
deleted file mode 100644
index 19653f61b..000000000
--- a/src/expat_erl.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * ejabberd, Copyright (C) 2002-2009 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
-
-
-#define XML_START 0
-#define XML_END 1
-#define XML_CDATA 2
-#define XML_ERROR 3
-
-#define PARSE_COMMAND 0
-#define PARSE_FINAL_COMMAND 1
-
-ei_x_buff event_buf;
-
-typedef struct {
- ErlDrvPort port;
- XML_Parser parser;
-} expat_data;
-
-void *erlXML_StartElementHandler(expat_data *d,
- const XML_Char *name,
- const XML_Char **atts)
-{
- int i;
-
- ei_x_encode_list_header(&event_buf, 1);
- ei_x_encode_tuple_header(&event_buf, 2);
- ei_x_encode_long(&event_buf, XML_START);
- ei_x_encode_tuple_header(&event_buf, 2);
- ei_x_encode_string(&event_buf, name);
-
- for (i = 0; atts[i]; i += 2) {}
-
- if (i > 0)
- {
- ei_x_encode_list_header(&event_buf, i/2);
-
- for (i = 0; atts[i]; i += 2)
- {
- ei_x_encode_tuple_header(&event_buf, 2);
- ei_x_encode_string(&event_buf, atts[i]);
- ei_x_encode_string(&event_buf, atts[i+1]);
- }
- }
-
- ei_x_encode_empty_list(&event_buf);
-
- return NULL;
-}
-
-void *erlXML_EndElementHandler(expat_data *d,
- const XML_Char *name)
-{
- ei_x_encode_list_header(&event_buf, 1);
- ei_x_encode_tuple_header(&event_buf, 2);
- ei_x_encode_long(&event_buf, XML_END);
- ei_x_encode_string(&event_buf, name);
- return NULL;
-}
-
-void *erlXML_CharacterDataHandler(expat_data *d,
- const XML_Char *s,
- int len)
-{
- ei_x_encode_list_header(&event_buf, 1);
- ei_x_encode_tuple_header(&event_buf, 2);
- ei_x_encode_long(&event_buf, XML_CDATA);
- ei_x_encode_binary(&event_buf, s, len);
- return NULL;
-}
-
-
-static ErlDrvData expat_erl_start(ErlDrvPort port, char *buff)
-{
- expat_data* d = (expat_data*)driver_alloc(sizeof(expat_data));
- d->port = port;
- d->parser = XML_ParserCreate("UTF-8");
- XML_SetUserData(d->parser, d);
-
- set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
-
- XML_SetStartElementHandler(
- d->parser, (XML_StartElementHandler)erlXML_StartElementHandler);
- XML_SetEndElementHandler(
- d->parser, (XML_EndElementHandler)erlXML_EndElementHandler);
- XML_SetCharacterDataHandler(
- d->parser, (XML_CharacterDataHandler)erlXML_CharacterDataHandler);
-
-
- return (ErlDrvData)d;
-}
-
-static void expat_erl_stop(ErlDrvData handle)
-{
- XML_ParserFree(((expat_data *)handle)->parser);
- driver_free((char*)handle);
-}
-
-static int expat_erl_control(ErlDrvData drv_data,
- unsigned int command,
- char *buf, int len,
- char **rbuf, int rlen)
-{
- expat_data* d = (expat_data*)drv_data;
- int res, errcode;
- char *errstring;
- ErlDrvBinary *b;
- size_t size;
-
- switch (command)
- {
- case PARSE_COMMAND:
- case PARSE_FINAL_COMMAND:
- ei_x_new_with_version(&event_buf);
- res = XML_Parse(d->parser, buf, len, command == PARSE_FINAL_COMMAND);
-
- if(!res)
- {
- errcode = XML_GetErrorCode(d->parser);
- errstring = (char *)XML_ErrorString(errcode);
-
- ei_x_encode_list_header(&event_buf, 1);
- ei_x_encode_tuple_header(&event_buf, 2);
- ei_x_encode_long(&event_buf, XML_ERROR);
- ei_x_encode_tuple_header(&event_buf, 2);
- ei_x_encode_long(&event_buf, errcode);
- ei_x_encode_string(&event_buf, errstring);
- }
-
- ei_x_encode_empty_list(&event_buf);
-
- size = event_buf.index;
-
- b = driver_alloc_binary(size);
- memcpy(b->orig_bytes, event_buf.buff, size);
-
- ei_x_free(&event_buf);
-
- *rbuf = (char *)b;
- return size;
- default:
- return 0;
- }
-}
-
-ErlDrvEntry expat_driver_entry = {
- NULL, /* F_PTR init, N/A */
- expat_erl_start, /* L_PTR start, called when port is opened */
- expat_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 */
- "expat_erl", /* char *driver_name, the argument to open_port */
- NULL, /* F_PTR finish, called when unloaded */
- NULL, /* handle */
- expat_erl_control, /* F_PTR control, port_command callback */
- NULL, /* F_PTR timeout, reserved */
- NULL /* F_PTR outputv, reserved */
-};
-
-DRIVER_INIT(expat_erl) /* must match name in driver_entry */
-{
- return &expat_driver_entry;
-}
-
-
diff --git a/src/extauth.erl b/src/extauth.erl
index b363b8016..d216fd18c 100644
--- a/src/extauth.erl
+++ b/src/extauth.erl
@@ -57,7 +57,7 @@ set_password(User, Server, Password) ->
call_port(Server, ["setpass", User, Server, Password]).
call_port(Server, Msg) ->
- LServer = jlib:nameprep(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
gen_mod:get_module_proc(LServer, eauth) ! {call, self(), Msg},
receive
{eauth,Result} ->
diff --git a/src/gen_iq_handler.erl b/src/gen_iq_handler.erl
index a2d4452f3..039a30759 100644
--- a/src/gen_iq_handler.erl
+++ b/src/gen_iq_handler.erl
@@ -41,6 +41,8 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-record(state, {host,
@@ -96,34 +98,34 @@ stop_iq_handler(_Module, _Function, Opts) ->
ok
end.
-handle(Host, Module, Function, Opts, From, To, IQ) ->
+handle(Host, Module, Function, Opts, From, To, IQ_Rec) ->
case Opts of
no_queue ->
- process_iq(Host, Module, Function, From, To, IQ);
+ process_iq(Host, Module, Function, From, To, IQ_Rec);
{one_queue, Pid} ->
- Pid ! {process_iq, From, To, IQ};
+ Pid ! {process_iq, From, To, IQ_Rec};
{queues, Pids} ->
Pid = lists:nth(erlang:phash(now(), length(Pids)), Pids),
- Pid ! {process_iq, From, To, IQ};
+ Pid ! {process_iq, From, To, IQ_Rec};
parallel ->
- spawn(?MODULE, process_iq, [Host, Module, Function, From, To, IQ]);
+ spawn(?MODULE, process_iq,
+ [Host, Module, Function, From, To, IQ_Rec]);
_ ->
todo
end.
-process_iq(_Host, Module, Function, From, To, IQ) ->
- case catch Module:Function(From, To, IQ) of
- {'EXIT', Reason} ->
- ?ERROR_MSG("~p", [Reason]);
+process_iq(_Host, Module, Function, From, To, IQ_Rec) ->
+ try Module:Function(From, To, IQ_Rec) of
+ ignore ->
+ ok;
ResIQ ->
- if
- ResIQ /= ignore ->
- ejabberd_router:route(To, From,
- jlib:iq_to_xml(ResIQ));
- true ->
- ok
- end
+ Reply = exmpp_iq:iq_to_xmlel(ResIQ, To, From),
+ ejabberd_router:route(To, From, Reply)
+ catch
+ _Class:Reason ->
+ ?ERROR_MSG("~s:~s/3 crashed: ~p~n~p~n",
+ [Module, Function, Reason, erlang:get_stacktrace()])
end.
%%====================================================================
@@ -170,11 +172,11 @@ handle_cast(_Msg, State) ->
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
-handle_info({process_iq, From, To, IQ},
+handle_info({process_iq, From, To, IQ_Rec},
#state{host = Host,
module = Module,
function = Function} = State) ->
- process_iq(Host, Module, Function, From, To, IQ),
+ process_iq(Host, Module, Function, From, To, IQ_Rec),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
diff --git a/src/gen_mod.erl b/src/gen_mod.erl
index a37ec51e6..df1ccf0ea 100644
--- a/src/gen_mod.erl
+++ b/src/gen_mod.erl
@@ -173,11 +173,11 @@ get_module_opt(Host, Module, Opt, Default) ->
get_module_opt_host(Host, Module, Default) ->
Val = get_module_opt(Host, Module, host, Default),
- element(2, regexp:gsub(Val, "@HOST@", Host)).
+ re:replace(Val, "@HOST@", Host, [global,{return,list}]).
get_opt_host(Host, Opts, Default) ->
Val = get_opt(host, Opts, Default),
- element(2, regexp:gsub(Val, "@HOST@", Host)).
+ re:replace(Val, "@HOST@", Host, [global,{return,list}]).
loaded_modules(Host) ->
ets:select(ejabberd_modules,
diff --git a/src/jd2ejd.erl b/src/jd2ejd.erl
index c04299801..633e3195b 100644
--- a/src/jd2ejd.erl
+++ b/src/jd2ejd.erl
@@ -31,8 +31,9 @@
-export([import_file/1,
import_dir/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
@@ -43,26 +44,28 @@
import_file(File) ->
User = filename:rootname(filename:basename(File)),
Server = filename:basename(filename:dirname(File)),
- case (jlib:nodeprep(User) /= error) andalso
- (jlib:nameprep(Server) /= error) of
+ case exmpp_stringprep:is_node(User) andalso
+ exmpp_stringprep:is_name(Server) of
true ->
case file:read_file(File) of
{ok, Text} ->
- case xml_stream:parse_element(Text) of
- El when element(1, El) == xmlelement ->
- case catch process_xdb(User, Server, El) of
- {'EXIT', Reason} ->
- ?ERROR_MSG(
- "Error while processing file \"~s\": ~p~n",
- [File, Reason]),
- {error, Reason};
- _ ->
- ok
- end;
- {error, Reason} ->
+ try
+ [El] = exmpp_xml:parse_document(Text,
+ [names_as_atom]),
+ case catch process_xdb(User, Server, El) of
+ {'EXIT', Reason} ->
+ ?ERROR_MSG(
+ "Error while processing file \"~s\": ~p~n",
+ [File, Reason]),
+ {error, Reason};
+ _ ->
+ ok
+ end
+ catch
+ _:Reason1 ->
?ERROR_MSG("Can't parse file \"~s\": ~p~n",
- [File, Reason]),
- {error, Reason}
+ [File, Reason1]),
+ {error, Reason1}
end;
{error, Reason} ->
?ERROR_MSG("Can't read file \"~s\": ~p~n", [File, Reason]),
@@ -100,26 +103,23 @@ import_dir(Dir) ->
%%% Internal functions
%%%----------------------------------------------------------------------
-process_xdb(User, Server, {xmlelement, Name, _Attrs, Els}) ->
- case Name of
- "xdb" ->
- lists:foreach(
- fun(El) ->
- xdb_data(User, Server, El)
- end, Els);
- _ ->
- ok
- end.
+process_xdb(User, Server, #xmlel{name = "xdb", children = Els}) ->
+ lists:foreach(
+ fun(El) ->
+ xdb_data(User, Server, El)
+ end, Els);
+process_xdb(_User, _Server, _El) ->
+ ok.
-xdb_data(_User, _Server, {xmlcdata, _CData}) ->
+xdb_data(_User, _Server, #xmlcdata{}) ->
ok;
-xdb_data(User, Server, {xmlelement, _Name, Attrs, _Els} = El) ->
- From = jlib:make_jid(User, Server, ""),
- LServer = jlib:nameprep(Server),
- case xml:get_attr_s("xmlns", Attrs) of
- ?NS_AUTH ->
- Password = xml:get_tag_cdata(El),
+xdb_data(User, Server, #xmlel{ns = NS} = El) ->
+ From = exmpp_jid:make(User, Server),
+ LServer = exmpp_stringprep:nameprep(Server),
+ case NS of
+ ?NS_LEGACY_AUTH ->
+ Password = exmpp_xml:get_cdata(El),
ejabberd_auth:set_password(User, Server, Password),
ok;
?NS_ROSTER ->
@@ -131,9 +131,9 @@ xdb_data(User, Server, {xmlelement, _Name, Attrs, _Els} = El) ->
catch mod_roster:set_items(User, Server, El)
end,
ok;
- ?NS_LAST ->
- TimeStamp = xml:get_attr_s("last", Attrs),
- Status = xml:get_tag_cdata(El),
+ ?NS_LAST_ACTIVITY ->
+ TimeStamp = exmpp_xml:get_attribute_as_list(El, 'last', ""),
+ Status = exmpp_xml:get_cdata(El),
case lists:member(mod_last_odbc,
gen_mod:loaded_modules(LServer)) of
true ->
@@ -156,29 +156,29 @@ xdb_data(User, Server, {xmlelement, _Name, Attrs, _Els} = El) ->
true ->
catch mod_vcard_odbc:process_sm_iq(
From,
- jlib:make_jid("", Server, ""),
- #iq{type = set, xmlns = ?NS_VCARD, sub_el = El});
+ exmpp_jid:make(Server),
+ #iq{kind = request, type = set, ns = ?NS_VCARD, payload = El, iq_ns = ?NS_JABBER_CLIENT});
false ->
catch mod_vcard:process_sm_iq(
From,
- jlib:make_jid("", Server, ""),
- #iq{type = set, xmlns = ?NS_VCARD, sub_el = El})
+ exmpp_jid:make(Server),
+ #iq{kind = request, type = set, ns = ?NS_VCARD, payload = El, iq_ns = ?NS_JABBER_CLIENT})
end,
ok;
"jabber:x:offline" ->
process_offline(Server, From, El),
ok;
XMLNS ->
- case xml:get_attr_s("j_private_flag", Attrs) of
+ case exmpp_xml:get_attribute_as_list(El, "j_private_flag", "") of
"1" ->
catch mod_private:process_sm_iq(
From,
- jlib:make_jid("", Server, ""),
- #iq{type = set, xmlns = ?NS_PRIVATE,
- sub_el = {xmlelement, "query", [],
- [jlib:remove_attr(
- "j_private_flag",
- jlib:remove_attr("xdbns", El))]}});
+ exmpp_jid:make(Server),
+ #iq{kind = request, type = set, ns = ?NS_PRIVATE,
+ iq_ns = ?NS_JABBER_CLIENT,
+ payload = #xmlel{name = 'query', children =
+ [exmpp_xml:remove_attribute(
+ exmpp_xml:remove_attribute(El, "xdbns"), "j_private_flag")]}});
_ ->
?DEBUG("jd2ejd: Unknown namespace \"~s\"~n", [XMLNS])
end,
@@ -186,15 +186,20 @@ xdb_data(User, Server, {xmlelement, _Name, Attrs, _Els} = El) ->
end.
-process_offline(Server, To, {xmlelement, _, _, Els}) ->
- LServer = jlib:nameprep(Server),
- lists:foreach(fun({xmlelement, _, Attrs, _} = El) ->
- FromS = xml:get_attr_s("from", Attrs),
+process_offline(Server, To, #xmlel{children = Els}) ->
+ LServer = exmpp_stringprep:nameprep(Server),
+ lists:foreach(fun(#xmlel{} = El) ->
+ FromS = exmpp_stanza:get_sender(El),
From = case FromS of
- "" ->
- jlib:make_jid("", Server, "");
+ undefined ->
+ exmpp_jid:make(Server);
_ ->
- jlib:string_to_jid(FromS)
+ try
+ exmpp_jid:parse(FromS)
+ catch
+ _ ->
+ error
+ end
end,
case From of
error ->
diff --git a/src/jlib.erl b/src/jlib.erl
index de75ca0a9..abe4ff869 100644
--- a/src/jlib.erl
+++ b/src/jlib.erl
@@ -27,34 +27,7 @@
-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,
+-export([parse_xdata_submit/1,
timestamp_to_iso/1, % TODO: Remove once XEP-0091 is Obsolete
timestamp_to_iso/2,
timestamp_to_xml/4,
@@ -67,390 +40,24 @@
ip_to_list/1,
rsm_encode/1,
rsm_encode/2,
- rsm_decode/1]).
+ rsm_decode/1,
+ from_old_jid/1,
+ short_jid/1,
+ short_bare_jid/1,
+ short_prepd_jid/1,
+ short_prepd_bare_jid/1]).
+
+-include_lib("exmpp/include/exmpp.hrl").
-include("jlib.hrl").
-%send_iq(From, To, ID, SubTags) ->
-% ok.
+%% @type shortjid() = {U, S, R}
+%% U = binary()
+%% S = binary()
+%% R = binary().
-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(_) ->
- "".
-
-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);
- _ -> invalid
- end,
- FilteredEls};
- _ ->
- {invalid, invalid}
- 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
+parse_xdata_submit(#xmlel{attrs = Attrs, children = Els}) ->
+ case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'type', "") of
"submit" ->
lists:reverse(parse_xdata_fields(Els, []));
_ ->
@@ -459,61 +66,51 @@ parse_xdata_submit(El) ->
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)
+parse_xdata_fields([#xmlel{name = 'field', attrs = Attrs, children = SubEls} |
+ Els], Res) ->
+ case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'var', "") 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) ->
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([#xmlel{name = 'value', children = SubEls} | Els], Res) ->
+ Val = exmpp_xml:get_cdata_from_list_as_list(SubEls),
+ parse_xdata_values(Els, [Val | Res]);
parse_xdata_values([_ | Els], Res) ->
parse_xdata_values(Els, Res).
-rsm_decode(#iq{sub_el=SubEl})->
+rsm_decode(#iq{payload=SubEl})->
rsm_decode(SubEl);
-rsm_decode({xmlelement, _,_,_}=SubEl)->
- case xml:get_subtag(SubEl,"set") of
- false ->
+rsm_decode(#xmlel{}=SubEl)->
+ case exmpp_xml:get_element(SubEl, 'set') of
+ undefined ->
none;
- {xmlelement, "set", _Attrs, SubEls}->
+ #xmlel{name = 'set', children = 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),
+rsm_parse_element(#xmlel{name = 'max'}=Elem, RsmIn)->
+ CountStr = exmpp_xml:get_cdata_as_list(Elem),
{Count, _} = string:to_integer(CountStr),
RsmIn#rsm_in{max=Count};
-rsm_parse_element({xmlelement, "before", [], _}=Elem, RsmIn)->
- UID = xml:get_tag_cdata(Elem),
+rsm_parse_element(#xmlel{name = 'before'}=Elem, RsmIn)->
+ UID = exmpp_xml:get_cdata_as_list(Elem),
RsmIn#rsm_in{direction=before, id=UID};
-rsm_parse_element({xmlelement, "after", [], _}=Elem, RsmIn)->
- UID = xml:get_tag_cdata(Elem),
+rsm_parse_element(#xmlel{name = 'after'}=Elem, RsmIn)->
+ UID = exmpp_xml:get_cdata_as_list(Elem),
RsmIn#rsm_in{direction=aft, id=UID};
-rsm_parse_element({xmlelement, "index",[], _}=Elem, RsmIn)->
- IndexStr = xml:get_tag_cdata(Elem),
+rsm_parse_element(#xmlel{name = 'index'}=Elem, RsmIn)->
+ IndexStr = exmpp_xml:get_cdata_as_list(Elem),
{Index, _} = string:to_integer(IndexStr),
RsmIn#rsm_in{index=Index};
@@ -521,17 +118,16 @@ rsm_parse_element({xmlelement, "index",[], _}=Elem, RsmIn)->
rsm_parse_element(_, RsmIn)->
RsmIn.
-rsm_encode(#iq{sub_el=SubEl}=IQ,RsmOut)->
- Set = {xmlelement, "set", [{"xmlns", ?NS_RSM}],
+rsm_encode(#iq{payload=SubEl}=IQ_Rec,RsmOut)->
+ Set = #xmlel{ns = ?NS_RSM, name = 'set', children =
lists:reverse(rsm_encode_out(RsmOut))},
- {xmlelement, Name, Attrs, SubEls} = SubEl,
- New = {xmlelement, Name, Attrs, [Set | SubEls]},
- IQ#iq{sub_el=New}.
+ New = exmpp_xml:prepend_child(SubEl, Set),
+ IQ_Rec#iq{payload=New}.
rsm_encode(none)->
[];
rsm_encode(RsmOut)->
- [{xmlelement, "set", [{"xmlns", ?NS_RSM}], lists:reverse(rsm_encode_out(RsmOut))}].
+ [#xmlel{ns = ?NS_RSM, name = 'set', children = 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),
@@ -540,39 +136,37 @@ rsm_encode_out(#rsm_out{count=Count, index=Index, first=First, last=Last})->
rsm_encode_first(undefined, undefined, Arr) ->
Arr;
rsm_encode_first(First, undefined, Arr) ->
- [{xmlelement, "first",[], [{xmlcdata, First}]}|Arr];
+ [#xmlel{ns = ?NS_RSM, name = 'first', children = [#xmlcdata{cdata = list_to_binary(First)}]}|Arr];
rsm_encode_first(First, Index, Arr) ->
- [{xmlelement, "first",[{"index", i2l(Index)}], [{xmlcdata, First}]}|Arr].
+ [#xmlel{ns = ?NS_RSM, name = 'first', attrs = [?XMLATTR('index', Index)], children = [#xmlcdata{cdata = list_to_binary(First)}]}|Arr].
rsm_encode_last(undefined, Arr) -> Arr;
rsm_encode_last(Last, Arr) ->
- [{xmlelement, "last",[], [{xmlcdata, Last}]}|Arr].
+ [#xmlel{ns = ?NS_RSM, name = 'last', children = [#xmlcdata{cdata = list_to_binary(Last)}]}|Arr].
rsm_encode_count(undefined, Arr)-> Arr;
rsm_encode_count(Count, Arr)->
- [{xmlelement, "count",[], [{xmlcdata, i2l(Count)}]} | Arr].
+ [#xmlel{ns = ?NS_RSM, name = 'count', children = [#xmlcdata{cdata = i2b(Count)}]} | Arr].
-i2l(I) when is_integer(I) -> integer_to_list(I);
-i2l(L) when is_list(L) -> L.
+i2b(I) when is_integer(I) -> list_to_binary(integer_to_list(I));
+i2b(L) when is_list(L) -> list_to_binary(L).
%% Timezone = utc | {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";
- {TZh, TZm} ->
+ 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";
+ {TZh, TZm} ->
Sign = case TZh >= 0 of
- true -> "+";
- false -> "-"
- end,
+ true -> "+";
+ false -> "-"
+ end,
io_lib:format("~s~2..0w:~2..0w", [Sign, abs(TZh),TZm])
- end,
+ end,
{Timestamp_string, Timezone_string}.
timestamp_to_iso({{Year, Month, Day}, {Hour, Minute, Second}}) ->
@@ -582,22 +176,19 @@ timestamp_to_iso({{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}.
+ From = exmpp_jid:to_list(FromJID),
+ P1 = exmpp_xml:set_attributes(#xmlel{ns = ?NS_DELAY, name = 'delay'},
+ [{'from', From},
+ {'stamp', T_string ++ Tz_string}]),
+ exmpp_xml:set_cdata(P1, Desc).
%% 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]))}],
- []}.
+ Timestamp = lists:flatten(
+ io_lib:format("~4..0w~2..0w~2..0wT~2..0w:~2..0w:~2..0w",
+ [Year, Month, Day, Hour, Minute, Second])),
+ exmpp_xml:set_attribute(#xmlel{ns = ?NS_DELAY_OLD, name = 'x'},
+ 'stamp', Timestamp).
now_to_utc_string({MegaSecs, Secs, MicroSecs}) ->
{{Year, Month, Day}, {Hour, Minute, Second}} =
@@ -793,3 +384,38 @@ ip_to_list({IP, _Port}) ->
ip_to_list(IP);
ip_to_list({A,B,C,D}) ->
lists:flatten(io_lib:format("~w.~w.~w.~w",[A,B,C,D])).
+
+% --------------------------------------------------------------------
+% Compat layer.
+% --------------------------------------------------------------------
+
+%% @spec (JID) -> New_JID
+%% JID = jid()
+%% New_JID = jid()
+%% @doc Convert a JID from its ejabberd form to its exmpp form.
+%%
+%% Empty fields are set to `undefined', not the empty string.
+
+%%TODO: this doesn't make sence!, it is still used?.
+from_old_jid(JID) ->
+ Node = exmpp_jid:node(JID),
+ Resource = exmpp_jid:resource(JID),
+ Domain = exmpp_jid:domain(JID),
+ exmpp_jid:make(Node,Domain,Resource).
+
+
+short_jid(JID) ->
+ {exmpp_jid:node(JID), exmpp_jid:domain(JID), exmpp_jid:resource(JID)}.
+
+short_bare_jid(JID) ->
+ short_jid(exmpp_jid:bare(JID)).
+
+short_prepd_jid(JID) ->
+ {exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID),
+ exmpp_jid:prep_resource(JID)}.
+
+short_prepd_bare_jid(JID) ->
+ short_prepd_jid(exmpp_jid:bare(JID)).
+
+
diff --git a/src/jlib.hrl b/src/jlib.hrl
index 9e268642e..02e419b28 100644
--- a/src/jlib.hrl
+++ b/src/jlib.hrl
@@ -19,308 +19,11 @@
%%%
%%%----------------------------------------------------------------------
--define(NS_DISCO_ITEMS, "http://jabber.org/protocol/disco#items").
--define(NS_DISCO_INFO, "http://jabber.org/protocol/disco#info").
--define(NS_VCARD, "vcard-temp").
--define(NS_AUTH, "jabber:iq:auth").
--define(NS_AUTH_ERROR, "jabber:iq:auth:error").
--define(NS_REGISTER, "jabber:iq:register").
--define(NS_SEARCH, "jabber:iq:search").
--define(NS_ROSTER, "jabber:iq:roster").
--define(NS_ROSTER_VER, "urn:xmpp:features:rosterver").
--define(NS_PRIVACY, "jabber:iq:privacy").
--define(NS_PRIVATE, "jabber:iq:private").
--define(NS_VERSION, "jabber:iq:version").
--define(NS_TIME90, "jabber:iq:time"). % TODO: Remove once XEP-0090 is Obsolete
--define(NS_TIME, "urn:xmpp:time").
--define(NS_LAST, "jabber:iq:last").
--define(NS_XDATA, "jabber:x:data").
--define(NS_IQDATA, "jabber:iq:data").
--define(NS_DELAY91, "jabber:x:delay"). % TODO: Remove once XEP-0091 is Obsolete
--define(NS_DELAY, "urn:xmpp:delay").
--define(NS_EXPIRE, "jabber:x:expire").
--define(NS_EVENT, "jabber:x:event").
--define(NS_CHATSTATES, "http://jabber.org/protocol/chatstates").
--define(NS_XCONFERENCE, "jabber:x:conference").
--define(NS_STATS, "http://jabber.org/protocol/stats").
--define(NS_MUC, "http://jabber.org/protocol/muc").
--define(NS_MUC_USER, "http://jabber.org/protocol/muc#user").
--define(NS_MUC_ADMIN, "http://jabber.org/protocol/muc#admin").
--define(NS_MUC_OWNER, "http://jabber.org/protocol/muc#owner").
--define(NS_PUBSUB, "http://jabber.org/protocol/pubsub").
--define(NS_PUBSUB_EVENT, "http://jabber.org/protocol/pubsub#event").
--define(NS_PUBSUB_OWNER, "http://jabber.org/protocol/pubsub#owner").
--define(NS_PUBSUB_NMI, "http://jabber.org/protocol/pubsub#node-meta-info").
--define(NS_PUBSUB_ERRORS,"http://jabber.org/protocol/pubsub#errors").
--define(NS_PUBSUB_NODE_CONFIG, "http://jabber.org/protocol/pubsub#node_config").
--define(NS_PUBSUB_SUB_OPTIONS, "http://jabber.org/protocol/pubsub#subscribe_options").
--define(NS_PUBSUB_SUB_AUTH, "http://jabber.org/protocol/pubsub#subscribe_authorization").
--define(NS_PUBSUB_GET_PENDING, "http://jabber.org/protocol/pubsub#get-pending").
--define(NS_COMMANDS, "http://jabber.org/protocol/commands").
--define(NS_BYTESTREAMS, "http://jabber.org/protocol/bytestreams").
--define(NS_ADMIN, "http://jabber.org/protocol/admin").
--define(NS_SERVERINFO, "http://jabber.org/network/serverinfo").
-
--define(NS_RSM, "http://jabber.org/protocol/rsm").
--define(NS_EJABBERD_CONFIG, "ejabberd:config").
-
--define(NS_STREAM, "http://etherx.jabber.org/streams").
-
--define(NS_STANZAS, "urn:ietf:params:xml:ns:xmpp-stanzas").
--define(NS_STREAMS, "urn:ietf:params:xml:ns:xmpp-streams").
-
--define(NS_TLS, "urn:ietf:params:xml:ns:xmpp-tls").
--define(NS_SASL, "urn:ietf:params:xml:ns:xmpp-sasl").
--define(NS_SESSION, "urn:ietf:params:xml:ns:xmpp-session").
--define(NS_BIND, "urn:ietf:params:xml:ns:xmpp-bind").
-
--define(NS_FEATURE_IQAUTH, "http://jabber.org/features/iq-auth").
--define(NS_FEATURE_IQREGISTER, "http://jabber.org/features/iq-register").
--define(NS_FEATURE_COMPRESS, "http://jabber.org/features/compress").
--define(NS_FEATURE_MSGOFFLINE, "msgoffline").
-
--define(NS_COMPRESS, "http://jabber.org/protocol/compress").
-
--define(NS_CAPS, "http://jabber.org/protocol/caps").
--define(NS_SHIM, "http://jabber.org/protocol/shim").
-
%% CAPTCHA related NSes.
-define(NS_OOB, "jabber:x:oob").
-define(NS_CAPTCHA, "urn:xmpp:captcha").
-define(NS_MEDIA, "urn:xmpp:media-element").
-define(NS_BOB, "urn:xmpp:bob").
-% TODO: remove "code" attribute (currently it used for backward-compatibility)
--define(STANZA_ERROR(Code, Type, Condition),
- {xmlelement, "error",
- [{"code", Code}, {"type", Type}],
- [{xmlelement, Condition, [{"xmlns", ?NS_STANZAS}], []}]}).
-
--define(ERR_BAD_REQUEST,
- ?STANZA_ERROR("400", "modify", "bad-request")).
--define(ERR_CONFLICT,
- ?STANZA_ERROR("409", "cancel", "conflict")).
--define(ERR_FEATURE_NOT_IMPLEMENTED,
- ?STANZA_ERROR("501", "cancel", "feature-not-implemented")).
--define(ERR_FORBIDDEN,
- ?STANZA_ERROR("403", "auth", "forbidden")).
--define(ERR_GONE,
- ?STANZA_ERROR("302", "modify", "gone")).
--define(ERR_INTERNAL_SERVER_ERROR,
- ?STANZA_ERROR("500", "wait", "internal-server-error")).
--define(ERR_ITEM_NOT_FOUND,
- ?STANZA_ERROR("404", "cancel", "item-not-found")).
--define(ERR_JID_MALFORMED,
- ?STANZA_ERROR("400", "modify", "jid-malformed")).
--define(ERR_NOT_ACCEPTABLE,
- ?STANZA_ERROR("406", "modify", "not-acceptable")).
--define(ERR_NOT_ALLOWED,
- ?STANZA_ERROR("405", "cancel", "not-allowed")).
--define(ERR_NOT_AUTHORIZED,
- ?STANZA_ERROR("401", "auth", "not-authorized")).
--define(ERR_PAYMENT_REQUIRED,
- ?STANZA_ERROR("402", "auth", "payment-required")).
--define(ERR_RECIPIENT_UNAVAILABLE,
- ?STANZA_ERROR("404", "wait", "recipient-unavailable")).
--define(ERR_REDIRECT,
- ?STANZA_ERROR("302", "modify", "redirect")).
--define(ERR_REGISTRATION_REQUIRED,
- ?STANZA_ERROR("407", "auth", "registration-required")).
--define(ERR_REMOTE_SERVER_NOT_FOUND,
- ?STANZA_ERROR("404", "cancel", "remote-server-not-found")).
--define(ERR_REMOTE_SERVER_TIMEOUT,
- ?STANZA_ERROR("504", "wait", "remote-server-timeout")).
--define(ERR_RESOURCE_CONSTRAINT,
- ?STANZA_ERROR("500", "wait", "resource-constraint")).
--define(ERR_SERVICE_UNAVAILABLE,
- ?STANZA_ERROR("503", "cancel", "service-unavailable")).
--define(ERR_SUBSCRIPTION_REQUIRED,
- ?STANZA_ERROR("407", "auth", "subscription-required")).
--define(ERR_UNEXPECTED_REQUEST,
- ?STANZA_ERROR("400", "wait", "unexpected-request")).
-%-define(ERR_,
-% ?STANZA_ERROR("", "", "")).
-
--define(STANZA_ERRORT(Code, Type, Condition, Lang, Text),
- {xmlelement, "error",
- [{"code", Code}, {"type", Type}],
- [{xmlelement, Condition, [{"xmlns", ?NS_STANZAS}], []},
- {xmlelement, "text", [{"xmlns", ?NS_STANZAS}],
- [{xmlcdata, translate:translate(Lang, Text)}]}]}).
-
--define(ERRT_BAD_REQUEST(Lang, Text),
- ?STANZA_ERRORT("400", "modify", "bad-request", Lang, Text)).
--define(ERRT_CONFLICT(Lang, Text),
- ?STANZA_ERRORT("409", "cancel", "conflict", Lang, Text)).
--define(ERRT_FEATURE_NOT_IMPLEMENTED(Lang, Text),
- ?STANZA_ERRORT("501", "cancel", "feature-not-implemented", Lang, Text)).
--define(ERRT_FORBIDDEN(Lang, Text),
- ?STANZA_ERRORT("403", "auth", "forbidden", Lang, Text)).
--define(ERRT_GONE(Lang, Text),
- ?STANZA_ERRORT("302", "modify", "gone", Lang, Text)).
--define(ERRT_INTERNAL_SERVER_ERROR(Lang, Text),
- ?STANZA_ERRORT("500", "wait", "internal-server-error", Lang, Text)).
--define(ERRT_ITEM_NOT_FOUND(Lang, Text),
- ?STANZA_ERRORT("404", "cancel", "item-not-found", Lang, Text)).
--define(ERRT_JID_MALFORMED(Lang, Text),
- ?STANZA_ERRORT("400", "modify", "jid-malformed", Lang, Text)).
--define(ERRT_NOT_ACCEPTABLE(Lang, Text),
- ?STANZA_ERRORT("406", "modify", "not-acceptable", Lang, Text)).
--define(ERRT_NOT_ALLOWED(Lang, Text),
- ?STANZA_ERRORT("405", "cancel", "not-allowed", Lang, Text)).
--define(ERRT_NOT_AUTHORIZED(Lang, Text),
- ?STANZA_ERRORT("401", "auth", "not-authorized", Lang, Text)).
--define(ERRT_PAYMENT_REQUIRED(Lang, Text),
- ?STANZA_ERRORT("402", "auth", "payment-required", Lang, Text)).
--define(ERRT_RECIPIENT_UNAVAILABLE(Lang, Text),
- ?STANZA_ERRORT("404", "wait", "recipient-unavailable", Lang, Text)).
--define(ERRT_REDIRECT(Lang, Text),
- ?STANZA_ERRORT("302", "modify", "redirect", Lang, Text)).
--define(ERRT_REGISTRATION_REQUIRED(Lang, Text),
- ?STANZA_ERRORT("407", "auth", "registration-required", Lang, Text)).
--define(ERRT_REMOTE_SERVER_NOT_FOUND(Lang, Text),
- ?STANZA_ERRORT("404", "cancel", "remote-server-not-found", Lang, Text)).
--define(ERRT_REMOTE_SERVER_TIMEOUT(Lang, Text),
- ?STANZA_ERRORT("504", "wait", "remote-server-timeout", Lang, Text)).
--define(ERRT_RESOURCE_CONSTRAINT(Lang, Text),
- ?STANZA_ERRORT("500", "wait", "resource-constraint", Lang, Text)).
--define(ERRT_SERVICE_UNAVAILABLE(Lang, Text),
- ?STANZA_ERRORT("503", "cancel", "service-unavailable", Lang, Text)).
--define(ERRT_SUBSCRIPTION_REQUIRED(Lang, Text),
- ?STANZA_ERRORT("407", "auth", "subscription-required", Lang, Text)).
--define(ERRT_UNEXPECTED_REQUEST(Lang, Text),
- ?STANZA_ERRORT("400", "wait", "unexpected-request", Lang, Text)).
-
-% Auth stanza errors
--define(ERR_AUTH_NO_RESOURCE_PROVIDED(Lang),
- ?ERRT_NOT_ACCEPTABLE(Lang, "No resource provided")).
--define(ERR_AUTH_BAD_RESOURCE_FORMAT(Lang),
- ?ERRT_NOT_ACCEPTABLE(Lang, "Illegal resource format")).
--define(ERR_AUTH_RESOURCE_CONFLICT(Lang),
- ?ERRT_CONFLICT(Lang, "Resource conflict")).
-
-
--define(STREAM_ERROR(Condition),
- {xmlelement, "stream:error",
- [],
- [{xmlelement, Condition, [{"xmlns", ?NS_STREAMS}], []}]}).
-
--define(SERR_BAD_FORMAT,
- ?STREAM_ERROR("bad-format")).
--define(SERR_BAD_NAMESPACE_PREFIX,
- ?STREAM_ERROR("bad-namespace-prefix")).
--define(SERR_CONFLICT,
- ?STREAM_ERROR("conflict")).
--define(SERR_CONNECTION_TIMEOUT,
- ?STREAM_ERROR("connection-timeout")).
--define(SERR_HOST_GONE,
- ?STREAM_ERROR("host-gone")).
--define(SERR_HOST_UNKNOWN,
- ?STREAM_ERROR("host-unknown")).
--define(SERR_IMPROPER_ADDRESSING,
- ?STREAM_ERROR("improper-addressing")).
--define(SERR_INTERNAL_SERVER_ERROR,
- ?STREAM_ERROR("internal-server-error")).
--define(SERR_INVALID_FROM,
- ?STREAM_ERROR("invalid-from")).
--define(SERR_INVALID_ID,
- ?STREAM_ERROR("invalid-id")).
--define(SERR_INVALID_NAMESPACE,
- ?STREAM_ERROR("invalid-namespace")).
--define(SERR_INVALID_XML,
- ?STREAM_ERROR("invalid-xml")).
--define(SERR_NOT_AUTHORIZED,
- ?STREAM_ERROR("not-authorized")).
--define(SERR_POLICY_VIOLATION,
- ?STREAM_ERROR("policy-violation")).
--define(SERR_REMOTE_CONNECTION_FAILED,
- ?STREAM_ERROR("remote-connection-failed")).
--define(SERR_RESOURSE_CONSTRAINT,
- ?STREAM_ERROR("resource-constraint")).
--define(SERR_RESTRICTED_XML,
- ?STREAM_ERROR("restricted-xml")).
-% TODO: include hostname or IP
--define(SERR_SEE_OTHER_HOST,
- ?STREAM_ERROR("see-other-host")).
--define(SERR_SYSTEM_SHUTDOWN,
- ?STREAM_ERROR("system-shutdown")).
--define(SERR_UNSUPPORTED_ENCODING,
- ?STREAM_ERROR("unsupported-encoding")).
--define(SERR_UNSUPPORTED_STANZA_TYPE,
- ?STREAM_ERROR("unsupported-stanza-type")).
--define(SERR_UNSUPPORTED_VERSION,
- ?STREAM_ERROR("unsupported-version")).
--define(SERR_XML_NOT_WELL_FORMED,
- ?STREAM_ERROR("xml-not-well-formed")).
-%-define(SERR_,
-% ?STREAM_ERROR("")).
-
--define(STREAM_ERRORT(Condition, Lang, Text),
- {xmlelement, "stream:error",
- [],
- [{xmlelement, Condition, [{"xmlns", ?NS_STREAMS}], []},
- {xmlelement, "text", [{"xml:lang", Lang}, {"xmlns", ?NS_STREAMS}],
- [{xmlcdata, translate:translate(Lang, Text)}]}]}).
-
--define(SERRT_BAD_FORMAT(Lang, Text),
- ?STREAM_ERRORT("bad-format", Lang, Text)).
--define(SERRT_BAD_NAMESPACE_PREFIX(Lang, Text),
- ?STREAM_ERRORT("bad-namespace-prefix", Lang, Text)).
--define(SERRT_CONFLICT(Lang, Text),
- ?STREAM_ERRORT("conflict", Lang, Text)).
--define(SERRT_CONNECTION_TIMEOUT(Lang, Text),
- ?STREAM_ERRORT("connection-timeout", Lang, Text)).
--define(SERRT_HOST_GONE(Lang, Text),
- ?STREAM_ERRORT("host-gone", Lang, Text)).
--define(SERRT_HOST_UNKNOWN(Lang, Text),
- ?STREAM_ERRORT("host-unknown", Lang, Text)).
--define(SERRT_IMPROPER_ADDRESSING(Lang, Text),
- ?STREAM_ERRORT("improper-addressing", Lang, Text)).
--define(SERRT_INTERNAL_SERVER_ERROR(Lang, Text),
- ?STREAM_ERRORT("internal-server-error", Lang, Text)).
--define(SERRT_INVALID_FROM(Lang, Text),
- ?STREAM_ERRORT("invalid-from", Lang, Text)).
--define(SERRT_INVALID_ID(Lang, Text),
- ?STREAM_ERRORT("invalid-id", Lang, Text)).
--define(SERRT_INVALID_NAMESPACE(Lang, Text),
- ?STREAM_ERRORT("invalid-namespace", Lang, Text)).
--define(SERRT_INVALID_XML(Lang, Text),
- ?STREAM_ERRORT("invalid-xml", Lang, Text)).
--define(SERRT_NOT_AUTHORIZED(Lang, Text),
- ?STREAM_ERRORT("not-authorized", Lang, Text)).
--define(SERRT_POLICY_VIOLATION(Lang, Text),
- ?STREAM_ERRORT("policy-violation", Lang, Text)).
--define(SERRT_REMOTE_CONNECTION_FAILED(Lang, Text),
- ?STREAM_ERRORT("remote-connection-failed", Lang, Text)).
--define(SERRT_RESOURSE_CONSTRAINT(Lang, Text),
- ?STREAM_ERRORT("resource-constraint", Lang, Text)).
--define(SERRT_RESTRICTED_XML(Lang, Text),
- ?STREAM_ERRORT("restricted-xml", Lang, Text)).
-% TODO: include hostname or IP
--define(SERRT_SEE_OTHER_HOST(Lang, Text),
- ?STREAM_ERRORT("see-other-host", Lang, Text)).
--define(SERRT_SYSTEM_SHUTDOWN(Lang, Text),
- ?STREAM_ERRORT("system-shutdown", Lang, Text)).
--define(SERRT_UNSUPPORTED_ENCODING(Lang, Text),
- ?STREAM_ERRORT("unsupported-encoding", Lang, Text)).
--define(SERRT_UNSUPPORTED_STANZA_TYPE(Lang, Text),
- ?STREAM_ERRORT("unsupported-stanza-type", Lang, Text)).
--define(SERRT_UNSUPPORTED_VERSION(Lang, Text),
- ?STREAM_ERRORT("unsupported-version", Lang, Text)).
--define(SERRT_XML_NOT_WELL_FORMED(Lang, Text),
- ?STREAM_ERRORT("xml-not-well-formed", Lang, Text)).
-%-define(SERRT_(Lang, Text),
-% ?STREAM_ERRORT("", Lang, Text)).
-
-
--record(jid, {user, server, resource,
- luser, lserver, lresource}).
-
--record(iq, {id = "",
- type,
- xmlns = "",
- lang = "",
- sub_el}).
-
-record(rsm_in, {max, direction, id, index}).
-record(rsm_out, {count, index, first, last}).
diff --git a/src/mod_adhoc.erl b/src/mod_adhoc.erl
index 811561bf7..782465a30 100644
--- a/src/mod_adhoc.erl
+++ b/src/mod_adhoc.erl
@@ -42,43 +42,48 @@
ping_item/4,
ping_command/4]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("adhoc.hrl").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_COMMANDS,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_ADHOC,
?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_COMMANDS,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_ADHOC,
?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).
+ ejabberd_hooks:add(disco_local_identity, HostB, ?MODULE, get_local_identity, 99),
+ ejabberd_hooks:add(disco_local_features, HostB, ?MODULE, get_local_features, 99),
+ ejabberd_hooks:add(disco_local_items, HostB, ?MODULE, get_local_commands, 99),
+ ejabberd_hooks:add(disco_sm_identity, HostB, ?MODULE, get_sm_identity, 99),
+ ejabberd_hooks:add(disco_sm_features, HostB, ?MODULE, get_sm_features, 99),
+ ejabberd_hooks:add(disco_sm_items, HostB, ?MODULE, get_sm_commands, 99),
+ ejabberd_hooks:add(adhoc_local_items, HostB, ?MODULE, ping_item, 100),
+ ejabberd_hooks:add(adhoc_local_commands, HostB, ?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),
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(adhoc_local_commands, HostB, ?MODULE, ping_command, 100),
+ ejabberd_hooks:delete(adhoc_local_items, HostB, ?MODULE, ping_item, 100),
+ ejabberd_hooks:delete(disco_sm_items, HostB, ?MODULE, get_sm_commands, 99),
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 99),
+ ejabberd_hooks:delete(disco_sm_identity, HostB, ?MODULE, get_sm_identity, 99),
+ ejabberd_hooks:delete(disco_local_items, HostB, ?MODULE, get_local_commands, 99),
+ ejabberd_hooks:delete(disco_local_features, HostB, ?MODULE, get_local_features, 99),
+ ejabberd_hooks:delete(disco_local_identity, HostB, ?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).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_ADHOC),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_ADHOC).
%-------------------------------------------------------------------------
-get_local_commands(Acc, _From, #jid{server = Server, lserver = LServer} = _To, "", Lang) ->
+get_local_commands(Acc, _From, To, <<>>, Lang) ->
+ Server = exmpp_jid:domain(To),
+ LServer = exmpp_jid:prep_domain_as_list(To),
Display = gen_mod:get_module_opt(LServer, ?MODULE, report_commands_node, false),
case Display of
false ->
@@ -88,19 +93,19 @@ get_local_commands(Acc, _From, #jid{server = Server, lserver = LServer} = _To, "
{result, I} -> I;
_ -> []
end,
- Nodes = [{xmlelement,
- "item",
- [{"jid", Server},
- {"node", ?NS_COMMANDS},
- {"name", translate:translate(Lang, "Commands")}],
- []}],
+ Nodes = [#xmlel{ns = ?NS_DISCO_ITEMS,
+ name = 'item', attrs =
+ [?XMLATTR('jid', Server),
+ ?XMLATTR('node', ?NS_ADHOC_s),
+ ?XMLATTR('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, ?NS_ADHOC_b, Lang) ->
+ ejabberd_hooks:run_fold(adhoc_local_items, exmpp_jid:prep_domain(To), {result, []}, [From, To, Lang]);
-get_local_commands(_Acc, _From, _To, "ping", _Lang) ->
+get_local_commands(_Acc, _From, _To, <<"ping">>, _Lang) ->
{result, []};
get_local_commands(Acc, _From, _To, _Node, _Lang) ->
@@ -108,7 +113,8 @@ get_local_commands(Acc, _From, _To, _Node, _Lang) ->
%-------------------------------------------------------------------------
-get_sm_commands(Acc, _From, #jid{lserver = LServer} = To, "", Lang) ->
+get_sm_commands(Acc, _From, To, <<>>, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
Display = gen_mod:get_module_opt(LServer, ?MODULE, report_commands_node, false),
case Display of
false ->
@@ -118,17 +124,17 @@ get_sm_commands(Acc, _From, #jid{lserver = LServer} = To, "", Lang) ->
{result, I} -> I;
_ -> []
end,
- Nodes = [{xmlelement,
- "item",
- [{"jid", jlib:jid_to_string(To)},
- {"node", ?NS_COMMANDS},
- {"name", translate:translate(Lang, "Commands")}],
- []}],
+ Nodes = [#xmlel{ns = ?NS_DISCO_ITEMS,
+ name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(To)),
+ ?XMLATTR('node', ?NS_ADHOC_s),
+ ?XMLATTR('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, ?NS_ADHOC_b, Lang) ->
+ ejabberd_hooks:run_fold(adhoc_sm_items, exmpp_jid:prep_domain(To), {result, []}, [From, To, Lang]);
get_sm_commands(Acc, _From, _To, _Node, _Lang) ->
Acc.
@@ -136,17 +142,17 @@ get_sm_commands(Acc, _From, _To, _Node, _Lang) ->
%-------------------------------------------------------------------------
%% 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, ?NS_ADHOC_b, Lang) ->
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', <<"automation">>),
+ ?XMLATTR('type', <<"command-list">>),
+ ?XMLATTR('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, <<"ping">>, Lang) ->
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', <<"automation">>),
+ ?XMLATTR('type', <<"command-node">>),
+ ?XMLATTR('name', translate:translate(Lang, "Ping"))]} | Acc];
get_local_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
@@ -154,31 +160,31 @@ get_local_identity(Acc, _From, _To, _Node, _Lang) ->
%-------------------------------------------------------------------------
%% 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, ?NS_ADHOC_s, Lang) ->
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', <<"automation">>),
+ ?XMLATTR('type', <<"command-list">>),
+ ?XMLATTR('name', translate:translate(Lang, "Commands"))]} | Acc];
get_sm_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
%-------------------------------------------------------------------------
-get_local_features(Acc, _From, _To, "", _Lang) ->
+get_local_features(Acc, _From, _To, <<>>, _Lang) ->
Feats = case Acc of
{result, I} -> I;
_ -> []
end,
- {result, Feats ++ [?NS_COMMANDS]};
+ {result, Feats ++ [?NS_ADHOC_s]};
-get_local_features(_Acc, _From, _To, ?NS_COMMANDS, _Lang) ->
+get_local_features(_Acc, _From, _To, ?NS_ADHOC_b, _Lang) ->
%% override all lesser features...
{result, []};
-get_local_features(_Acc, _From, _To, "ping", _Lang) ->
+get_local_features(_Acc, _From, _To, <<"ping">>, _Lang) ->
%% override all lesser features...
- {result, [?NS_COMMANDS]};
+ {result, [?NS_ADHOC_s]};
get_local_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
@@ -190,9 +196,9 @@ get_sm_features(Acc, _From, _To, "", _Lang) ->
{result, I} -> I;
_ -> []
end,
- {result, Feats ++ [?NS_COMMANDS]};
+ {result, Feats ++ [?NS_ADHOC_s]};
-get_sm_features(_Acc, _From, _To, ?NS_COMMANDS, _Lang) ->
+get_sm_features(_Acc, _From, _To, ?NS_ADHOC_s, _Lang) ->
%% override all lesser features...
{result, []};
@@ -201,47 +207,46 @@ get_sm_features(Acc, _From, _To, _Node, _Lang) ->
%-------------------------------------------------------------------------
-process_local_iq(From, To, IQ) ->
- process_adhoc_request(From, To, IQ, adhoc_local_commands).
+process_local_iq(From, To, IQ_Rec) ->
+ process_adhoc_request(From, To, IQ_Rec, adhoc_local_commands).
-process_sm_iq(From, To, IQ) ->
- process_adhoc_request(From, To, IQ, adhoc_sm_commands).
+process_sm_iq(From, To, IQ_Rec) ->
+ process_adhoc_request(From, To, IQ_Rec, 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
+process_adhoc_request(From, To, IQ_Rec, Hook) ->
+ ?DEBUG("About to parse ~p...", [IQ_Rec]),
+ case adhoc:parse_request(IQ_Rec) of
{error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]};
+ exmpp_iq:error(IQ_Rec, Error);
#adhoc_request{} = AdhocRequest ->
- Host = To#jid.lserver,
- case ejabberd_hooks:run_fold(Hook, Host, empty,
+ case ejabberd_hooks:run_fold(Hook, exmpp_jid:prep_domain(To), empty,
[From, To, AdhocRequest]) of
ignore ->
ignore;
empty ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]};
+ exmpp_iq:error(IQ_Rec, 'item-not-found');
{error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]};
+ exmpp_iq:error(IQ_Rec, Error);
Command ->
- IQ#iq{type = result, sub_el = [Command]}
+ exmpp_iq:result(IQ_Rec, Command)
end
end.
-ping_item(Acc, _From, #jid{server = Server} = _To, Lang) ->
+ping_item(Acc, _From, To, Lang) ->
+ Server = exmpp_jid:domain(To),
Items = case Acc of
{result, I} ->
I;
_ ->
[]
end,
- Nodes = [{xmlelement, "item",
- [{"jid", Server},
- {"node", "ping"},
- {"name", translate:translate(Lang, "Ping")}],
- []}],
+ Nodes = [#xmlel{ns = ?NS_DISCO_INFO, name = 'item', attrs =
+ [?XMLATTR('jid', Server),
+ ?XMLATTR('node', <<"ping">>),
+ ?XMLATTR('name', translate:translate(Lang, "Ping"))]}],
{result, Items ++ Nodes}.
@@ -259,7 +264,7 @@ ping_command(_Acc, _From, _To,
Lang,
"Pong")}]});
true ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
ping_command(Acc, _From, _To, _Request) ->
diff --git a/src/mod_announce.erl b/src/mod_announce.erl
index 0db43a232..b12000067 100644
--- a/src/mod_announce.erl
+++ b/src/mod_announce.erl
@@ -43,8 +43,9 @@
announce_commands/4,
announce_items/4]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("adhoc.hrl").
-record(motd, {server, packet}).
@@ -52,23 +53,26 @@
-define(PROCNAME, ejabberd_announce).
+-define(NS_ADMIN_s, "http://jabber.org/protocol/admin").
+
-define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]).
tokenize(Node) -> string:tokens(Node, "/#").
start(Host, _Opts) ->
+ HostB = list_to_binary(Host),
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,
+ ejabberd_hooks:add(local_send_to_resource_hook, HostB,
?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,
+ ejabberd_hooks:add(disco_local_identity, HostB, ?MODULE, disco_identity, 50),
+ ejabberd_hooks:add(disco_local_features, HostB, ?MODULE, disco_features, 50),
+ ejabberd_hooks:add(disco_local_items, HostB, ?MODULE, disco_items, 50),
+ ejabberd_hooks:add(adhoc_local_items, HostB, ?MODULE, announce_items, 50),
+ ejabberd_hooks:add(adhoc_local_commands, HostB, ?MODULE, announce_commands, 50),
+ ejabberd_hooks:add(user_available_hook, HostB,
?MODULE, send_motd, 50),
register(gen_mod:get_module_proc(Host, ?PROCNAME),
proc_lib:spawn(?MODULE, init, [])).
@@ -113,14 +117,15 @@ 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,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(adhoc_local_commands, HostB, ?MODULE, announce_commands, 50),
+ ejabberd_hooks:delete(adhoc_local_items, HostB, ?MODULE, announce_items, 50),
+ ejabberd_hooks:delete(disco_local_identity, HostB, ?MODULE, disco_identity, 50),
+ ejabberd_hooks:delete(disco_local_features, HostB, ?MODULE, disco_features, 50),
+ ejabberd_hooks:delete(disco_local_items, HostB, ?MODULE, disco_items, 50),
+ ejabberd_hooks:delete(local_send_to_resource_hook, HostB,
?MODULE, announce, 50),
- ejabberd_hooks:delete(user_available_hook, Host,
+ ejabberd_hooks:delete(user_available_hook, HostB,
?MODULE, send_motd, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
exit(whereis(Proc), stop),
@@ -128,39 +133,39 @@ stop(Host) ->
%% 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 {exmpp_jid:prep_node(To), exmpp_jid:prep_resource(To)} of
+ {undefined, Res} ->
+ Name = Packet#xmlel.name,
+ Proc = gen_mod:get_module_proc(exmpp_jid:prep_domain_as_list(To), ?PROCNAME),
case {Res, Name} of
- {"announce/all", "message"} ->
+ {<<"announce/all">>, 'message'} ->
Proc ! {announce_all, From, To, Packet},
stop;
- {"announce/all-hosts/all", "message"} ->
+ {<<"announce/all-hosts/all">>, 'message'} ->
Proc ! {announce_all_hosts_all, From, To, Packet},
stop;
- {"announce/online", "message"} ->
+ {<<"announce/online">>, 'message'} ->
Proc ! {announce_online, From, To, Packet},
stop;
- {"announce/all-hosts/online", "message"} ->
+ {<<"announce/all-hosts/online">>, 'message'} ->
Proc ! {announce_all_hosts_online, From, To, Packet},
stop;
- {"announce/motd", "message"} ->
+ {<<"announce/motd">>, 'message'} ->
Proc ! {announce_motd, From, To, Packet},
stop;
- {"announce/all-hosts/motd", "message"} ->
+ {<<"announce/all-hosts/motd">>, 'message'} ->
Proc ! {announce_all_hosts_motd, From, To, Packet},
stop;
- {"announce/motd/update", "message"} ->
+ {<<"announce/motd/update">>, 'message'} ->
Proc ! {announce_motd_update, From, To, Packet},
stop;
- {"announce/all-hosts/motd/update", "message"} ->
+ {<<"announce/all-hosts/motd/update">>, 'message'} ->
Proc ! {announce_all_hosts_motd_update, From, To, Packet},
stop;
- {"announce/motd/delete", "message"} ->
+ {<<"announce/motd/delete">>, 'message'} ->
Proc ! {announce_motd_delete, From, To, Packet},
stop;
- {"announce/all-hosts/motd/delete", "message"} ->
+ {<<"announce/all-hosts/motd/delete">>, 'message'} ->
Proc ! {announce_all_hosts_motd_delete, From, To, Packet},
stop;
_ ->
@@ -173,13 +178,13 @@ announce(From, To, Packet) ->
%%-------------------------------------------------------------------------
%% Announcing via ad-hoc commands
-define(INFO_COMMAND(Lang, Node),
- [{xmlelement, "identity",
- [{"category", "automation"},
- {"type", "command-node"},
- {"name", get_title(Lang, Node)}], []}]).
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', <<"automation">>),
+ ?XMLATTR('type', <<"command-node">>),
+ ?XMLATTR('name', get_title(Lang, Node))]}]).
disco_identity(Acc, _From, _To, Node, Lang) ->
- LNode = tokenize(Node),
+ LNode = tokenize(binary_to_list(Node)),
case LNode of
?NS_ADMINL("announce") ->
?INFO_COMMAND(Lang, Node);
@@ -210,13 +215,13 @@ disco_identity(Acc, _From, _To, Node, Lang) ->
-define(INFO_RESULT(Allow, Feats),
case Allow of
deny ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
allow ->
{result, Feats}
end).
-disco_features(Acc, From, #jid{lserver = LServer} = _To,
- "announce", _Lang) ->
+disco_features(Acc, From, To, <<"announce">>, _Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -226,14 +231,14 @@ disco_features(Acc, From, #jid{lserver = LServer} = _To,
case {acl:match_rule(LServer, Access1, From),
acl:match_rule(global, Access2, From)} of
{deny, deny} ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
_ ->
{result, []}
end
end;
-disco_features(Acc, From, #jid{lserver = LServer} = _To,
- Node, _Lang) ->
+disco_features(Acc, From, To, Node, _Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -243,26 +248,26 @@ disco_features(Acc, From, #jid{lserver = LServer} = _To,
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]);
+ <> ->
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(AllowGlobal, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(AllowGlobal, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(AllowGlobal, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(AllowGlobal, [?NS_ADHOC_s]);
+ <> ->
+ ?INFO_RESULT(AllowGlobal, [?NS_ADHOC_s]);
_ ->
Acc
end
@@ -271,22 +276,23 @@ disco_features(Acc, From, #jid{lserver = LServer} = _To,
%%-------------------------------------------------------------------------
-define(NODE_TO_ITEM(Lang, Server, Node),
- {xmlelement, "item",
- [{"jid", Server},
- {"node", Node},
- {"name", get_title(Lang, Node)}],
- []}).
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', Server),
+ ?XMLATTR('node', Node),
+ ?XMLATTR('name', get_title(Lang, Node))]}).
-define(ITEMS_RESULT(Allow, Items),
case Allow of
deny ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
allow ->
{result, Items}
end).
-disco_items(Acc, From, #jid{lserver = LServer, server = Server} = _To,
- "", Lang) ->
+disco_items(Acc, From, To, <<>>, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
+ Server = exmpp_jid:domain(To),
+
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -302,12 +308,13 @@ disco_items(Acc, From, #jid{lserver = LServer, server = Server} = _To,
{result, I} -> I;
_ -> []
end,
- Nodes = [?NODE_TO_ITEM(Lang, Server, "announce")],
+ Nodes = [?NODE_TO_ITEM(Lang, Server, <<"announce">>)],
{result, Items ++ Nodes}
end
end;
-disco_items(Acc, From, #jid{lserver = LServer} = To, "announce", Lang) ->
+disco_items(Acc, From, To, <<"announce">>, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -315,7 +322,8 @@ disco_items(Acc, From, #jid{lserver = LServer} = To, "announce", Lang) ->
announce_items(Acc, From, To, Lang)
end;
-disco_items(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
+disco_items(Acc, From, To, Node, _Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -325,25 +333,25 @@ disco_items(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
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
@@ -352,26 +360,28 @@ disco_items(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
%%-------------------------------------------------------------------------
-announce_items(Acc, From, #jid{lserver = LServer, server = Server} = _To, Lang) ->
+announce_items(Acc, From, To, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
+ Server = exmpp_jid:domain(To),
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")];
+ [?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>)];
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")];
+ [?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>),
+ ?NODE_TO_ITEM(Lang, Server, <>)];
deny ->
[]
end,
@@ -391,14 +401,14 @@ announce_items(Acc, From, #jid{lserver = LServer, server = Server} = _To, Lang)
commands_result(Allow, From, To, Request) ->
case Allow of
deny ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
allow ->
announce_commands(From, To, Request)
end.
-announce_commands(Acc, From, #jid{lserver = LServer} = To,
- #adhoc_request{ node = Node} = Request) ->
+announce_commands(Acc, From, To, #adhoc_request{ node = Node} = Request) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
LNode = tokenize(Node),
F = fun() ->
Access = gen_mod:get_module_opt(global, ?MODULE, access, none),
@@ -453,7 +463,7 @@ announce_commands(From, To,
#adhoc_response{status = canceled});
XData == false, ActionIsExecute ->
%% User requests form
- Elements = generate_adhoc_form(Lang, Node, To#jid.lserver),
+ Elements = generate_adhoc_form(Lang, Node, exmpp_jid:prep_domain_as_list(To)),
adhoc:produce_response(
Request,
#adhoc_response{status = executing,
@@ -462,26 +472,26 @@ announce_commands(From, To,
%% User returns form.
case jlib:parse_xdata_submit(XData) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
Fields ->
handle_adhoc_form(From, To, Request, Fields)
end;
true ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
-define(VVALUE(Val),
- {xmlelement, "value", [], [{xmlcdata, Val}]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = Val}]}).
-define(VVALUEL(Val),
case Val of
- "" -> [];
+ <<>> -> [];
_ -> [?VVALUE(Val)]
end).
-define(TVFIELD(Type, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"var", Var}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('var', Var)], children =
?VVALUEL(Val)}).
--define(HFIELD(), ?TVFIELD("hidden", "FORM_TYPE", ?NS_ADMIN)).
+-define(HFIELD(), ?TVFIELD(<<"hidden">>, <<"FORM_TYPE">>, list_to_binary(?NS_ADMIN_s))).
generate_adhoc_form(Lang, Node, ServerHost) ->
LNode = tokenize(Node),
@@ -491,32 +501,30 @@ generate_adhoc_form(Lang, Node, ServerHost) ->
true ->
{[], []}
end,
- {xmlelement, "x",
- [{"xmlns", ?NS_XDATA},
- {"type", "form"}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"form">>)], children =
[?HFIELD(),
- {xmlelement, "title", [], [{xmlcdata, get_title(Lang, Node)}]}]
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children = [#xmlcdata{cdata = list_to_binary(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"}]}]}];
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"confirm">>),
+ ?XMLATTR('type', <<"boolean">>),
+ ?XMLATTR('label', translate:translate(Lang, "Really delete message of the day?"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = <<"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)}]
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"subject">>),
+ ?XMLATTR('type', <<"text-single">>),
+ ?XMLATTR('label', translate:translate(Lang, "Subject"))], children =
+ ?VVALUEL(list_to_binary(OldSubject))},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"body">>),
+ ?XMLATTR('type', <<"text-multi">>),
+ ?XMLATTR('label', translate:translate(Lang, "Message body"))], children =
+ ?VVALUEL(list_to_binary(OldBody))}]
end}.
join_lines([]) ->
@@ -529,11 +537,12 @@ join_lines([], Acc) ->
%% Remove last newline
lists:flatten(lists:reverse(tl(Acc))).
-handle_adhoc_form(From, #jid{lserver = LServer} = To,
+handle_adhoc_form(From, To,
#adhoc_request{lang = Lang,
node = Node,
sessionid = SessionID},
Fields) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
Confirm = case lists:keysearch("confirm", 1, Fields) of
{value, {"confirm", ["true"]}} ->
true;
@@ -560,30 +569,30 @@ handle_adhoc_form(From, #jid{lserver = LServer} = To,
node = Node,
sessionid = SessionID,
status = completed},
- Packet = {xmlelement, "message", [{"type", "normal"}],
+ Packet = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', attrs = [?XMLATTR('type', <<"normal">>)], children =
if Subject /= [] ->
- [{xmlelement, "subject", [],
- [{xmlcdata, Subject}]}];
+ [#xmlel{ns = ?NS_JABBER_CLIENT, name = 'subject', children =
+ [#xmlcdata{cdata = list_to_binary(Subject)}]}];
true ->
[]
end ++
if Body /= [] ->
- [{xmlelement, "body", [],
- [{xmlcdata, Body}]}];
+ [#xmlel{ns = ?NS_JABBER_CLIENT, name = 'body', children =
+ [#xmlcdata{cdata = list_to_binary(Body)}]}];
true ->
[]
end},
Proc = gen_mod:get_module_proc(LServer, ?PROCNAME),
case {Node, Body} of
- {?NS_ADMIN ++ "#delete-motd", _} ->
+ {?NS_ADMIN_s ++ "#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", _} ->
+ {?NS_ADMIN_s ++ "#delete-motd-allhosts", _} ->
if Confirm ->
Proc ! {announce_all_hosts_motd_delete, From, To, Packet},
adhoc:produce_response(Response);
@@ -593,79 +602,79 @@ handle_adhoc_form(From, #jid{lserver = LServer} = To,
{_, []} ->
%% 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")};
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'not-acceptable',
+ {"en", "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", _} ->
+ {?NS_ADMIN_s ++ "#announce", _} ->
Proc ! {announce_online, From, To, Packet},
adhoc:produce_response(Response);
- {?NS_ADMIN ++ "#announce-allhosts", _} ->
+ {?NS_ADMIN_s ++ "#announce-allhosts", _} ->
Proc ! {announce_all_hosts_online, From, To, Packet},
adhoc:produce_response(Response);
- {?NS_ADMIN ++ "#announce-all", _} ->
+ {?NS_ADMIN_s ++ "#announce-all", _} ->
Proc ! {announce_all, From, To, Packet},
adhoc:produce_response(Response);
- {?NS_ADMIN ++ "#announce-all-allhosts", _} ->
+ {?NS_ADMIN_s ++ "#announce-all-allhosts", _} ->
Proc ! {announce_all_hosts_all, From, To, Packet},
adhoc:produce_response(Response);
- {?NS_ADMIN ++ "#set-motd", _} ->
+ {?NS_ADMIN_s ++ "#set-motd", _} ->
Proc ! {announce_motd, From, To, Packet},
adhoc:produce_response(Response);
- {?NS_ADMIN ++ "#set-motd-allhosts", _} ->
+ {?NS_ADMIN_s ++ "#set-motd-allhosts", _} ->
Proc ! {announce_all_hosts_motd, From, To, Packet},
adhoc:produce_response(Response);
- {?NS_ADMIN ++ "#edit-motd", _} ->
+ {?NS_ADMIN_s ++ "#edit-motd", _} ->
Proc ! {announce_motd_update, From, To, Packet},
adhoc:produce_response(Response);
- {?NS_ADMIN ++ "#edit-motd-allhosts", _} ->
+ {?NS_ADMIN_s ++ "#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}
+ {error, 'internal-server-error'}
end.
-
-get_title(Lang, "announce") ->
+get_title(Lang, Node) when is_list(Node) ->
+ get_title(Lang, list_to_binary(Node));
+get_title(Lang, <<"announce">>) ->
translate:translate(Lang, "Announcements");
-get_title(Lang, ?NS_ADMIN ++ "#announce-all") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Send announcement to all users");
-get_title(Lang, ?NS_ADMIN ++ "#announce-all-allhosts") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Send announcement to all users on all hosts");
-get_title(Lang, ?NS_ADMIN ++ "#announce") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Send announcement to all online users");
-get_title(Lang, ?NS_ADMIN ++ "#announce-allhosts") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Send announcement to all online users on all hosts");
-get_title(Lang, ?NS_ADMIN ++ "#set-motd") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Set message of the day and send to online users");
-get_title(Lang, ?NS_ADMIN ++ "#set-motd-allhosts") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Set message of the day on all hosts and send to online users");
-get_title(Lang, ?NS_ADMIN ++ "#edit-motd") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Update message of the day (don't send)");
-get_title(Lang, ?NS_ADMIN ++ "#edit-motd-allhosts") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Update message of the day on all hosts (don't send)");
-get_title(Lang, ?NS_ADMIN ++ "#delete-motd") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Delete message of the day");
-get_title(Lang, ?NS_ADMIN ++ "#delete-motd-allhosts") ->
+get_title(Lang, <>) ->
translate:translate(Lang, "Delete message of the day on all hosts").
%%-------------------------------------------------------------------------
announce_all(From, To, Packet) ->
- Host = To#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(To),
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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
- Local = jlib:make_jid("", To#jid.server, ""),
+ Local = exmpp_jid:make(exmpp_jid:domain(To)),
lists:foreach(
fun({User, Server}) ->
- Dest = jlib:make_jid(User, Server, ""),
+ Dest = exmpp_jid:make(User, Server),
ejabberd_router:route(Local, Dest, Packet)
end, ejabberd_auth:get_vh_registered_users(Host))
end.
@@ -674,27 +683,27 @@ 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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
- Local = jlib:make_jid("", To#jid.server, ""),
+ Local = exmpp_jid:make(exmpp_jid:domain(To)),
lists:foreach(
fun({User, Server}) ->
- Dest = jlib:make_jid(User, Server, ""),
+ Dest = exmpp_jid:make(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,
+ Host = exmpp_jid:prep_domain_as_list(To),
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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
- announce_online1(ejabberd_sm:get_vh_session_list(Host),
- To#jid.server,
+ announce_online1(ejabberd_sm:get_vh_session_list(exmpp_jid:prep_domain(To)),
+ exmpp_jid:domain_as_list(To),
Packet)
end.
@@ -702,28 +711,28 @@ 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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
announce_online1(ejabberd_sm:dirty_get_sessions_list(),
- To#jid.server,
+ exmpp_jid:domain_as_list(To),
Packet)
end.
announce_online1(Sessions, Server, Packet) ->
- Local = jlib:make_jid("", Server, ""),
+ Local = exmpp_jid:make(Server),
lists:foreach(
fun({U, S, R}) ->
- Dest = jlib:make_jid(U, S, R),
+ Dest = exmpp_jid:make(U, S, R),
ejabberd_router:route(Local, Dest, Packet)
end, Sessions).
announce_motd(From, To, Packet) ->
- Host = To#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(To),
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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
announce_motd(Host, Packet)
@@ -733,7 +742,7 @@ 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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
Hosts = ?MYHOSTS,
@@ -742,7 +751,7 @@ announce_all_hosts_motd(From, To, Packet) ->
announce_motd(Host, Packet) ->
announce_motd_update(Host, Packet),
- Sessions = ejabberd_sm:get_vh_session_list(Host),
+ Sessions = ejabberd_sm:get_vh_session_list(list_to_binary(Host)),
announce_online1(Sessions, Host, Packet),
F = fun() ->
lists:foreach(
@@ -753,11 +762,11 @@ announce_motd(Host, Packet) ->
mnesia:transaction(F).
announce_motd_update(From, To, Packet) ->
- Host = To#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(To),
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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
announce_motd_update(Host, Packet)
@@ -767,7 +776,7 @@ 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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
Hosts = ?MYHOSTS,
@@ -782,11 +791,11 @@ announce_motd_update(LServer, Packet) ->
mnesia:transaction(F).
announce_motd_delete(From, To, Packet) ->
- Host = To#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(To),
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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
announce_motd_delete(Host)
@@ -796,7 +805,7 @@ 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),
+ Err = exmpp_stanza:reply_with_error(Packet, 'forbidden'),
ejabberd_router:route(To, From, Err);
allow ->
Hosts = ?MYHOSTS,
@@ -818,7 +827,9 @@ announce_motd_delete(LServer) ->
end,
mnesia:transaction(F).
-send_motd(#jid{luser = LUser, lserver = LServer} = JID) ->
+send_motd(JID) ->
+ LServer = exmpp_jid:prep_domain_as_list(JID),
+ LUser = exmpp_jid:prep_node_as_list(JID),
case catch mnesia:dirty_read({motd, LServer}) of
[#motd{packet = Packet}] ->
US = {LUser, LServer},
@@ -826,7 +837,7 @@ send_motd(#jid{luser = LUser, lserver = LServer} = JID) ->
[#motd_users{}] ->
ok;
_ ->
- Local = jlib:make_jid("", LServer, ""),
+ Local = exmpp_jid:make(exmpp_jid:prep_domain(JID)),
ejabberd_router:route(Local, JID, Packet),
F = fun() ->
mnesia:write(#motd_users{us = US})
@@ -840,8 +851,8 @@ send_motd(#jid{luser = LUser, lserver = LServer} = JID) ->
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")};
+ {exmpp_xml:get_cdata_as_list(exmpp_xml:get_element(Packet, 'subject')),
+ exmpp_xml:get_cdata_as_list(exmpp_xml:get_element(Packet, 'body'))};
_ ->
{"", ""}
end.
diff --git a/src/mod_caps.erl b/src/mod_caps.erl
index 42360a668..1ac6bbd92 100644
--- a/src/mod_caps.erl
+++ b/src/mod_caps.erl
@@ -54,6 +54,8 @@
code_change/3
]).
+-include_lib("exmpp/include/exmpp.hrl").
+
%% hook handlers
-export([receive_packet/3,
receive_packet/4,
@@ -61,7 +63,6 @@
remove_connection/3]).
-include("ejabberd.hrl").
--include("jlib.hrl").
-define(PROCNAME, ejabberd_mod_caps).
-define(DICT, dict).
@@ -81,23 +82,13 @@
%% capabilities are advertised.
read_caps(Els) ->
read_caps(Els, nothing).
-read_caps([{xmlelement, "c", Attrs, _Els} | Tail], Result) ->
- case xml:get_attr_s("xmlns", Attrs) of
- ?NS_CAPS ->
- Node = xml:get_attr_s("node", Attrs),
- Version = xml:get_attr_s("ver", Attrs),
- Exts = string:tokens(xml:get_attr_s("ext", Attrs), " "),
- read_caps(Tail, #caps{node = Node, version = Version, exts = Exts});
- _ ->
- read_caps(Tail, Result)
- end;
-read_caps([{xmlelement, "x", Attrs, _Els} | Tail], Result) ->
- case xml:get_attr_s("xmlns", Attrs) of
- ?NS_MUC_USER ->
- nothing;
- _ ->
- read_caps(Tail, Result)
- end;
+read_caps([#xmlel{ns = ?NS_CAPS, name = 'c'} = El | Tail], _Result) ->
+ Node = exmpp_xml:get_attribute_as_list(El, 'node', ""),
+ Version = exmpp_xml:get_attribute_as_list(El, 'ver', ""),
+ Exts = string:tokens(exmpp_xml:get_attribute_as_list(El, 'ext', ""), " "),
+ read_caps(Tail, #caps{node = Node, version = Version, exts = Exts});
+read_caps([#xmlel{ns = ?NS_MUC_USER, name = 'x'} | _Tail], _Result) ->
+ nothing;
read_caps([_ | Tail], Result) ->
read_caps(Tail, Result);
read_caps([], Result) ->
@@ -114,11 +105,12 @@ get_caps(LJID) ->
get_caps(LJID, 5).
get_caps(_, 0) ->
nothing;
-get_caps(LJID, Retry) ->
- case catch mnesia:dirty_read({user_caps, jid_to_binary(LJID)}) of
+get_caps({U, S, R}, Retry) ->
+ BJID = exmpp_jid:to_binary(U, S, R),
+ case catch mnesia:dirty_read({user_caps, BJID}) of
[#user_caps{caps=waiting}] ->
timer:sleep(2000),
- get_caps(LJID, Retry-1);
+ get_caps({U, S, R}, Retry-1);
[#user_caps{caps=Caps}] ->
Caps;
_ ->
@@ -127,16 +119,17 @@ get_caps(LJID, Retry) ->
%% clear_caps removes user caps from database
clear_caps(JID) ->
- {U, S, R} = jlib:jid_tolower(JID),
- BJID = jid_to_binary(JID),
- BUID = jid_to_binary({U, S, []}),
+ R = exmpp_jid:prep_resource(JID),
+ BJID = exmpp_jid:to_binary(JID),
+ BUID = exmpp_jid:bare_to_binary(JID),
catch mnesia:dirty_delete({user_caps, BJID}),
catch mnesia:dirty_delete_object(#user_caps_resources{uid = BUID, resource = list_to_binary(R)}),
ok.
-
+
%% give default user resource
-get_user_resources(LUser, LServer) ->
- case catch mnesia:dirty_read({user_caps_resources, jid_to_binary({LUser, LServer, []})}) of
+get_user_resources(U, S) ->
+ BUID = exmpp_jid:bare_to_binary(U, S),
+ case catch mnesia:dirty_read({user_caps_resources, BUID}) of
{'EXIT', _} ->
[];
Resources ->
@@ -188,25 +181,25 @@ stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:call(Proc, stop).
-receive_packet(From, To, {xmlelement, "presence", Attrs, Els}) ->
- case xml:get_attr_s("type", Attrs) of
- "probe" ->
+receive_packet(From, To, Packet) when ?IS_PRESENCE(Packet) ->
+ case exmpp_presence:get_type(Packet) of
+ 'probe' ->
ok;
- "error" ->
+ 'error' ->
ok;
- "invisible" ->
+ 'invisible' ->
ok;
- "subscribe" ->
+ 'subscribe' ->
ok;
- "subscribed" ->
+ 'subscribed' ->
ok;
- "unsubscribe" ->
+ 'unsubscribe' ->
ok;
- "unsubscribed" ->
+ 'unsubscribed' ->
ok;
- "unavailable" ->
- {_, S1, _} = jlib:jid_tolower(From),
- case jlib:jid_tolower(To) of
+ 'unavailable' ->
+ {_, S1, _} = jlib:short_prepd_jid(From),
+ case jlib:short_prepd_jid(To) of
{_, S1, _} -> ok;
_ -> clear_caps(From)
end;
@@ -220,7 +213,9 @@ receive_packet(From, To, {xmlelement, "presence", Attrs, Els}) ->
%% anymore until he login again.
%% This is tracked in EJAB-943
_ ->
- note_caps(To#jid.lserver, From, read_caps(Els))
+ ServerString = exmpp_jid:prep_domain_as_list(To),
+ Els = Packet#xmlel.children,
+ note_caps(ServerString, From, read_caps(Els))
end;
receive_packet(_, _, _) ->
ok.
@@ -229,15 +224,12 @@ receive_packet(_JID, From, To, Packet) ->
receive_packet(From, To, Packet).
presence_probe(From, To, _) ->
- wait_caps(To#jid.lserver, From).
+ ServerString = exmpp_jid:prep_domain_as_list(To),
+ wait_caps(ServerString, From).
remove_connection(_SID, JID, _Info) ->
clear_caps(JID).
-jid_to_binary(JID) ->
- {U, S, R} = jlib:jid_tolower(JID),
- list_to_binary(jlib:jid_to_string({U, S, R})).
-
caps_to_binary(#caps{node = Node, version = Version, exts = Exts}) ->
BExts = [list_to_binary(Ext) || Ext <- Exts],
#caps{node = list_to_binary(Node), version = list_to_binary(Version), exts = BExts}.
@@ -312,7 +304,7 @@ handle_call(stop, _From, State) ->
{stop, normal, ok, State}.
handle_cast({note_caps, From, nothing}, State) ->
- BJID = jid_to_binary(From),
+ BJID = exmpp_jid:to_binary(From),
catch mnesia:dirty_delete({user_caps, BJID}),
{noreply, State};
handle_cast({note_caps, From,
@@ -320,29 +312,32 @@ handle_cast({note_caps, From,
#state{host = Host, disco_requests = Requests} = State) ->
%% XXX: this leads to race conditions where ejabberd will send
%% lots of caps disco requests.
- {U, S, R} = jlib:jid_tolower(From),
- BJID = jid_to_binary(From),
+ %#jid{node = U, domain = S, resource = R} = From,
+ U = exmpp_jid:prep_node(From),
+ S = exmpp_jid:prep_domain(From),
+ R = exmpp_jid:resource(From),
+ BJID = exmpp_jid:to_binary(From),
mnesia:transaction(fun() ->
- mnesia:write(#user_caps{jid = BJID, caps = caps_to_binary(Caps)}),
+ mnesia:dirty_write(#user_caps{jid = BJID, caps = caps_to_binary(Caps)}),
case ejabberd_sm:get_user_resources(U, S) of
[] ->
- % only store resources of caps aware external contacts
- BUID = jid_to_binary({U, S, []}),
- mnesia:write(#user_caps_resources{uid = BUID, resource = list_to_binary(R)});
- _ ->
+ % only store resource of caps aware external contacts
+ BUID = exmpp_jid:bare_to_binary(From),
+ mnesia:dirty_write(#user_caps_resources{uid = BUID, resource = list_to_binary(R)});
+ _ ->
ok
end
end),
%% Now, find which of these are not already in the database.
SubNodes = [Version | Exts],
case lists:foldl(fun(SubNode, Acc) ->
- case mnesia:dirty_read({caps_features, node_to_binary(Node, SubNode)}) of
- [] ->
- [SubNode | Acc];
- _ ->
- Acc
- end
- end, [], SubNodes) of
+ case mnesia:dirty_read({caps_features, {Node, SubNode}}) of
+ [] ->
+ [SubNode | Acc];
+ _ ->
+ Acc
+ end
+ end, [], SubNodes) of
[] ->
{noreply, State};
Missing ->
@@ -350,37 +345,31 @@ handle_cast({note_caps, From,
NewRequests = lists:foldl(
fun(SubNode, Dict) ->
ID = randoms:get_string(),
- Stanza =
- {xmlelement, "iq",
- [{"type", "get"},
- {"id", ID}],
- [{xmlelement, "query",
- [{"xmlns", ?NS_DISCO_INFO},
- {"node", lists:concat([Node, "#", SubNode])}],
- []}]},
+ Query = exmpp_xml:set_attribute(
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'query'},
+ 'node', lists:concat([Node, "#", SubNode])),
+ Stanza = exmpp_iq:get(?NS_JABBER_CLIENT, Query, ID),
ejabberd_local:register_iq_response_handler
- (Host, ID, ?MODULE, handle_disco_response),
- ejabberd_router:route(jlib:make_jid("", Host, ""), From, Stanza),
+ (list_to_binary(Host), ID, ?MODULE, handle_disco_response),
+ ejabberd_router:route(exmpp_jid:make(Host), From, Stanza),
timer:send_after(?CAPS_QUERY_TIMEOUT, self(), {disco_timeout, ID, BJID}),
?DICT:store(ID, node_to_binary(Node, SubNode), Dict)
end, Requests, Missing),
{noreply, State#state{disco_requests = NewRequests}}
end;
handle_cast({wait_caps, From}, State) ->
- BJID = jid_to_binary(From),
+ BJID = exmpp_jid:to_binary(From),
mnesia:dirty_write(#user_caps{jid = BJID, caps = waiting}),
{noreply, State};
-handle_cast({disco_response, From, _To,
- #iq{type = Type, id = ID,
- sub_el = SubEls}},
+handle_cast({disco_response, From, _To, #iq{id = ID, type = Type, payload = Payload}},
#state{disco_requests = Requests} = State) ->
- case {Type, SubEls} of
- {result, [{xmlelement, "query", _Attrs, Els}]} ->
+ case {Type, Payload} of
+ {result, #xmlel{name = 'query', children = Els}} ->
case ?DICT:find(ID, Requests) of
{ok, BinaryNode} ->
Features =
- lists:flatmap(fun({xmlelement, "feature", FAttrs, _}) ->
- [xml:get_attr_s("var", FAttrs)];
+ lists:flatmap(fun(#xmlel{name = 'feature'} = F) ->
+ [exmpp_xml:get_attribute_as_list(F, 'var', "")];
(_) ->
[]
end, Els),
@@ -399,9 +388,9 @@ handle_cast({disco_response, From, _To,
?DEBUG("ID '~s' matches no query", [ID])
end;
%gen_server:cast(self(), visit_feature_queries),
- %?DEBUG("Error IQ reponse from ~s:~n~p", [jlib:jid_to_string(From), SubEls]);
- {result, _} ->
- ?DEBUG("Invalid IQ contents from ~s:~n~p", [jlib:jid_to_string(From), SubEls]);
+ %?DEBUG("Error IQ reponse from ~s:~n~p", [exmpp_jid:to_list(From), SubEls]);
+ {result, Payload} ->
+ ?DEBUG("Invalid IQ contents from ~s:~n~p", [exmpp_jid:to_binary(From), Payload]);
_ ->
%% Can't do anything about errors
ok
@@ -413,7 +402,7 @@ handle_cast({disco_timeout, ID, BJID}, #state{host = Host, disco_requests = Requ
NewRequests = case ?DICT:is_key(ID, Requests) of
true ->
catch mnesia:dirty_delete({user_caps, BJID}),
- ejabberd_local:unregister_iq_response_handler(Host, ID),
+ ejabberd_local:unregister_iq_response_handler(list_to_binary(Host), ID),
?DICT:erase(ID, Requests);
false ->
Requests
@@ -433,10 +422,10 @@ handle_cast(visit_feature_queries, #state{feature_queries = FeatureQueries} = St
end, [], FeatureQueries),
{noreply, State#state{feature_queries = NewFeatureQueries}}.
-handle_disco_response(From, To, IQ) ->
- #jid{lserver = Host} = To,
+handle_disco_response(From, To, IQ_Rec) ->
+ Host = exmpp_jid:prep_domain_as_list(To),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- gen_server:cast(Proc, {disco_response, From, To, IQ}).
+ gen_server:cast(Proc, {disco_response, From, To, IQ_Rec}).
handle_info(_Info, State) ->
{noreply, State}.
diff --git a/src/mod_configure.erl b/src/mod_configure.erl
index bbb63a2d9..4f39ccd49 100644
--- a/src/mod_configure.erl
+++ b/src/mod_configure.erl
@@ -45,8 +45,10 @@
adhoc_sm_items/4,
adhoc_sm_commands/4]).
+
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("adhoc.hrl").
-define(T(Lang, Text), translate:translate(Lang, Text)).
@@ -54,57 +56,61 @@
%% Copied from ejabberd_sm.erl
-record(session, {sid, usr, us, priority, info}).
+-define(NS_ADMIN_s, "http://jabber.org/protocol/admin").
+
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),
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:add(disco_local_items, HostB, ?MODULE, get_local_items, 50),
+ ejabberd_hooks:add(disco_local_features, HostB, ?MODULE, get_local_features, 50),
+ ejabberd_hooks:add(disco_local_identity, HostB, ?MODULE, get_local_identity, 50),
+ ejabberd_hooks:add(disco_sm_items, HostB, ?MODULE, get_sm_items, 50),
+ ejabberd_hooks:add(disco_sm_features, HostB, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:add(disco_sm_identity, HostB, ?MODULE, get_sm_identity, 50),
+ ejabberd_hooks:add(adhoc_local_items, HostB, ?MODULE, adhoc_local_items, 50),
+ ejabberd_hooks:add(adhoc_local_commands, HostB, ?MODULE, adhoc_local_commands, 50),
+ ejabberd_hooks:add(adhoc_sm_items, HostB, ?MODULE, adhoc_sm_items, 50),
+ ejabberd_hooks:add(adhoc_sm_commands, HostB, ?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).
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(adhoc_sm_commands, HostB, ?MODULE, adhoc_sm_commands, 50),
+ ejabberd_hooks:delete(adhoc_sm_items, HostB, ?MODULE, adhoc_sm_items, 50),
+ ejabberd_hooks:delete(adhoc_local_commands, HostB, ?MODULE, adhoc_local_commands, 50),
+ ejabberd_hooks:delete(adhoc_local_items, HostB, ?MODULE, adhoc_local_items, 50),
+ ejabberd_hooks:delete(disco_sm_identity, HostB, ?MODULE, get_sm_identity, 50),
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:delete(disco_sm_items, HostB, ?MODULE, get_sm_items, 50),
+ ejabberd_hooks:delete(disco_local_identity, HostB, ?MODULE, get_local_identity, 50),
+ ejabberd_hooks:delete(disco_local_features, HostB, ?MODULE, get_local_features, 50),
+ ejabberd_hooks:delete(disco_local_items, HostB, ?MODULE, get_local_items, 50),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_ADHOC),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_ADHOC).
%%%-----------------------------------------------------------------------
-define(INFO_IDENTITY(Category, Type, Name, Lang),
- [{xmlelement, "identity",
- [{"category", Category},
- {"type", Type},
- {"name", ?T(Lang, Name)}], []}]).
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', Category),
+ ?XMLATTR('type', Type),
+ ?XMLATTR('name', ?T(Lang, Name))]}]).
-define(INFO_COMMAND(Name, Lang),
- ?INFO_IDENTITY("automation", "command-node", 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}], []}).
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(To)),
+ ?XMLATTR('name', ?T(Lang, Name)),
+ ?XMLATTR('node', Node)]}).
-define(NODE(Name, Node),
- {xmlelement, "item",
- [{"jid", Server},
- {"name", ?T(Lang, Name)},
- {"node", Node}], []}).
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', Server),
+ ?XMLATTR('name', ?T(Lang, Name)),
+ ?XMLATTR('node', Node)]}).
--define(NS_ADMINX(Sub), ?NS_ADMIN++"#"++Sub).
+-define(NS_ADMINX(Sub), <>).
-define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]).
tokenize(Node) -> string:tokens(Node, "/#").
@@ -117,10 +123,10 @@ get_sm_identity(Acc, _From, _To, Node, Lang) ->
end.
get_local_identity(Acc, _From, _To, Node, Lang) ->
- LNode = tokenize(Node),
+ LNode = tokenize(binary_to_list(Node)),
case LNode of
["running nodes", ENode] ->
- ?INFO_IDENTITY("ejabberd", "node", ENode, Lang);
+ ?INFO_IDENTITY(<<"ejabberd">>, <<"node">>, ENode, Lang);
["running nodes", _ENode, "DB"] ->
?INFO_COMMAND("Database", Lang);
["running nodes", _ENode, "modules", "start"] ->
@@ -172,12 +178,13 @@ get_local_identity(Acc, _From, _To, Node, Lang) ->
-define(INFO_RESULT(Allow, Feats),
case Allow of
deny ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
allow ->
{result, Feats}
end).
-get_sm_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
+get_sm_features(Acc, From, To, Node, _Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -185,18 +192,19 @@ get_sm_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
Allow = acl:match_rule(LServer, configure, From),
case Node of
"config" ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
_ ->
Acc
end
end.
-get_local_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
+get_local_features(Acc, From, To, Node, _Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
- LNode = tokenize(Node),
+ LNode = tokenize(binary_to_list(Node)),
Allow = acl:match_rule(LServer, configure, From),
case LNode of
["config"] ->
@@ -216,29 +224,29 @@ get_local_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
["stopped nodes"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode] ->
- ?INFO_RESULT(Allow, [?NS_STATS]);
+ ?INFO_RESULT(Allow, [?NS_STATS_s]);
["running nodes", _ENode, "DB"] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
["running nodes", _ENode, "modules"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode, "modules", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
["running nodes", _ENode, "backup"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode, "backup", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
["running nodes", _ENode, "import"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode, "import", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
["running nodes", _ENode, "restart"] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
["running nodes", _ENode, "shutdown"] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
["config", _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
["http:" | _] ->
- ?INFO_RESULT(Allow, [?NS_COMMANDS]);
+ ?INFO_RESULT(Allow, [?NS_ADHOC_s]);
_ ->
Acc
end
@@ -246,17 +254,18 @@ get_local_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
%%%-----------------------------------------------------------------------
-adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To, Lang) ->
+adhoc_sm_items(Acc, From, To, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
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"}], []}],
+ Nodes = [#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(To)),
+ ?XMLATTR('name', ?T(Lang, "Configuration")),
+ ?XMLATTR('node', <<"config">>)]}],
{result, Items ++ Nodes};
_ ->
Acc
@@ -264,9 +273,8 @@ adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To, Lang) ->
%%%-----------------------------------------------------------------------
-get_sm_items(Acc, From,
- #jid{user = User, server = Server, lserver = LServer} = To,
- Node, Lang) ->
+get_sm_items(Acc, From, To, Node, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -275,32 +283,36 @@ get_sm_items(Acc, From,
{result, Its} -> Its;
empty -> []
end,
- case {acl:match_rule(LServer, configure, From), Node} of
+ case {acl:match_rule(LServer, configure, From), binary_to_list(Node)} of
{allow, ""} ->
- Nodes = [?NODEJID(To, "Configuration", "config"),
- ?NODEJID(To, "User Management", "user")],
- {result, Items ++ Nodes ++ get_user_resources(User, Server)};
+ Nodes = [?NODEJID(To, "Configuration", <<"config">>),
+ ?NODEJID(To, "User Management", <<"user">>)],
+ {result, Items ++ Nodes ++ [binary_to_list(R) || R <- get_user_resources(To)]};
{allow, "config"} ->
{result, []};
{_, "config"} ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
_ ->
Acc
end
end.
-get_user_resources(User, Server) ->
- Rs = ejabberd_sm:get_user_resources(User, Server),
+get_user_resources(BareJID) ->
+ Rs = ejabberd_sm:get_user_resources(exmpp_jid:prep_node(BareJID),
+ exmpp_jid:prep_domain(BareJID)),
lists:map(fun(R) ->
- {xmlelement, "item",
- [{"jid", User ++ "@" ++ Server ++ "/" ++ R},
- {"name", User}], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid',
+ exmpp_jid:to_binary(
+ exmpp_jid:full(BareJID, R))),
+ ?XMLATTR('name',
+ exmpp_jid:prep_node(BareJID))]}
end, lists:sort(Rs)).
%%%-----------------------------------------------------------------------
-adhoc_local_items(Acc, From, #jid{lserver = LServer, server = Server} = To,
- Lang) ->
+adhoc_local_items(Acc, From, To, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case acl:match_rule(LServer, configure, From) of
allow ->
Items = case Acc of
@@ -309,14 +321,14 @@ adhoc_local_items(Acc, From, #jid{lserver = LServer, server = Server} = To,
end,
PermLev = get_permission_level(From),
%% Recursively get all configure commands
- Nodes = recursively_get_local_items(PermLev, LServer, "", Server,
+ Nodes = recursively_get_local_items(PermLev, LServer, "", exmpp_jid:domain_as_list(To),
Lang),
Nodes1 = lists:filter(
fun(N) ->
- Nd = xml:get_tag_attr_s("node", N),
+ Nd = exmpp_xml:get_attribute_as_binary(N, 'node', ""),
F = get_local_features([], From, To, Nd, Lang),
case F of
- {result, [?NS_COMMANDS]} ->
+ {result, [?NS_ADHOC_s]} ->
true;
_ ->
false
@@ -344,8 +356,8 @@ recursively_get_local_items(PermLev, LServer, Node, Server, Lang) ->
Nodes = lists:flatten(
lists:map(
fun(N) ->
- S = xml:get_tag_attr_s("jid", N),
- Nd = xml:get_tag_attr_s("node", N),
+ S = exmpp_xml:get_attribute_as_list(N, 'jid', ""),
+ Nd = exmpp_xml:get_attribute_as_list(N, 'node', ""),
if (S /= Server) or (Nd == "") ->
[];
true ->
@@ -370,7 +382,7 @@ get_permission_level(JID) ->
allow ->
PermLev = get_permission_level(From),
case get_local_items({PermLev, LServer}, LNode,
- jlib:jid_to_string(To), Lang) of
+ exmpp_jid:to_binary(To), Lang) of
{result, Res} ->
{result, Res};
{error, Error} ->
@@ -378,7 +390,8 @@ get_permission_level(JID) ->
end
end).
-get_local_items(Acc, From, #jid{lserver = LServer} = To, "", Lang) ->
+get_local_items(Acc, From, To, <<>>, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
@@ -394,7 +407,7 @@ get_local_items(Acc, From, #jid{lserver = LServer} = To, "", Lang) ->
allow ->
PermLev = get_permission_level(From),
case get_local_items({PermLev, LServer}, [],
- jlib:jid_to_string(To), Lang) of
+ exmpp_jid:to_binary(To), Lang) of
{result, Res} ->
{result, Items ++ Res};
{error, _Error} ->
@@ -403,54 +416,55 @@ get_local_items(Acc, From, #jid{lserver = LServer} = To, "", Lang) ->
end
end;
-get_local_items(Acc, From, #jid{lserver = LServer} = To, Node, Lang) ->
+get_local_items(Acc, From, To, Node, Lang) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
- LNode = tokenize(Node),
+ LNode = tokenize(binary_to_list(Node)),
Allow = acl:match_rule(LServer, configure, From),
case LNode of
["config"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["user"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["online users"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["all users"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["all users", [$@ | _]] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["outgoing s2s" | _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["stopped nodes"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "DB"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "modules"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "modules", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "backup"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "backup", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "import"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "import", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "restart"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["running nodes", _ENode, "shutdown"] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
["config", _] ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
?NS_ADMINL(_) ->
- ?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
+ ?ITEMS_RESULT(Allow, LNode, {error, 'forbidden'});
_ ->
Acc
end
@@ -463,19 +477,19 @@ get_local_items(Acc, From, #jid{lserver = LServer} = To, Node, Lang) ->
%% 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")
+ [?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")
+ [?NODE("Access Control Lists", <<"config/acls">>),
+ ?NODE("Access Rules", <<"config/access">>)
]};
get_local_items(_Host, ["config", _], _Server, _Lang) ->
@@ -483,15 +497,15 @@ get_local_items(_Host, ["config", _], _Server, _Lang) ->
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"))
+ [?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) ->
@@ -506,22 +520,22 @@ get_local_items({_, Host}, ["all users"], _Server, _Lang) ->
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;
+ {error, 'internal-server-error'};
Users ->
SUsers = lists:sort([{S, U} || {U, S} <- Users]),
case catch begin
- {ok, [S1, S2]} = regexp:split(Diap, "-"),
+ [S1, S2] = re:split(Diap, "-", [{return, list}]),
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}], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(U, S)),
+ ?XMLATTR('name', exmpp_jid:to_binary(U, S))]}
end, Sub)
end of
{'EXIT', _Reason} ->
- ?ERR_NOT_ACCEPTABLE;
+ {error, 'not-acceptable'};
Res ->
{result, Res}
end
@@ -540,14 +554,15 @@ get_local_items(_Host, ["stopped nodes"], _Server, Lang) ->
{result, get_stopped_nodes(Lang)};
get_local_items({global, _Host}, ["running nodes", ENode], Server, Lang) ->
+ ENodeB = list_to_binary(ENode),
{result,
- [?NODE("Database", "running nodes/" ++ ENode ++ "/DB"),
- ?NODE("Modules", "running nodes/" ++ ENode ++ "/modules"),
- ?NODE("Backup Management", "running nodes/" ++ ENode ++ "/backup"),
+ [?NODE("Database", <<"running nodes/", ENodeB/binary, "/DB">>),
+ ?NODE("Modules", <<"running nodes/", ENodeB/binary, "/modules">>),
+ ?NODE("Backup Management", <<"running nodes/", ENodeB/binary, "/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")
+ <<"running nodes/", ENodeB/binary, "/import">>),
+ ?NODE("Restart Service", <<"running nodes/", ENodeB/binary, "/restart">>),
+ ?NODE("Shut Down Service", <<"running nodes/", ENodeB/binary, "/shutdown">>)
]};
get_local_items({vhost, _Host}, ["running nodes", ENode], Server, Lang) ->
@@ -559,29 +574,32 @@ get_local_items(_Host, ["running nodes", _ENode, "DB"], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", ENode, "modules"], Server, Lang) ->
+ ENodeB = list_to_binary(ENode),
{result,
- [?NODE("Start Modules", "running nodes/" ++ ENode ++ "/modules/start"),
- ?NODE("Stop Modules", "running nodes/" ++ ENode ++ "/modules/stop")
+ [?NODE("Start Modules", <<"running nodes/", ENodeB/binary, "/modules/start">>),
+ ?NODE("Stop Modules", <<"running nodes/", ENodeB/binary, "/modules/stop">>)
]};
get_local_items(_Host, ["running nodes", _ENode, "modules", _], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", ENode, "backup"], Server, Lang) ->
+ ENodeB = list_to_binary(ENode),
{result,
- [?NODE("Backup", "running nodes/" ++ ENode ++ "/backup/backup"),
- ?NODE("Restore", "running nodes/" ++ ENode ++ "/backup/restore"),
+ [?NODE("Backup", <<"running nodes/", ENodeB/binary, "/backup/backup">>),
+ ?NODE("Restore", <<"running nodes/", ENodeB/binary, "/backup/restore">>),
?NODE("Dump to Text File",
- "running nodes/" ++ ENode ++ "/backup/textfile")
+ <<"running nodes/", ENodeB/binary, "/backup/textfile">>)
]};
get_local_items(_Host, ["running nodes", _ENode, "backup", _], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", ENode, "import"], Server, Lang) ->
+ ENodeB = list_to_binary(ENode),
{result,
- [?NODE("Import File", "running nodes/" ++ ENode ++ "/import/file"),
- ?NODE("Import Directory", "running nodes/" ++ ENode ++ "/import/dir")
+ [?NODE("Import File", <<"running nodes/", ENodeB/binary, "/import/file">>),
+ ?NODE("Import Directory", <<"running nodes/", ENodeB/binary, "/import/dir">>)
]};
get_local_items(_Host, ["running nodes", _ENode, "import", _], _Server, _Lang) ->
@@ -594,19 +612,19 @@ get_local_items(_Host, ["running nodes", _ENode, "shutdown"], _Server, _Lang) ->
{result, []};
get_local_items(_Host, _, _Server, _Lang) ->
- {error, ?ERR_ITEM_NOT_FOUND}.
+ {error, 'item-not-found'}.
get_online_vh_users(Host) ->
- case catch ejabberd_sm:get_vh_session_list(Host) of
+ case catch ejabberd_sm:get_vh_session_list(list_to_binary(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}], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(U, S, R)),
+ ?XMLATTR('name', exmpp_jid:to_binary(U, S))]}
end, SURs)
end.
@@ -619,9 +637,9 @@ get_all_vh_users(Host) ->
case length(SUsers) of
N when N =< 100 ->
lists:map(fun({S, U}) ->
- {xmlelement, "item",
- [{"jid", U ++ "@" ++ S},
- {"name", U ++ "@" ++ S}], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(U, S)),
+ ?XMLATTR('name', exmpp_jid:to_binary(U, S))]}
end, SUsers);
N ->
NParts = trunc(math:sqrt(N * 0.618)) + 1,
@@ -629,21 +647,20 @@ get_all_vh_users(Host) ->
lists:map(fun(K) ->
L = K + M - 1,
Node =
- "@" ++ integer_to_list(K) ++
- "-" ++ integer_to_list(L),
+ <<"@", (list_to_binary(integer_to_list(K)))/binary,
+ "-", (list_to_binary(integer_to_list(L)))/binary>>,
{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}], []}
+ <<(list_to_binary(FU))/binary, "@", (list_to_binary(FS))/binary,
+ " -- ", (list_to_binary(LU))/binary, "@", (list_to_binary(LS))/binary>>,
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', Host),
+ ?XMLATTR('node', <<"all users/", Node/binary>>),
+ ?XMLATTR('name', Name)]}
end, lists:seq(1, N, M))
end
end.
@@ -658,14 +675,11 @@ get_outgoing_s2s(Host, Lang) ->
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]))}],
- []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', Host),
+ ?XMLATTR('node', <<"outgoing s2s/", (list_to_binary(T))/binary>>),
+ ?XMLATTR('name',
+ io_lib:format(?T(Lang, "To ~s"), [T]))]}
end, lists:usort(TConns))
end.
@@ -676,14 +690,11 @@ get_outgoing_s2s(Host, Lang, To) ->
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]))}],
- []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', Host),
+ ?XMLATTR('node', <<"outgoing s2s/", (list_to_binary(To))/binary, "/", (list_to_binary(F))/binary>>),
+ ?XMLATTR('name',
+ io_lib:format(?T(Lang, "From ~s"), [F]))]}
end, lists:keysort(1, lists:filter(fun(E) ->
element(2, E) == To
end, Connections)))
@@ -697,12 +708,11 @@ get_running_nodes(Server, _Lang) ->
DBNodes ->
lists:map(
fun(N) ->
- S = atom_to_list(N),
- {xmlelement, "item",
- [{"jid", Server},
- {"node", "running nodes/" ++ S},
- {"name", S}],
- []}
+ S = list_to_binary(atom_to_list(N)),
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', Server),
+ ?XMLATTR('node', <<"running nodes/", S/binary>>),
+ ?XMLATTR('name', S)]}
end, lists:sort(DBNodes))
end.
@@ -715,12 +725,11 @@ get_stopped_nodes(_Lang) ->
DBNodes ->
lists:map(
fun(N) ->
- S = atom_to_list(N),
- {xmlelement, "item",
- [{"jid", ?MYNAME},
- {"node", "stopped nodes/" ++ S},
- {"name", S}],
- []}
+ S = list_to_binary(atom_to_list(N)),
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', ?MYNAME),
+ ?XMLATTR('node', <<"stopped nodes/", S/binary>>),
+ ?XMLATTR('name', S)]}
end, lists:sort(DBNodes))
end.
@@ -729,13 +738,13 @@ get_stopped_nodes(_Lang) ->
-define(COMMANDS_RESULT(LServerOrGlobal, From, To, Request),
case acl:match_rule(LServerOrGlobal, configure, From) of
deny ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
allow ->
adhoc_local_commands(From, To, Request)
end).
-adhoc_local_commands(Acc, From, #jid{lserver = LServer} = To,
- #adhoc_request{node = Node} = Request) ->
+adhoc_local_commands(Acc, From, To, #adhoc_request{node = Node} = Request) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
LNode = tokenize(Node),
case LNode of
["running nodes", _ENode, "DB"] ->
@@ -758,12 +767,13 @@ adhoc_local_commands(Acc, From, #jid{lserver = LServer} = To,
Acc
end.
-adhoc_local_commands(From, #jid{lserver = LServer} = _To,
+adhoc_local_commands(From, To,
#adhoc_request{lang = Lang,
node = Node,
sessionid = SessionID,
action = Action,
xdata = XData} = Request) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
LNode = tokenize(Node),
%% If the "action" attribute is not present, it is
%% understood as "execute". If there was no
@@ -796,7 +806,7 @@ adhoc_local_commands(From, #jid{lserver = LServer} = _To,
%% User returns form.
case jlib:parse_xdata_submit(XData) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
Fields ->
case catch set_form(From, LServer, LNode, Lang, Fields) of
{result, Res} ->
@@ -807,58 +817,58 @@ adhoc_local_commands(From, #jid{lserver = LServer} = _To,
elements = Res,
status = completed});
{'EXIT', _} ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
{error, Error} ->
{error, Error}
end
end;
true ->
- {error, ?ERR_BAD_REQUEST}
+ {error, '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)).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('var', Var)],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = Val}]}]}).
+-define(HFIELD(), ?TVFIELD(<<"hidden">>, <<"FORM_TYPE">>, list_to_binary(?NS_ADMIN_s))).
-define(TLFIELD(Type, Label, Var),
- {xmlelement, "field", [{"type", Type},
- {"label", ?T(Lang, Label)},
- {"var", Var}], []}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', ?T(Lang, Label)),
+ ?XMLATTR('var', Var)]}).
-define(XFIELD(Type, Label, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"label", ?T(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', ?T(Lang, Label)),
+ ?XMLATTR('var', Var)],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = Val}]}]}).
-define(XMFIELD(Type, Label, Var, Vals),
- {xmlelement, "field", [{"type", Type},
- {"label", ?T(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata,Val}]} || Val <- Vals]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', ?T(Lang, Label)),
+ ?XMLATTR('var', Var)],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(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",
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('label', Table),
+ ?XMLATTR('var', Table)],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(atom_to_list(Val))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
+ ?T(Lang, "RAM copy"))],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"ram_copies">>}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
?T(Lang,
- "RAM and disc copy")}],
- [{xmlelement, "value", [], [{xmlcdata, "disc_copies"}]}]},
- {xmlelement, "option", [{"label",
+ "RAM and disc copy"))],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"disc_copies">>}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
?T(Lang,
- "Disc only copy")}],
- [{xmlelement, "value", [], [{xmlcdata, "disc_only_copies"}]}]},
- {xmlelement, "option", [{"label",
- ?T(Lang, "Remote copy")}],
- [{xmlelement, "value", [], [{xmlcdata, "unknown"}]}]}
+ "Disc only copy"))],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"disc_only_copies">>}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
+ ?T(Lang, "Remote copy"))],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"unknown">>}]}]}
]}).
@@ -866,24 +876,24 @@ adhoc_local_commands(From, #jid{lserver = LServer} = _To,
get_form(_Host, ["running nodes", ENode, "DB"], Lang) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case rpc:call(Node, mnesia, system_info, [tables]) of
{badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
Tables ->
STables = lists:sort(Tables),
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
Lang, "Database Tables Configuration at ") ++
- ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Choose storage type of tables")}]} |
+ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Choose storage type of tables"))}]} |
lists:map(
fun(Table) ->
case rpc:call(Node,
@@ -903,130 +913,131 @@ get_form(_Host, ["running nodes", ENode, "DB"], Lang) ->
get_form(Host, ["running nodes", ENode, "modules", "stop"], Lang) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case rpc:call(Node, gen_mod, loaded_modules, [Host]) of
{badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
Modules ->
SModules = lists:sort(Modules),
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Stop Modules at ") ++ ENode}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- ?T(
- Lang, "Choose modules to stop")}]} |
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Stop Modules at ") ++ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Choose modules to stop"))}]} |
lists:map(fun(M) ->
S = atom_to_list(M),
- ?XFIELD("boolean", S, S, "0")
+ ?XFIELD(<<"boolean">>, S, list_to_binary(S), <<"0">>)
end, SModules)
]}]}
end
end;
get_form(_Host, ["running nodes", ENode, "modules", "start"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", "[].")
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Start Modules at ") ++ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?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", "")
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
+ [
+ ?HFIELD(),
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Backup to File at ") ++ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?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}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", "")
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Restore Backup from File at ") ++ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?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}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", "")
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Dump Backup to Text File at ") ++ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?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}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", "")
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Import User from File at ") ++ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?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}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", "")
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Import Users from Dir at ") ++ ENode)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?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}]}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
+ [?XMLATTR('label', LabelNum ++ ?T(Lang, LabelUnit))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Value)}]}]}
end,
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Restart Service")}]},
- {xmlelement, "field",
- [{"type", "list-single"},
- {"label", ?T(Lang, "Time delay")},
- {"var", "delay"}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Restart Service"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('label', ?T(Lang, "Time delay")),
+ ?XMLATTR('var', <<"delay">>)], children =
[Make_option("", "immediately", "1"),
Make_option("15 ", "seconds", "15"),
Make_option("30 ", "seconds", "30"),
@@ -1039,39 +1050,36 @@ get_form(_Host, ["running nodes", _ENode, "restart"], Lang) ->
Make_option("10 ", "minutes", "600"),
Make_option("15 ", "minutes", "900"),
Make_option("30 ", "minutes", "1800"),
- {xmlelement, "required", [], []}
+ #xmlel{ns = ?NS_DATA_FORMS, name = '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")}],
- []}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"fixed">>),
+ ?XMLATTR('label', ?T(Lang, "Send announcement to all online users on all hosts"))]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"subject">>),
+ ?XMLATTR('type', <<"text-single">>),
+ ?XMLATTR('label', ?T(Lang, "Subject"))]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"announcement">>),
+ ?XMLATTR('type', <<"text-multi">>),
+ ?XMLATTR('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}]}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
+ [?XMLATTR('label', LabelNum ++ ?T(Lang, LabelUnit))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Value)}]}]}
end,
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Shut Down Service")}]},
- {xmlelement, "field",
- [{"type", "list-single"},
- {"label", ?T(Lang, "Time delay")},
- {"var", "delay"}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Shut Down Service"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('label', ?T(Lang, "Time delay")),
+ ?XMLATTR('var', <<"delay">>)], children =
[Make_option("", "immediately", "1"),
Make_option("15 ", "seconds", "15"),
Make_option("30 ", "seconds", "30"),
@@ -1084,38 +1092,35 @@ get_form(_Host, ["running nodes", _ENode, "shutdown"], Lang) ->
Make_option("10 ", "minutes", "600"),
Make_option("15 ", "minutes", "900"),
Make_option("30 ", "minutes", "1800"),
- {xmlelement, "required", [], []}
+ #xmlel{ns = ?NS_DATA_FORMS, name = '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")}],
- []}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"fixed">>),
+ ?XMLATTR('label', ?T(Lang, "Send announcement to all online users on all hosts"))]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"subject">>),
+ ?XMLATTR('type', <<"text-single">>),
+ ?XMLATTR('label', ?T(Lang, "Subject"))]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"announcement">>),
+ ?XMLATTR('type', <<"text-multi">>),
+ ?XMLATTR('label', ?T(Lang, "Message body"))]}
]}]};
get_form(Host, ["config", "acls"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Access Control List Configuration")}]},
- {xmlelement, "field", [{"type", "text-multi"},
- {"label",
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Access Control List Configuration"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"text-multi">>),
+ ?XMLATTR('label',
?T(
- Lang, "Access control lists")},
- {"var", "acls"}],
- lists:map(fun(S) ->
- {xmlelement, "value", [], [{xmlcdata, S}]}
+ Lang, "Access control lists")),
+ ?XMLATTR('var', <<"acls">>)],
+ children = lists:map(fun(S) ->
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(S)}]}
end,
string:tokens(
lists:flatten(
@@ -1131,19 +1136,19 @@ get_form(Host, ["config", "acls"], Lang) ->
]}]};
get_form(Host, ["config", "access"], Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata,
- ?T(
- Lang, "Access Configuration")}]},
- {xmlelement, "field", [{"type", "text-multi"},
- {"label",
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Access Configuration"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =[?XMLATTR('type', <<"text-multi">>),
+ ?XMLATTR('label',
?T(
- Lang, "Access rules")},
- {"var", "access"}],
- lists:map(fun(S) ->
- {xmlelement, "value", [], [{xmlcdata, S}]}
+ Lang, "Access rules")),
+ ?XMLATTR('var', <<"access">>)],
+ children = lists:map(fun(S) ->
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =[#xmlcdata{cdata = list_to_binary(S)}]}
end,
string:tokens(
lists:flatten(
@@ -1159,141 +1164,137 @@ get_form(Host, ["config", "access"], Lang) ->
]}]};
get_form(_Host, ?NS_ADMINL("add-user"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", [], []}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Add User"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', ?T(Lang, "Jabber ID")),
+ ?XMLATTR('var', <<"accountjid">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"text-private">>),
+ ?XMLATTR('label', ?T(Lang, "Password")),
+ ?XMLATTR('var', <<"password">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"text-private">>),
+ ?XMLATTR('label', ?T(Lang, "Password Verification")),
+ ?XMLATTR('var', <<"password-verify">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
]}]};
get_form(_Host, ?NS_ADMINL("delete-user"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Delete User")}]},
- {xmlelement, "field",
- [{"type", "jid-multi"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjids"}],
- [{xmlelement, "required", [], []}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Delete User"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"jid-multi">>),
+ ?XMLATTR('label', ?T(Lang, "Jabber ID")),
+ ?XMLATTR('var', <<"accountjids">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
]}]};
get_form(_Host, ?NS_ADMINL("end-user-session"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "End User Session")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "End User Session"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', ?T(Lang, "Jabber ID")),
+ ?XMLATTR('var', <<"accountjid">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
]}]};
get_form(_Host, ?NS_ADMINL("get-user-password"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Get User Password")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Password"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', ?T(Lang, "Jabber ID")),
+ ?XMLATTR('var', <<"accountjid">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
]}]};
get_form(_Host, ?NS_ADMINL("change-user-password"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", [], []}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Password"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', ?T(Lang, "Jabber ID")),
+ ?XMLATTR('var', <<"accountjid">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"text-private">>),
+ ?XMLATTR('label', ?T(Lang, "Password")),
+ ?XMLATTR('var', <<"password">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
]}]};
get_form(_Host, ?NS_ADMINL("get-user-lastlogin"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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", [], []}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Last Login Time"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', ?T(Lang, "Jabber ID")),
+ ?XMLATTR('var', <<"accountjid">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
]}]};
get_form(_Host, ?NS_ADMINL("user-stats"), Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement, "title", [],
- [{xmlcdata, ?T(Lang, "Get User Statistics")}]},
- {xmlelement, "field",
- [{"type", "jid-single"},
- {"label", ?T(Lang, "Jabber ID")},
- {"var", "accountjid"}],
- [{xmlelement, "required", [], []}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Statistics"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', ?T(Lang, "Jabber ID")),
+ ?XMLATTR('var', <<"accountjid">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = '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}],
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement,
- "field",
- [{"type", "text-single"},
- {"label", ?T(Lang, "Number of registered users")},
- {"var", "registeredusersnum"}],
- [{xmlelement, "value", [], [{xmlcdata, Num}]}]
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"text-single">>),
+ ?XMLATTR('label', ?T(Lang, "Number of registered users")),
+ ?XMLATTR('var', <<"registeredusersnum">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Num)}]}]
}]}]};
get_form(Host, ?NS_ADMINL("get-online-users-num"), Lang) ->
- Num = io_lib:format("~p", [length(ejabberd_sm:get_vh_session_list(Host))]),
+ Num = io_lib:format("~p", [length(ejabberd_sm:get_vh_session_list(list_to_binary(Host)))]),
{result, completed,
- [{xmlelement, "x",
- [{"xmlns", ?NS_XDATA}],
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- {xmlelement,
- "field",
- [{"type", "text-single"},
- {"label", ?T(Lang, "Number of online users")},
- {"var", "onlineusersnum"}],
- [{xmlelement, "value", [], [{xmlcdata, Num}]}]
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"text-single">>),
+ ?XMLATTR('label', ?T(Lang, "Number of online users")),
+ ?XMLATTR('var', <<"onlineusersnum">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Num)}]}]
}]}]};
get_form(_Host, _, _Lang) ->
- {error, ?ERR_SERVICE_UNAVAILABLE}.
+ {error, 'service-unavailable'}.
set_form(_From, _Host, ["running nodes", ENode, "DB"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
lists:foreach(
fun({SVar, SVals}) ->
@@ -1327,7 +1328,7 @@ set_form(_From, _Host, ["running nodes", ENode, "DB"], _Lang, XData) ->
set_form(_From, Host, ["running nodes", ENode, "modules", "stop"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
lists:foreach(
fun({Var, Vals}) ->
@@ -1345,11 +1346,11 @@ set_form(_From, Host, ["running nodes", ENode, "modules", "stop"], _Lang, XData)
set_form(_From, Host, ["running nodes", ENode, "modules", "start"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case lists:keysearch("modules", 1, XData) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
{value, {_, Strings}} ->
String = lists:foldl(fun(S, Res) ->
Res ++ S ++ "\n"
@@ -1367,13 +1368,13 @@ set_form(_From, Host, ["running nodes", ENode, "modules", "start"], _Lang, XData
end, Modules),
{result, []};
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end;
@@ -1381,22 +1382,22 @@ set_form(_From, Host, ["running nodes", ENode, "modules", "start"], _Lang, XData
set_form(_From, _Host, ["running nodes", ENode, "backup", "backup"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
{value, {_, [String]}} ->
case rpc:call(Node, mnesia, backup, [String]) of
{badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
{error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
_ ->
{result, []}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end;
@@ -1404,22 +1405,22 @@ set_form(_From, _Host, ["running nodes", ENode, "backup", "backup"], _Lang, XDat
set_form(_From, _Host, ["running nodes", ENode, "backup", "restore"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
{value, {_, [String]}} ->
case rpc:call(Node, ejabberd_admin, restore, [String]) of
{badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
{error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
_ ->
{result, []}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end;
@@ -1427,22 +1428,22 @@ set_form(_From, _Host, ["running nodes", ENode, "backup", "restore"], _Lang, XDa
set_form(_From, _Host, ["running nodes", ENode, "backup", "textfile"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
{value, {_, [String]}} ->
case rpc:call(Node, ejabberd_admin, dump_to_textfile, [String]) of
{badrpc, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
{error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
_ ->
{result, []}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end;
@@ -1450,16 +1451,16 @@ set_form(_From, _Host, ["running nodes", ENode, "backup", "textfile"], _Lang, XD
set_form(_From, _Host, ["running nodes", ENode, "import", "file"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
{value, {_, [String]}} ->
rpc:call(Node, jd2ejd, import_file, [String]),
{result, []};
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end;
@@ -1467,16 +1468,16 @@ set_form(_From, _Host, ["running nodes", ENode, "import", "file"], _Lang, XData)
set_form(_From, _Host, ["running nodes", ENode, "import", "dir"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
{value, {_, [String]}} ->
rpc:call(Node, jd2ejd, import_dir, [String]),
{result, []};
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end;
@@ -1500,16 +1501,16 @@ set_form(_From, Host, ["config", "acls"], _Lang, XData) ->
ok ->
{result, []};
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
set_form(_From, Host, ["config", "access"], _Lang, XData) ->
@@ -1545,25 +1546,25 @@ set_form(_From, Host, ["config", "access"], _Lang, XData) ->
{atomic, _} ->
{result, []};
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, '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,
+ AccountJID = exmpp_jid:parse(AccountString),
+ User = exmpp_jid:prep_node_as_list(AccountJID),
+ Server = exmpp_jid:prep_domain_as_list(AccountJID),
true = lists:member(Server, ?MYHOSTS),
true = (Server == Host) orelse (get_permission_level(From) == global),
ejabberd_auth:try_register(User, Server, Password),
@@ -1574,10 +1575,9 @@ set_form(From, Host, ?NS_ADMINL("delete-user"), _Lang, XData) ->
[_|_] = AccountStringList,
ASL2 = lists:map(
fun(AccountString) ->
- JID = jlib:string_to_jid(AccountString),
- [_|_] = JID#jid.luser,
- User = JID#jid.luser,
- Server = JID#jid.lserver,
+ JID = exmpp_jid:parse(AccountString),
+ User = [_|_] = exmpp_jid:prep_node_as_list(JID),
+ Server = exmpp_jid:prep_domain_as_list(JID),
true = (Server == Host) orelse (get_permission_level(From) == global),
true = ejabberd_auth:is_user_exists(User, Server),
{User, Server}
@@ -1588,14 +1588,13 @@ set_form(From, Host, ?NS_ADMINL("delete-user"), _Lang, XData) ->
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,
+ JID = exmpp_jid:parse(AccountString),
+ LUser = [_|_] = exmpp_jid:prep_node_as_list(JID),
+ LServer = exmpp_jid:prep_domain_as_list(JID),
true = (LServer == Host) orelse (get_permission_level(From) == global),
%% Code copied from ejabberd_sm.erl
- case JID#jid.lresource of
- [] ->
+ case exmpp_jid:prep_resource_as_list(JID) of
+ undefined ->
SIDs = mnesia:dirty_select(session,
[{#session{sid = '$1', usr = {LUser, LServer, '_'}, _ = '_'}, [], ['$1']}]),
[Pid ! replaced || {_, Pid} <- SIDs];
@@ -1608,26 +1607,24 @@ set_form(From, Host, ?NS_ADMINL("end-user-session"), _Lang, XData) ->
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,
+ JID = exmpp_jid:parse(AccountString),
+ User = [_|_] = exmpp_jid:prep_node_as_list(JID),
+ Server = exmpp_jid:prep_domain_as_list(JID),
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}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?HFIELD(),
- ?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
- ?XFIELD("text-single", "Password", "password", Password)
+ ?XFIELD(<<"jid-single">>, "Jabber ID", <<"accountjid">>, list_to_binary(AccountString)),
+ ?XFIELD(<<"text-single">>, "Password", <<"password">>, list_to_binary(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,
+ JID = exmpp_jid:parse(AccountString),
+ User = [_|_] = exmpp_jid:prep_node_as_list(JID),
+ Server = exmpp_jid:prep_domain_as_list(JID),
true = (Server == Host) orelse (get_permission_level(From) == global),
true = ejabberd_auth:is_user_exists(User, Server),
ejabberd_auth:set_password(User, Server, Password),
@@ -1635,16 +1632,16 @@ set_form(From, Host, ?NS_ADMINL("change-user-password"), _Lang, XData) ->
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,
+ JID = exmpp_jid:parse(AccountString),
+ User = [_|_] = exmpp_jid:prep_node_as_list(JID),
+ Server = exmpp_jid:prep_domain_as_list(JID),
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
+ case ejabberd_sm:get_user_resources(exmpp_jid:prep_node(User),
+ exmpp_jid:prep_domain(Server)) of
[] ->
_US = {User, Server},
case get_last_info(User, Server) of
@@ -1665,37 +1662,41 @@ set_form(From, Host, ?NS_ADMINL("get-user-lastlogin"), Lang, XData) ->
_ ->
?T(Lang, "Online")
end,
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"result">>)], children =
[?HFIELD(),
- ?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
- ?XFIELD("text-single", "Last login", "lastlogin", FLast)
+ ?XFIELD(<<"jid-single">>, "Jabber ID", <<"accountjid">>, list_to_binary(AccountString)),
+ ?XFIELD(<<"text-single">>, "Last login", <<"lastlogin">>, list_to_binary(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,
+ JID = exmpp_jid:parse(AccountString),
+ User = [_|_] = exmpp_jid:prep_node_as_list(JID),
+ Server = exmpp_jid:prep_domain_as_list(JID),
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],
+ Resources = ejabberd_sm:get_user_resources(exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID)),
+ IPs1 = [ejabberd_sm:get_user_ip(exmpp_jid:full(JID,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}]),
+ Items = ejabberd_hooks:run_fold(roster_get,
+ exmpp_jid:prep_domain(JID),
+ [],
+ [{list_to_binary(User), list_to_binary(Server)}]),
Rostersize = integer_to_list(erlang:length(Items)),
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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)
+ ?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}.
+ {error, 'service-unavailable'}.
get_value(Field, XData) ->
hd(get_values(Field, XData)).
@@ -1721,28 +1722,28 @@ 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}]}]}]
+ S -> [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"subject">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(S)}]}]}]
end,
Announcement = case get_values("announcement", XData) of
[] -> [];
- As -> [{xmlelement, "field", [{"var","body"}],
- [{xmlelement,"value",[],[{xmlcdata,Line}]} || Line <- As] }]
+ As -> [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"body">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Line)}]} || Line <- As] }]
end,
case Subject ++ Announcement of
[] -> ok;
SubEls ->
Request = #adhoc_request{
- node = ?NS_ADMINX("announce-allhosts"),
+ node = binary_to_list(?NS_ADMINX(<<"announce-allhosts">>)),
action = "complete",
- xdata = {xmlelement, "x",
- [{"xmlns","jabber:x:data"},{"type","submit"}],
+ xdata = #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"submit">>)], children =
SubEls},
- others= [{xmlelement, "x",
- [{"xmlns","jabber:x:data"},{"type","submit"}],
+ others= [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"submit">>)], children =
SubEls}]
},
- To = jlib:make_jid("", Host, ""),
+ To = exmpp_jid:make(Host),
mod_announce:announce_commands(empty, From, To, Request)
end,
Time = timer:seconds(Delay),
@@ -1763,15 +1764,17 @@ get_last_info(User, Server) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-adhoc_sm_commands(_Acc, From,
- #jid{user = User, server = Server, lserver = LServer} = _To,
+adhoc_sm_commands(_Acc, From, To,
#adhoc_request{lang = Lang,
node = "config",
action = Action,
xdata = XData} = Request) ->
+ User = exmpp_jid:node_as_list(To),
+ Server = exmpp_jid:domain_as_list(To),
+ LServer = exmpp_jid:prep_domain_as_list(To),
case acl:match_rule(LServer, configure, From) of
deny ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
allow ->
%% If the "action" attribute is not present, it is
%% understood as "execute". If there was no
@@ -1799,12 +1802,12 @@ adhoc_sm_commands(_Acc, From,
%% User returns form.
case jlib:parse_xdata_submit(XData) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
Fields ->
set_sm_form(User, Server, "config", Request, Fields)
end;
true ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end;
@@ -1812,30 +1815,30 @@ adhoc_sm_commands(Acc, _From, _To, _Request) ->
Acc.
get_sm_form(User, Server, "config", Lang) ->
- {result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
+ {result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
[?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"}]}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata =
+ list_to_binary(?T(
+ Lang, "Administration of ") ++ User)}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('label', ?T(Lang, "Action on user")),
+ ?XMLATTR('var', <<"action">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"edit">>}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
+ [?XMLATTR('label', ?T(Lang, "Edit Properties"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"edit">>}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
+ [?XMLATTR('label', ?T(Lang, "Remove User"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"remove">>}]}]}
]},
- ?XFIELD("text-private", "Password", "password",
- ejabberd_auth:get_password_s(User, Server))
+ ?XFIELD(<<"text-private">>, "Password", <<"password">>,
+ list_to_binary(ejabberd_auth:get_password_s(User, Server)))
]}]};
get_sm_form(_User, _Server, _Node, _Lang) ->
- {error, ?ERR_SERVICE_UNAVAILABLE}.
+ {error, 'service-unavailable'}.
set_sm_form(User, Server, "config",
@@ -1853,17 +1856,17 @@ set_sm_form(User, Server, "config",
ejabberd_auth:set_password(User, Server, Password),
adhoc:produce_response(Response);
_ ->
- {error, ?ERR_NOT_ACCEPTABLE}
+ {error, 'not-acceptable'}
end;
{value, {_, ["remove"]}} ->
catch ejabberd_auth:remove_user(User, Server),
adhoc:produce_response(Response);
_ ->
- {error, ?ERR_NOT_ACCEPTABLE}
+ {error, 'not-acceptable'}
end;
set_sm_form(_User, _Server, _Node, _Request, _Fields) ->
- {error, ?ERR_SERVICE_UNAVAILABLE}.
+ {error, 'service-unavailable'}.
diff --git a/src/mod_configure2.erl b/src/mod_configure2.erl
index 30db92dcc..b54b67d2b 100644
--- a/src/mod_configure2.erl
+++ b/src/mod_configure2.erl
@@ -33,30 +33,51 @@
stop/1,
process_local_iq/3]).
--include("ejabberd.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
--define(NS_ECONFIGURE, "http://ejabberd.jabberstudio.org/protocol/configure").
+-include("ejabberd.hrl").
+
+-define(NS_ECONFIGURE, 'http://ejabberd.jabberstudio.org/protocol/configure').
+-define(NS_ECONFIGURE_s, "http://ejabberd.jabberstudio.org/protocol/configure").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_ECONFIGURE,
+ gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_ECONFIGURE,
?MODULE, process_local_iq, IQDisc),
+ % Add nss/names/attrs used by this module to the known lists of Exmpp.
+ exmpp_xml:add_known_nss(xmpp, [?NS_ECONFIGURE]),
+ exmpp_xml:add_known_elems(xmpp, [
+ 'access',
+ 'acls',
+ 'body',
+ 'info',
+ 'jid',
+ 'last',
+ 'registration-watchers',
+ 'subject',
+ 'welcome-message'
+ ]),
+ exmpp_xml:add_known_attrs(xmpp, [
+ 'online-users',
+ 'outgoing-s2s-servers',
+ 'registered-users',
+ 'running-nodes',
+ 'stopped-nodes'
+ ]),
ok.
stop(Host) ->
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_ECONFIGURE).
+ gen_iq_handler:remove_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_ECONFIGURE).
-process_local_iq(From, To, #iq{type = Type, lang = _Lang, sub_el = SubEl} = IQ) ->
- case acl:match_rule(To#jid.lserver, configure, From) of
+process_local_iq(From, To, #iq{type = Type, payload = Request} = IQ_Rec) ->
+ case acl:match_rule(exmpp_jid:prep_domain_as_list(To), configure, From) of
deny ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+ exmpp_iq:error(IQ_Rec, 'not-allowed');
allow ->
case Type of
set ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_FEATURE_NOT_IMPLEMENTED]};
+ exmpp_iq:error(IQ_Rec, 'feature-not-implemented');
%%case xml:get_tag_attr_s("type", SubEl) of
%% "cancel" ->
%% IQ#iq{type = result,
@@ -90,56 +111,54 @@ process_local_iq(From, To, #iq{type = Type, lang = _Lang, sub_el = SubEl} = IQ)
%% sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
%%end;
get ->
- case process_get(SubEl) of
+ case process_get(Request) of
{result, Res} ->
- IQ#iq{type = result, sub_el = [Res]};
+ exmpp_iq:result(IQ_Rec, Res);
{error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
+ exmpp_iq:error(IQ_Rec, Error)
end
end
end.
-process_get({xmlelement, "info", _Attrs, _SubEls}) ->
+process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'info'}) ->
S2SConns = ejabberd_s2s:dirty_get_connections(),
TConns = lists:usort([element(2, C) || C <- S2SConns]),
- Attrs = [{"registered-users",
- integer_to_list(mnesia:table_info(passwd, size))},
- {"online-users",
- integer_to_list(mnesia:table_info(presence, size))},
- {"running-nodes",
- integer_to_list(length(mnesia:system_info(running_db_nodes)))},
- {"stopped-nodes",
- integer_to_list(
- length(lists:usort(mnesia:system_info(db_nodes) ++
- mnesia:system_info(extra_db_nodes)) --
- mnesia:system_info(running_db_nodes)))},
- {"outgoing-s2s-servers", integer_to_list(length(TConns))}],
- {result, {xmlelement, "info",
- [{"xmlns", ?NS_ECONFIGURE} | Attrs], []}};
-process_get({xmlelement, "welcome-message", Attrs, _SubEls}) ->
+ Attrs = [?XMLATTR('registered-users', mnesia:table_info(passwd, size)),
+ ?XMLATTR('online-users', mnesia:table_info(presence, size)),
+ ?XMLATTR('running-nodes',
+ length(mnesia:system_info(running_db_nodes))),
+ ?XMLATTR('stopped-nodes',
+ length(lists:usort(mnesia:system_info(db_nodes) ++
+ mnesia:system_info(extra_db_nodes)) --
+ mnesia:system_info(running_db_nodes))),
+ ?XMLATTR('outgoing-s2s-servers',
+ length(TConns))],
+ {result, #xmlel{ns = ?NS_ECONFIGURE, name = 'info', attrs = Attrs}};
+process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'welcome-message', attrs = Attrs}) ->
{Subj, Body} = case ejabberd_config:get_local_option(welcome_message) of
{_Subj, _Body} = SB -> SB;
_ -> {"", ""}
end,
- {result, {xmlelement, "welcome-message", Attrs,
- [{xmlelement, "subject", [], [{xmlcdata, Subj}]},
- {xmlelement, "body", [], [{xmlcdata, Body}]}]}};
-process_get({xmlelement, "registration-watchers", Attrs, _SubEls}) ->
+ {result, #xmlel{ns = ?NS_ECONFIGURE, name = 'welcome-message',
+ attrs = Attrs, children =
+ [#xmlel{ns = ?NS_ECONFIGURE, name = 'subject', children = [#xmlcdata{cdata = list_to_binary(Subj)}]},
+ #xmlel{ns = ?NS_ECONFIGURE, name = 'body', children = [#xmlcdata{cdata = list_to_binary(Body)}]}]}};
+process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'registration-watchers', attrs = Attrs}) ->
SubEls =
case ejabberd_config:get_local_option(registration_watchers) of
JIDs when is_list(JIDs) ->
lists:map(fun(JID) ->
- {xmlelement, "jid", [], [{xmlcdata, JID}]}
+ #xmlel{ns = ?NS_ECONFIGURE, name = 'jid', children = [#xmlcdata{cdata = list_to_binary(JID)}]}
end, JIDs);
_ ->
[]
end,
- {result, {xmlelement, "registration_watchers", Attrs, SubEls}};
-process_get({xmlelement, "acls", Attrs, _SubEls}) ->
+ {result, #xmlel{ns = ?NS_ECONFIGURE, name = 'registration_watchers', attrs = Attrs, children = SubEls}};
+process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'acls', attrs = Attrs}) ->
Str = lists:flatten(io_lib:format("~p.", [ets:tab2list(acl)])),
- {result, {xmlelement, "acls", Attrs, [{xmlcdata, Str}]}};
-process_get({xmlelement, "access", Attrs, _SubEls}) ->
+ {result, #xmlel{ns = ?NS_ECONFIGURE, name = 'acls', attrs = Attrs, children = [#xmlcdata{cdata = list_to_binary(Str)}]}};
+process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'access', attrs = Attrs}) ->
Str =
lists:flatten(
io_lib:format(
@@ -149,22 +168,22 @@ process_get({xmlelement, "access", Attrs, _SubEls}) ->
[],
[{{access, '$1', '$2'}}]}])
])),
- {result, {xmlelement, "access", Attrs, [{xmlcdata, Str}]}};
-process_get({xmlelement, "last", Attrs, _SubEls}) ->
+ {result, #xmlel{ns = ?NS_ECONFIGURE, name = 'access', attrs = Attrs, children = [#xmlcdata{cdata = list_to_binary(Str)}]}};
+process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'last', attrs = Attrs}) ->
case catch mnesia:dirty_select(
last_activity, [{{last_activity, '_', '$1', '_'}, [], ['$1']}]) of
{'EXIT', _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
Vals ->
{MegaSecs, Secs, _MicroSecs} = now(),
TimeStamp = MegaSecs * 1000000 + Secs,
Str = lists:flatten(
lists:append(
[[integer_to_list(TimeStamp - V), " "] || V <- Vals])),
- {result, {xmlelement, "last", Attrs, [{xmlcdata, Str}]}}
+ {result, #xmlel{ns = ?NS_ECONFIGURE, name = 'last', attrs = Attrs, children = [#xmlcdata{cdata = list_to_binary(Str)}]}}
end;
%%process_get({xmlelement, Name, Attrs, SubEls}) ->
%% {result, };
process_get(_) ->
- {error, ?ERR_BAD_REQUEST}.
+ {error, 'bad-request'}.
diff --git a/src/mod_disco.erl b/src/mod_disco.erl
index ad9975b15..1c4f1cbe4 100644
--- a/src/mod_disco.erl
+++ b/src/mod_disco.erl
@@ -1,7 +1,7 @@
%%%----------------------------------------------------------------------
%%% File : mod_disco.erl
%%% Author : Alexey Shchepin
-%%% Purpose : Service Discovery (XEP-0030) support
+%%% Purpose : Service Discovery (JEP-0030) support
%%% Created : 1 Jan 2003 by Alexey Shchepin
%%%
%%%
@@ -47,20 +47,23 @@
register_extra_domain/2,
unregister_extra_domain/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
+
ejabberd_local:refresh_iq_handlers(),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_DISCO_ITEMS,
?MODULE, process_local_iq_items, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_DISCO_INFO,
?MODULE, process_local_iq_info, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_DISCO_ITEMS,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_ITEMS,
?MODULE, process_sm_iq_items, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_DISCO_INFO,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_INFO,
?MODULE, process_sm_iq_info, IQDisc),
catch ets:new(disco_features, [named_table, ordered_set, public]),
@@ -74,27 +77,28 @@ start(Host, Opts) ->
ExtraDomains),
catch ets:new(disco_sm_features, [named_table, ordered_set, public]),
catch ets:new(disco_sm_nodes, [named_table, ordered_set, public]),
- ejabberd_hooks:add(disco_local_items, Host, ?MODULE, get_local_services, 100),
- ejabberd_hooks:add(disco_local_features, Host, ?MODULE, get_local_features, 100),
- ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, get_local_identity, 100),
- ejabberd_hooks:add(disco_sm_items, Host, ?MODULE, get_sm_items, 100),
- ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 100),
- ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE, get_sm_identity, 100),
- ejabberd_hooks:add(disco_info, Host, ?MODULE, get_info, 100),
+ ejabberd_hooks:add(disco_local_items, HostB, ?MODULE, get_local_services, 100),
+ ejabberd_hooks:add(disco_local_features, HostB, ?MODULE, get_local_features, 100),
+ ejabberd_hooks:add(disco_local_identity, HostB, ?MODULE, get_local_identity, 100),
+ ejabberd_hooks:add(disco_sm_items, HostB, ?MODULE, get_sm_items, 100),
+ ejabberd_hooks:add(disco_sm_features, HostB, ?MODULE, get_sm_features, 100),
+ ejabberd_hooks:add(disco_sm_identity, HostB, ?MODULE, get_sm_identity, 100),
+ ejabberd_hooks:add(disco_info, HostB, ?MODULE, get_info, 100),
ok.
stop(Host) ->
- ejabberd_hooks:delete(disco_sm_identity, Host, ?MODULE, get_sm_identity, 100),
- ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 100),
- ejabberd_hooks:delete(disco_sm_items, Host, ?MODULE, get_sm_items, 100),
- ejabberd_hooks:delete(disco_local_identity, Host, ?MODULE, get_local_identity, 100),
- ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_local_features, 100),
- ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, get_local_services, 100),
- ejabberd_hooks:delete(disco_info, Host, ?MODULE, get_info, 100),
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS),
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_DISCO_ITEMS),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_DISCO_INFO),
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(disco_sm_identity, HostB, ?MODULE, get_sm_identity, 100),
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 100),
+ ejabberd_hooks:delete(disco_sm_items, HostB, ?MODULE, get_sm_items, 100),
+ ejabberd_hooks:delete(disco_local_identity, HostB, ?MODULE, get_local_identity, 100),
+ ejabberd_hooks:delete(disco_local_features, HostB, ?MODULE, get_local_features, 100),
+ ejabberd_hooks:delete(disco_local_items, HostB, ?MODULE, get_local_services, 100),
+ ejabberd_hooks:delete(disco_info, HostB, ?MODULE, get_info, 100),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_DISCO_ITEMS),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_DISCO_INFO),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_ITEMS),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_INFO),
catch ets:match_delete(disco_features, {{'_', Host}}),
catch ets:match_delete(disco_extra_domains, {{'_', Host}}),
ok.
@@ -116,74 +120,66 @@ unregister_extra_domain(Host, Domain) ->
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
ets:delete(disco_extra_domains, {Domain, Host}).
-process_local_iq_items(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 ->
- Node = xml:get_tag_attr_s("node", SubEl),
- Host = To#jid.lserver,
+process_local_iq_items(From, To, #iq{type = get, payload = SubEl,
+ lang = Lang} = IQ_Rec) ->
+ Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
- case ejabberd_hooks:run_fold(disco_local_items,
- Host,
- empty,
- [From, To, Node, Lang]) of
- {result, Items} ->
- ANode = case Node of
- "" -> [];
- _ -> [{"node", Node}]
+ case ejabberd_hooks:run_fold(disco_local_items,
+ exmpp_jid:prep_domain(To),
+ empty,
+ [From, To, Node, Lang]) of
+ {result, Items} ->
+ ANode = case Node of
+ <<>> -> [];
+ _ -> [?XMLATTR('node', Node)]
+ end,
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS, name = 'query',
+ attrs = ANode, children = Items},
+ exmpp_iq:result(IQ_Rec, Result);
+ {error, Error} ->
+ exmpp_iq:error(IQ_Rec, Error)
+ end;
+process_local_iq_items(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
+
+
+process_local_iq_info(From, To, #iq{type = get, payload = SubEl,
+ lang = Lang} = IQ_Rec) ->
+ Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
+ HostB = exmpp_jid:prep_domain(To),
+ Identity = ejabberd_hooks:run_fold(disco_local_identity,
+ HostB,
+ [],
+ [From, To, Node, Lang]),
+ Host = exmpp_jid:prep_domain_as_list(To),
+ Info = ejabberd_hooks:run_fold(disco_info, HostB, [],
+ [Host, ?MODULE, Node, Lang]),
+ case ejabberd_hooks:run_fold(disco_local_features,
+ exmpp_jid:prep_domain(To),
+ empty,
+ [From, To, Node, Lang]) of
+ {result, Features} ->
+ ANode = case Node of
+ <<>> -> [];
+ _ -> [?XMLATTR('node', Node)]
end,
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", ?NS_DISCO_ITEMS} | ANode],
- Items
- }]};
- {error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
- end
- end.
+ Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
+ attrs = ANode,
+ children = Identity ++ Info ++ lists:map(fun feature_to_xml/1,
+ Features)},
+ exmpp_iq:result(IQ_Rec, Result);
+ {error, Error} ->
+ exmpp_iq:error(IQ_Rec, Error)
+ end;
+process_local_iq_info(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
-
-process_local_iq_info(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 ->
- Host = To#jid.lserver,
- Node = xml:get_tag_attr_s("node", SubEl),
- Identity = ejabberd_hooks:run_fold(disco_local_identity,
- Host,
- [],
- [From, To, Node, Lang]),
- Info = ejabberd_hooks:run_fold(disco_info, Host, [],
- [Host, ?MODULE, Node, Lang]),
- case ejabberd_hooks:run_fold(disco_local_features,
- Host,
- empty,
- [From, To, Node, Lang]) of
- {result, Features} ->
- ANode = case Node of
- "" -> [];
- _ -> [{"node", Node}]
- end,
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", ?NS_DISCO_INFO} | ANode],
- Identity ++
- Info ++
- lists:map(fun feature_to_xml/1, Features)
- }]};
- {error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
- end
- end.
-
-get_local_identity(Acc, _From, _To, [], _Lang) ->
- Acc ++ [{xmlelement, "identity",
- [{"category", "server"},
- {"type", "im"},
- {"name", "ejabberd"}], []}];
+get_local_identity(Acc, _From, _To, <<>>, _Lang) ->
+ Acc ++ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = [
+ ?XMLATTR('category', <<"server">>),
+ ?XMLATTR('type', <<"im">>),
+ ?XMLATTR('name', <<"ejabberd">>)
+ ]}];
get_local_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
@@ -191,12 +187,12 @@ get_local_identity(Acc, _From, _To, _Node, _Lang) ->
get_local_features({error, _Error} = Acc, _From, _To, _Node, _Lang) ->
Acc;
-get_local_features(Acc, _From, To, [], _Lang) ->
+get_local_features(Acc, _From, To, <<>>, _Lang) ->
Feats = case Acc of
{result, Features} -> Features;
empty -> []
end,
- Host = To#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(To),
{result,
ets:select(disco_features, [{{{'_', Host}}, [], ['$_']}]) ++ Feats};
@@ -205,29 +201,41 @@ get_local_features(Acc, _From, _To, _Node, _Lang) ->
{result, _Features} ->
Acc;
empty ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end.
feature_to_xml({{Feature, _Host}}) ->
feature_to_xml(Feature);
+
+feature_to_xml(Feature) when is_binary(Feature) ->
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [
+ ?XMLATTR('var', Feature)
+ ]};
+
feature_to_xml(Feature) when is_list(Feature) ->
- {xmlelement, "feature", [{"var", Feature}], []}.
+ feature_to_xml(list_to_binary(Feature));
+feature_to_xml(Feature) when is_atom(Feature) ->
+ feature_to_xml(atom_to_list(Feature)).
domain_to_xml({Domain}) ->
- {xmlelement, "item", [{"jid", Domain}], []};
-domain_to_xml(Domain) ->
- {xmlelement, "item", [{"jid", Domain}], []}.
+ domain_to_xml(Domain);
+domain_to_xml(Domain) when is_binary(Domain)->
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [
+ ?XMLATTR('jid', Domain)
+ ]};
+domain_to_xml(Domain) when is_list(Domain) ->
+ domain_to_xml(list_to_binary(Domain)).
get_local_services({error, _Error} = Acc, _From, _To, _Node, _Lang) ->
Acc;
-get_local_services(Acc, _From, To, [], _Lang) ->
+get_local_services(Acc, _From, To, <<>>, _Lang) ->
Items = case Acc of
{result, Its} -> Its;
empty -> []
end,
- Host = To#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(To),
{result,
lists:usort(
lists:map(fun domain_to_xml/1,
@@ -240,7 +248,7 @@ get_local_services({result, _} = Acc, _From, _To, _Node, _Lang) ->
Acc;
get_local_services(empty, _From, _To, _Node, _Lang) ->
- {error, ?ERR_ITEM_NOT_FOUND}.
+ {error, 'item-not-found'}.
get_vh_services(Host) ->
Hosts = lists:sort(fun(H1, H2) -> length(H1) >= length(H2) end, ?MYHOSTS),
@@ -258,45 +266,42 @@ get_vh_services(Host) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-process_sm_iq_items(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 ->
- Host = To#jid.lserver,
- Node = xml:get_tag_attr_s("node", SubEl),
- case ejabberd_hooks:run_fold(disco_sm_items,
- Host,
- empty,
- [From, To, Node, Lang]) of
- {result, Items} ->
- ANode = case Node of
- "" -> [];
- _ -> [{"node", Node}]
- end,
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", ?NS_DISCO_ITEMS} | ANode],
- Items
- }]};
- {error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
- end
- end.
+process_sm_iq_items(From, To, #iq{type = get, payload = SubEl,
+ lang = Lang} = IQ_Rec) ->
+ Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
+ case ejabberd_hooks:run_fold(disco_sm_items,
+ exmpp_jid:prep_domain(To),
+ empty,
+ [From, To, Node, Lang]) of
+ {result, Items} ->
+ ANode = case Node of
+ <<>> -> [];
+ _ -> [?XMLATTR('node', Node)]
+ end,
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS, name = 'query',
+ attrs = ANode, children = Items},
+ exmpp_iq:result(IQ_Rec, Result);
+ {error, Error} ->
+ exmpp_iq:error(IQ_Rec, Error)
+ end;
+process_sm_iq_items(_From, _To, #iq{type = set, payload = _SubEl} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
get_sm_items({error, _Error} = Acc, _From, _To, _Node, _Lang) ->
Acc;
-get_sm_items(Acc,
- #jid{luser = LFrom, lserver = LSFrom},
- #jid{user = User, server = Server, luser = LTo, lserver = LSTo} = _To,
- [], _Lang) ->
+get_sm_items(Acc, From, To, <<>>, _Lang) ->
+ LFrom = exmpp_jid:prep_node_as_list(From),
+ LSFrom = exmpp_jid:prep_domain_as_list(From),
+ LTo = exmpp_jid:prep_node_as_list(To),
+ LSTo = exmpp_jid:prep_domain_as_list(To),
+
Items = case Acc of
{result, Its} -> Its;
empty -> []
end,
Items1 = case {LFrom, LSFrom} of
- {LTo, LSTo} -> get_user_resources(User, Server);
+ {LTo, LSTo} -> [binary_to_list(R) || R <- get_user_resources(To)];
_ -> []
end,
{result, Items ++ Items1};
@@ -305,87 +310,92 @@ get_sm_items({result, _} = Acc, _From, _To, _Node, _Lang) ->
Acc;
get_sm_items(empty, From, To, _Node, _Lang) ->
- #jid{luser = LFrom, lserver = LSFrom} = From,
- #jid{luser = LTo, lserver = LSTo} = To,
+ LFrom = exmpp_jid:prep_node_as_list(From),
+ LSFrom = exmpp_jid:prep_domain_as_list(From),
+ LTo = exmpp_jid:prep_node_as_list(To),
+ LSTo = exmpp_jid:prep_domain_as_list(To),
case {LFrom, LSFrom} of
{LTo, LSTo} ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
_ ->
- {error, ?ERR_NOT_ALLOWED}
+ {error, 'not-allowed'}
end.
-process_sm_iq_info(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 ->
- Host = To#jid.lserver,
- Node = xml:get_tag_attr_s("node", SubEl),
- Identity = ejabberd_hooks:run_fold(disco_sm_identity,
- Host,
- [],
- [From, To, Node, Lang]),
- case ejabberd_hooks:run_fold(disco_sm_features,
- Host,
- empty,
- [From, To, Node, Lang]) of
- {result, Features} ->
- ANode = case Node of
- "" -> [];
- _ -> [{"node", Node}]
- end,
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", ?NS_DISCO_INFO} | ANode],
- Identity ++
- lists:map(fun feature_to_xml/1, Features)
- }]};
- {error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
- end
- end.
+process_sm_iq_info(From, To, #iq{type = get, payload = SubEl,
+ lang = Lang} = IQ_Rec) ->
+ Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
+ Identity = ejabberd_hooks:run_fold(disco_sm_identity,
+ exmpp_jid:prep_domain(To),
+ [],
+ [From, To, Node, Lang]),
+ case ejabberd_hooks:run_fold(disco_sm_features,
+ exmpp_jid:prep_domain(To),
+ empty,
+ [From, To, Node, Lang]) of
+ {result, Features} ->
+ ANode = case Node of
+ <<>> -> [];
+ _ -> [?XMLATTR('node', Node)]
+ end,
+ Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
+ attrs = ANode,
+ children = Identity ++ lists:map(fun feature_to_xml/1,
+ Features)},
+ exmpp_iq:result(IQ_Rec, Result);
+ {error, Error} ->
+ exmpp_iq:error(IQ_Rec, Error)
+ end;
+process_sm_iq_info(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
get_sm_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
get_sm_features(empty, From, To, _Node, _Lang) ->
- #jid{luser = LFrom, lserver = LSFrom} = From,
- #jid{luser = LTo, lserver = LSTo} = To,
+ LFrom = exmpp_jid:prep_node_as_list(From),
+ LSFrom = exmpp_jid:prep_domain_as_list(From),
+ LTo = exmpp_jid:prep_node_as_list(To),
+ LSTo = exmpp_jid:prep_domain_as_list(To),
case {LFrom, LSFrom} of
{LTo, LSTo} ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
_ ->
- {error, ?ERR_NOT_ALLOWED}
+ {error, 'not-allowed'}
end;
get_sm_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
-get_user_resources(User, Server) ->
- Rs = ejabberd_sm:get_user_resources(User, Server),
+get_user_resources(JID) ->
+ Rs = ejabberd_sm:get_user_resources(exmpp_jid:prep_node(JID),
+ exmpp_jid:prep_domain(JID)),
lists:map(fun(R) ->
- {xmlelement, "item",
- [{"jid", User ++ "@" ++ Server ++ "/" ++ R},
- {"name", User}], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [
+ ?XMLATTR('jid',
+ exmpp_jid:to_binary(exmpp_jid:full(JID, R))),
+ ?XMLATTR('name', exmpp_jid:prep_node(JID))
+ ]}
end, lists:sort(Rs)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Support for: XEP-0157 Contact Addresses for XMPP Services
-
-get_info(_A, Host, Module, Node, _Lang) when Node == [] ->
+
+get_info(Acc, Host, Module, Node, _Lang) when Node == <<>> ->
Serverinfo_fields = get_fields_xml(Host, Module),
- [{xmlelement, "x",
- [{"xmlns", ?NS_XDATA}, {"type", "result"}],
- [{xmlelement, "field",
- [{"var", "FORM_TYPE"}, {"type", "hidden"}],
- [{xmlelement, "value",
- [],
- [{xmlcdata, ?NS_SERVERINFO}]
- }]
- }]
- ++ Serverinfo_fields
- }];
+ CData1 = #xmlcdata{cdata = list_to_binary(?NS_SERVERINFO_s)},
+ Value1 = #xmlel{name = 'value', children = [CData1]},
+ Field1 = #xmlel{name = 'field',
+ attrs = [?XMLATTR('type', <<"hidden">>),
+ ?XMLATTR('var', <<"FORM_TYPE">>)],
+ children = [Value1]
+ },
+ X = #xmlel{name = 'x',
+ ns = ?NS_DATA_FORMS,
+ attrs = [?XMLATTR('type', <<"result">>)],
+ children = [Field1 | Serverinfo_fields]
+ },
+ [X | Acc];
get_info(_, _, _, _Node, _) ->
[].
@@ -410,18 +420,16 @@ fields_to_xml(Fields) ->
field_to_xml({_, Var, Values}) ->
Values_xml = values_to_xml(Values),
- {xmlelement, "field",
- [{"var", Var}],
- Values_xml
- }.
+ #xmlel{name = 'field',
+ attrs = [?XMLATTR('var', list_to_binary(Var))],
+ children = Values_xml
+ }.
values_to_xml(Values) ->
lists:map(
fun(Value) ->
- {xmlelement, "value",
- [],
- [{xmlcdata, Value}]
- }
+ CData= #xmlcdata{cdata = list_to_binary(Value)},
+ #xmlel{name = 'value', children = [CData]}
end,
Values
).
diff --git a/src/mod_echo.erl b/src/mod_echo.erl
index 653bcf405..9927b24b8 100644
--- a/src/mod_echo.erl
+++ b/src/mod_echo.erl
@@ -37,8 +37,9 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(state, {host}).
@@ -117,8 +118,8 @@ handle_cast(_Msg, 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);
+ Packet2 = case exmpp_jid:node(From) of
+ undefined -> exmpp_stanza:reply_with_error(Packet, 'bad-request');
_ -> Packet
end,
do_client_version(disabled, To, From), % Put 'enabled' to enable it
@@ -171,16 +172,15 @@ code_change(_OldVsn, State, _Extra) ->
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},
+ From2 = exmpp_jid:full(From,Random_resource),
%% Build an iq:query request
- Packet = {xmlelement, "iq",
- [{"to", ToS}, {"type", "get"}],
- [{xmlelement, "query", [{"xmlns", ?NS_VERSION}], []}]},
+ Request = #xmlel{ns = ?NS_SOFT_VERSION, name = 'query'},
+ Packet = exmpp_stanza:set_recipient(
+ exmpp_iq:get(?NS_JABBER_CLIENT, Request),
+ To),
%% Send the request
ejabberd_router:route(From2, To, Packet),
@@ -189,15 +189,15 @@ do_client_version(enabled, From, To) ->
%% 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"),
+ #xmlel{ns = ?NS_SOFT_VERSION, name = 'query', children = List} = exmpp_iq:get_payload(IQ),
List
after 5000 -> % Timeout in miliseconds: 5 seconds
[]
end,
- Values = [{Name, Value} || {xmlelement,Name,[],[{xmlcdata,Value}]} <- Els],
+ Values = [{Name, exmpp_xml:get_cdata_as_list(El)} || #xmlel{name = Name} = El <- 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]).
+ ?INFO_MSG("Information of the client: ~s~s", [exmpp_jid:to_binary(To), Values_string2]).
diff --git a/src/mod_irc/Makefile.in b/src/mod_irc/Makefile.in
deleted file mode 100644
index 9dcf9f182..000000000
--- a/src/mod_irc/Makefile.in
+++ /dev/null
@@ -1,60 +0,0 @@
-# $Id$
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@ @LIBICONV@
-
-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
-endif
-
-ERLSHLIBS = ../iconv_erl.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) $(INCLUDES) $(CFLAGS) $(LDFLAGS) \
- $(subst ../,,$(subst .so,.c,$@)) \
- $(LIBS) \
- $(ERLANG_CFLAGS) \
- $(ERLANG_LIBS) \
- -o $@ \
- $(DYNAMIC_LIB_CFLAGS)
-
-clean:
- rm -f $(BEAMS) $(ERLSHLIBS)
-
-distclean: clean
- rm -f Makefile
-
-TAGS:
- etags *.erl
-
diff --git a/src/mod_irc/Makefile.win32 b/src/mod_irc/Makefile.win32
deleted file mode 100644
index 9c22f43f1..000000000
--- a/src/mod_irc/Makefile.win32
+++ /dev/null
@@ -1,42 +0,0 @@
-
-include ..\Makefile.inc
-
-EFLAGS = -I .. -pz ..
-
-OUTDIR = ..
-BEAMS = ..\iconv.beam ..\mod_irc.beam ..\mod_irc_connection.beam
-
-SOURCE = iconv_erl.c
-OBJECT = iconv_erl.o
-DLL = $(OUTDIR)\iconv_erl.dll
-
-ALL : $(DLL) $(BEAMS)
-
-CLEAN :
- -@erase $(DLL)
- -@erase $(OUTDIR)\iconv_erl.exp
- -@erase $(OUTDIR)\iconv_erl.lib
- -@erase $(OBJECT)
- -@erase $(BEAMS)
-
-$(OUTDIR)\iconv.beam : iconv.erl
- erlc -W $(EFLAGS) -o $(OUTDIR) iconv.erl
-
-$(OUTDIR)\mod_irc.beam : mod_irc.erl
- erlc -W $(EFLAGS) -o $(OUTDIR) mod_irc.erl
-
-$(OUTDIR)\mod_irc_connection.beam : mod_irc_connection.erl
- erlc -W $(EFLAGS) -o $(OUTDIR) mod_irc_connection.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"$(ICONV_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" "$(ICONV_LIB)" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib
-
-$(DLL) : $(OBJECT)
- $(LD) $(LD_FLAGS) -out:$(DLL) $(OBJECT)
-
-$(OBJECT) : $(SOURCE)
- $(CC) $(CC_FLAGS) -c -Fo$(OBJECT) $(SOURCE)
-
diff --git a/src/mod_irc/iconv.erl b/src/mod_irc/iconv.erl
deleted file mode 100644
index 8cccf2df8..000000000
--- a/src/mod_irc/iconv.erl
+++ /dev/null
@@ -1,94 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : iconv.erl
-%%% Author : Alexey Shchepin
-%%% Purpose : Interface to libiconv
-%%% Created : 16 Feb 2003 by Alexey Shchepin
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2009 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(iconv).
--author('alexey@process-one.net').
-
--behaviour(gen_server).
-
--export([start/0, start_link/0, convert/3]).
-
-%% Internal exports, call-back functions.
--export([init/1,
- handle_call/3,
- handle_cast/2,
- handle_info/2,
- code_change/3,
- terminate/2]).
-
-
-
-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(), iconv_erl) of
- ok -> ok;
- {error, already_loaded} -> ok
- end,
- Port = open_port({spawn, iconv_erl}, []),
- ets:new(iconv_table, [set, public, named_table]),
- ets:insert(iconv_table, {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.
-
-
-
-convert(From, To, String) ->
- [{port, Port} | _] = ets:lookup(iconv_table, port),
- Bin = term_to_binary({From, To, String}),
- BRes = port_control(Port, 1, Bin),
- binary_to_list(BRes).
-
-
-
diff --git a/src/mod_irc/iconv_erl.c b/src/mod_irc/iconv_erl.c
deleted file mode 100644
index f301bd537..000000000
--- a/src/mod_irc/iconv_erl.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * ejabberd, Copyright (C) 2002-2009 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
-
-typedef struct {
- ErlDrvPort port;
- iconv_t cd;
-} iconv_data;
-
-
-static ErlDrvData iconv_erl_start(ErlDrvPort port, char *buff)
-{
- iconv_data* d = (iconv_data*)driver_alloc(sizeof(iconv_data));
- d->port = port;
- d->cd = NULL;
-
- set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
-
- return (ErlDrvData)d;
-}
-
-static void iconv_erl_stop(ErlDrvData handle)
-{
- driver_free((char*)handle);
-}
-
-static int iconv_erl_control(ErlDrvData drv_data,
- unsigned int command,
- char *buf, int len,
- char **rbuf, int rlen)
-{
- int i;
- int size;
- int index = 0;
- int avail;
- size_t inleft, outleft;
- ErlDrvBinary *b;
- char *from, *to, *string, *stmp, *rstring, *rtmp;
- iconv_t cd;
- int invalid_utf8_as_latin1 = 0;
-
- ei_decode_version(buf, &index, &i);
- ei_decode_tuple_header(buf, &index, &i);
- ei_get_type(buf, &index, &i, &size);
- from = malloc(size + 1);
- ei_decode_string(buf, &index, from);
-
- ei_get_type(buf, &index, &i, &size);
- to = malloc(size + 1);
- ei_decode_string(buf, &index, to);
-
- ei_get_type(buf, &index, &i, &size);
- stmp = string = malloc(size + 1);
- ei_decode_string(buf, &index, string);
-
- /* Special mode: parse as UTF-8 if possible; otherwise assume it's
- Latin-1. Makes no difference when encoding. */
- if (strcmp(from, "utf-8+latin-1") == 0) {
- from[5] = '\0';
- invalid_utf8_as_latin1 = 1;
- }
- if (strcmp(to, "utf-8+latin-1") == 0) {
- to[5] = '\0';
- }
- cd = iconv_open(to, from);
-
- if (cd == (iconv_t) -1) {
- cd = iconv_open("ascii", "ascii");
- if (cd == (iconv_t) -1) {
- *rbuf = (char*)(b = driver_alloc_binary(size));
- memcpy(b->orig_bytes, string, size);
-
- free(from);
- free(to);
- free(string);
-
- return size;
- }
- }
-
- outleft = avail = 4*size;
- inleft = size;
- rtmp = rstring = malloc(avail);
- while (inleft > 0) {
- if (iconv(cd, &stmp, &inleft, &rtmp, &outleft) == (size_t) -1) {
- if (invalid_utf8_as_latin1 && (*stmp & 0x80) && outleft >= 2) {
- /* Encode one byte of (assumed) Latin-1 into two bytes of UTF-8 */
- *rtmp++ = 0xc0 | ((*stmp & 0xc0) >> 6);
- *rtmp++ = 0x80 | (*stmp & 0x3f);
- outleft -= 2;
- }
- stmp++;
- inleft--;
- }
- }
-
- size = rtmp - rstring;
-
- *rbuf = (char*)(b = driver_alloc_binary(size));
- memcpy(b->orig_bytes, rstring, size);
-
- free(from);
- free(to);
- free(string);
- free(rstring);
- iconv_close(cd);
-
- return size;
-}
-
-
-
-ErlDrvEntry iconv_driver_entry = {
- NULL, /* F_PTR init, N/A */
- iconv_erl_start, /* L_PTR start, called when port is opened */
- iconv_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 */
- "iconv_erl", /* char *driver_name, the argument to open_port */
- NULL, /* F_PTR finish, called when unloaded */
- NULL, /* handle */
- iconv_erl_control, /* F_PTR control, port_command callback */
- NULL, /* F_PTR timeout, reserved */
- NULL /* F_PTR outputv, reserved */
-};
-
-DRIVER_INIT(iconv_erl) /* must match name in driver_entry */
-{
- return &iconv_driver_entry;
-}
-
-
diff --git a/src/mod_irc/mod_irc.erl b/src/mod_irc/mod_irc.erl
deleted file mode 100644
index 4b8b246af..000000000
--- a/src/mod_irc/mod_irc.erl
+++ /dev/null
@@ -1,1016 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : mod_irc.erl
-%%% Author : Alexey Shchepin
-%%% Purpose : IRC transport
-%%% Created : 15 Feb 2003 by Alexey Shchepin
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2009 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_irc).
--author('alexey@process-one.net').
-
--behaviour(gen_server).
--behaviour(gen_mod).
-
-%% API
--export([start_link/2,
- start/2,
- stop/1,
- closed_connection/3,
- get_connection_params/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").
--include("adhoc.hrl").
-
--define(DEFAULT_IRC_ENCODING, "iso8859-1").
--define(DEFAULT_IRC_PORT, 6667).
--define(POSSIBLE_ENCODINGS, ["koi8-r", "iso8859-1", "iso8859-2", "utf-8", "utf-8+latin-1"]).
-
--record(irc_connection, {jid_server_host, pid}).
--record(irc_custom, {us_host, data}).
-
--record(state, {host, server_host, access}).
-
--define(PROCNAME, ejabberd_mod_irc).
-
-%%====================================================================
-%% 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) ->
- start_supervisor(Host),
- 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) ->
- stop_supervisor(Host),
- Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- gen_server:call(Proc, stop),
- 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]) ->
- iconv:start(),
- mnesia:create_table(irc_custom,
- [{disc_copies, [node()]},
- {attributes, record_info(fields, irc_custom)}]),
- MyHost = gen_mod:get_opt_host(Host, Opts, "irc.@HOST@"),
- update_table(MyHost),
- Access = gen_mod:get_opt(access, Opts, all),
- catch ets:new(irc_connection, [named_table,
- public,
- {keypos, #irc_connection.jid_server_host}]),
- ejabberd_router:register_route(MyHost),
- {ok, #state{host = MyHost,
- server_host = Host,
- access = Access}}.
-
-%%--------------------------------------------------------------------
-%% 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{host = Host,
- server_host = ServerHost,
- access = Access} = State) ->
- case catch do_route(Host, ServerHost, Access, 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.
-%%--------------------------------------------------------------------
-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}.
-
-%%--------------------------------------------------------------------
-%%% Internal functions
-%%--------------------------------------------------------------------
-start_supervisor(Host) ->
- Proc = gen_mod:get_module_proc(Host, ejabberd_mod_irc_sup),
- ChildSpec =
- {Proc,
- {ejabberd_tmp_sup, start_link,
- [Proc, mod_irc_connection]},
- permanent,
- infinity,
- supervisor,
- [ejabberd_tmp_sup]},
- supervisor:start_child(ejabberd_sup, ChildSpec).
-
-stop_supervisor(Host) ->
- Proc = gen_mod:get_module_proc(Host, ejabberd_mod_irc_sup),
- supervisor:terminate_child(ejabberd_sup, Proc),
- supervisor:delete_child(ejabberd_sup, Proc).
-
-do_route(Host, ServerHost, Access, From, To, Packet) ->
- case acl:match_rule(ServerHost, Access, From) of
- allow ->
- do_route1(Host, ServerHost, From, To, Packet);
- _ ->
- {xmlelement, _Name, Attrs, _Els} = Packet,
- Lang = xml:get_attr_s("xml:lang", Attrs),
- ErrText = "Access denied by service policy",
- Err = jlib:make_error_reply(Packet,
- ?ERRT_FORBIDDEN(Lang, ErrText)),
- ejabberd_router:route(To, From, Err)
- end.
-
-do_route1(Host, ServerHost, From, To, Packet) ->
- #jid{user = ChanServ, resource = Resource} = To,
- {xmlelement, _Name, _Attrs, _Els} = Packet,
- case ChanServ of
- "" ->
- case Resource of
- "" ->
- case jlib:iq_query_info(Packet) of
- #iq{type = get, xmlns = ?NS_DISCO_INFO = XMLNS,
- sub_el = SubEl, lang = Lang} = IQ ->
- Node = xml:get_tag_attr_s("node", SubEl),
- Info = ejabberd_hooks:run_fold(
- disco_info, ServerHost, [],
- [ServerHost, ?MODULE, "", ""]),
- case iq_disco(Node, Lang) of
- [] ->
- Res = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- []}]},
- ejabberd_router:route(To,
- From,
- jlib:iq_to_xml(Res));
- DiscoInfo ->
- Res = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- DiscoInfo ++ Info}]},
- ejabberd_router:route(To,
- From,
- jlib:iq_to_xml(Res))
- end;
- #iq{type = get, xmlns = ?NS_DISCO_ITEMS = XMLNS,
- sub_el = SubEl, lang = Lang} = IQ ->
- Node = xml:get_tag_attr_s("node", SubEl),
- case Node of
- [] ->
- ResIQ = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- []}]},
- Res = jlib:iq_to_xml(ResIQ);
- "join" ->
- ResIQ = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- []}]},
- Res = jlib:iq_to_xml(ResIQ);
- "register" ->
- ResIQ = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- []}]},
- Res = jlib:iq_to_xml(ResIQ);
- ?NS_COMMANDS ->
- ResIQ = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS},
- {"node", Node}],
- command_items(Host, Lang)}]},
- Res = jlib:iq_to_xml(ResIQ);
- _ ->
- Res = jlib:make_error_reply(
- Packet, ?ERR_ITEM_NOT_FOUND)
- end,
- ejabberd_router:route(To,
- From,
- Res);
- #iq{xmlns = ?NS_REGISTER} = IQ ->
- process_register(Host, From, To, IQ);
- #iq{type = get, xmlns = ?NS_VCARD = XMLNS,
- lang = Lang} = 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,
- lang = _Lang, sub_el = SubEl} = IQ ->
- Request = adhoc:parse_request(IQ),
- case lists:keysearch(Request#adhoc_request.node, 1, commands()) of
- {value, {_, _, Function}} ->
- case catch Function(From, To, Request) of
- {'EXIT', Reason} ->
- ?ERROR_MSG("~p~nfor ad-hoc handler of ~p",
- [Reason, {From, To, IQ}]),
- Res = IQ#iq{type = error, sub_el = [SubEl,
- ?ERR_INTERNAL_SERVER_ERROR]};
- ignore ->
- Res = ignore;
- {error, Error} ->
- Res = IQ#iq{type = error, sub_el = [SubEl, Error]};
- Command ->
- Res = IQ#iq{type = result, sub_el = [Command]}
- end,
- if Res /= ignore ->
- ejabberd_router:route(To, From, jlib:iq_to_xml(Res));
- true ->
- ok
- end;
- _ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_ITEM_NOT_FOUND),
- ejabberd_router:route(To, From, Err)
- end;
- #iq{} = _IQ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
- ejabberd_router:route(To, From, Err);
- _ ->
- ok
- end;
- _ ->
- Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST),
- ejabberd_router:route(To, From, Err)
- end;
- _ ->
- case string:tokens(ChanServ, "%") of
- [[_ | _] = Channel, [_ | _] = Server] ->
- case ets:lookup(irc_connection, {From, Server, Host}) of
- [] ->
- ?DEBUG("open new connection~n", []),
- {Username, Encoding, Port, Password} = get_connection_params(
- Host, From, Server),
- ConnectionUsername =
- case Packet of
- %% If the user tries to join a
- %% chatroom, the packet for sure
- %% contains the desired username.
- {xmlelement, "presence", _, _} ->
- Resource;
- %% Otherwise, there is no firm
- %% conclusion from the packet.
- %% Better to use the configured
- %% username (which defaults to the
- %% username part of the JID).
- _ ->
- Username
- end,
- {ok, Pid} = mod_irc_connection:start(
- From, Host, ServerHost, Server,
- ConnectionUsername, Encoding, Port, Password),
- ets:insert(
- irc_connection,
- #irc_connection{jid_server_host = {From, Server, Host},
- pid = Pid}),
- mod_irc_connection:route_chan(
- Pid, Channel, Resource, Packet),
- ok;
- [R] ->
- Pid = R#irc_connection.pid,
- ?DEBUG("send to process ~p~n",
- [Pid]),
- mod_irc_connection:route_chan(
- Pid, Channel, Resource, Packet),
- ok
- end;
- _ ->
- case string:tokens(ChanServ, "!") of
- [[_ | _] = Nick, [_ | _] = Server] ->
- case ets:lookup(irc_connection, {From, Server, Host}) of
- [] ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_SERVICE_UNAVAILABLE),
- ejabberd_router:route(To, From, Err);
- [R] ->
- Pid = R#irc_connection.pid,
- ?DEBUG("send to process ~p~n",
- [Pid]),
- mod_irc_connection:route_nick(
- Pid, Nick, Packet),
- ok
- end;
- _ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_BAD_REQUEST),
- ejabberd_router:route(To, From, Err)
- end
- end
- end.
-
-
-closed_connection(Host, From, Server) ->
- ets:delete(irc_connection, {From, Server, Host}).
-
-
-iq_disco([], Lang) ->
- [{xmlelement, "identity",
- [{"category", "conference"},
- {"type", "irc"},
- {"name", translate:translate(Lang, "IRC Transport")}], []},
- {xmlelement, "feature", [{"var", ?NS_DISCO_INFO}], []},
- {xmlelement, "feature", [{"var", ?NS_MUC}], []},
- {xmlelement, "feature", [{"var", ?NS_REGISTER}], []},
- {xmlelement, "feature", [{"var", ?NS_VCARD}], []},
- {xmlelement, "feature", [{"var", ?NS_COMMANDS}], []}];
-iq_disco(Node, Lang) ->
- case lists:keysearch(Node, 1, commands()) of
- {value, {_, Name, _}} ->
- [{xmlelement, "identity",
- [{"category", "automation"},
- {"type", "command-node"},
- {"name", translate:translate(Lang, Name)}], []},
- {xmlelement, "feature",
- [{"var", ?NS_COMMANDS}], []},
- {xmlelement, "feature",
- [{"var", ?NS_XDATA}], []}];
- _ ->
- []
- end.
-
-iq_get_vcard(Lang) ->
- [{xmlelement, "FN", [],
- [{xmlcdata, "ejabberd/mod_irc"}]},
- {xmlelement, "URL", [],
- [{xmlcdata, ?EJABBERD_URI}]},
- {xmlelement, "DESC", [],
- [{xmlcdata, translate:translate(Lang, "ejabberd IRC module") ++
- "\nCopyright (c) 2003-2009 Alexey Shchepin"}]}].
-
-command_items(Host, Lang) ->
- lists:map(fun({Node, Name, _Function})
- -> {xmlelement, "item",
- [{"jid", Host},
- {"node", Node},
- {"name", translate:translate(Lang, Name)}], []}
- end, commands()).
-
-commands() ->
- [{"join", "Join channel", fun adhoc_join/3},
- {"register", "Configure username, encoding, port and password", fun adhoc_register/3}].
-
-process_register(Host, From, To, #iq{} = IQ) ->
- case catch process_irc_register(Host, 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.
-
-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).
-
-process_irc_register(Host, From, _To,
- #iq{type = Type, xmlns = XMLNS,
- lang = Lang, sub_el = SubEl} = IQ) ->
- case Type of
- set ->
- XDataEl = find_xdata_el(SubEl),
- case XDataEl of
- false ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ACCEPTABLE]};
- {xmlelement, _Name, Attrs, _SubEls} ->
- case xml:get_attr_s("type", Attrs) of
- "cancel" ->
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}], []}]};
- "submit" ->
- XData = jlib:parse_xdata_submit(XDataEl),
- case XData of
- invalid ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_BAD_REQUEST]};
- _ ->
- Node = string:tokens(
- xml:get_tag_attr_s("node", SubEl),
- "/"),
- case set_form(
- Host, From, Node, Lang, XData) of
- {result, Res} ->
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- Res
- }]};
- {error, Error} ->
- IQ#iq{type = error,
- sub_el = [SubEl, Error]}
- end
- end;
- _ ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_BAD_REQUEST]}
- end
- end;
- get ->
- Node =
- string:tokens(xml:get_tag_attr_s("node", SubEl), "/"),
- case get_form(Host, From, Node, Lang) of
- {result, Res} ->
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- Res
- }]};
- {error, Error} ->
- IQ#iq{type = error,
- sub_el = [SubEl, Error]}
- end
- end.
-
-
-
-get_form(Host, From, [], Lang) ->
- #jid{user = User, server = Server,
- luser = LUser, lserver = LServer} = From,
- US = {LUser, LServer},
- Customs =
- case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
- {'EXIT', _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- [] ->
- {User, []};
- [#irc_custom{data = Data}] ->
- {xml:get_attr_s(username, Data),
- xml:get_attr_s(connections_params, Data)}
- end,
- case Customs of
- {error, _Error} ->
- Customs;
- {Username, ConnectionsParams} ->
- {result,
- [{xmlelement, "instructions", [],
- [{xmlcdata,
- translate:translate(
- Lang,
- "You need an x:data capable client "
- "to configure mod_irc settings")}]},
- {xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [{xmlelement, "title", [],
- [{xmlcdata,
- translate:translate(
- Lang,
- "Registration in mod_irc for ") ++ User ++ "@" ++ Server}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- translate:translate(
- Lang,
- "Enter username, encodings, ports and passwords you wish to use for "
- "connecting to IRC servers")}]},
- {xmlelement, "field", [{"type", "text-single"},
- {"label",
- translate:translate(
- Lang, "IRC Username")},
- {"var", "username"}],
- [{xmlelement, "value", [], [{xmlcdata, Username}]}]},
- {xmlelement, "field", [{"type", "fixed"}],
- [{xmlelement, "value", [],
- [{xmlcdata,
- lists:flatten(
- io_lib:format(
- translate:translate(
- Lang,
- "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."),
- [?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT]))}]}]},
- {xmlelement, "field", [{"type", "fixed"}],
- [{xmlelement, "value", [],
- [{xmlcdata,
- translate:translate(
- Lang,
- "Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, "
- "{\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
- )}]}]},
- {xmlelement, "field", [{"type", "text-multi"},
- {"label",
- translate:translate(Lang, "Connections parameters")},
- {"var", "connections_params"}],
- lists:map(
- fun(S) ->
- {xmlelement, "value", [], [{xmlcdata, S}]}
- end,
- string:tokens(
- lists:flatten(
- io_lib:format("~p.", [ConnectionsParams])),
- "\n"))
- }
- ]}]}
- end;
-
-get_form(_Host, _, _, _Lang) ->
- {error, ?ERR_SERVICE_UNAVAILABLE}.
-
-
-
-
-set_form(Host, From, [], _Lang, XData) ->
- {LUser, LServer, _} = jlib:jid_tolower(From),
- US = {LUser, LServer},
- case {lists:keysearch("username", 1, XData),
- lists:keysearch("connections_params", 1, XData)} of
- {{value, {_, [Username]}}, {value, {_, Strings}}} ->
- EncString = lists:foldl(fun(S, Res) ->
- Res ++ S ++ "\n"
- end, "", Strings),
- case erl_scan:string(EncString) of
- {ok, Tokens, _} ->
- case erl_parse:parse_term(Tokens) of
- {ok, ConnectionsParams} ->
- case mnesia:transaction(
- fun() ->
- mnesia:write(
- #irc_custom{us_host =
- {US, Host},
- data =
- [{username,
- Username},
- {connections_params,
- ConnectionsParams}]})
- end) of
- {atomic, _} ->
- {result, []};
- _ ->
- {error, ?ERR_NOT_ACCEPTABLE}
- end;
- _ ->
- {error, ?ERR_NOT_ACCEPTABLE}
- end;
- _ ->
- {error, ?ERR_NOT_ACCEPTABLE}
- end;
- _ ->
- {error, ?ERR_NOT_ACCEPTABLE}
- end;
-
-
-set_form(_Host, _, _, _Lang, _XData) ->
- {error, ?ERR_SERVICE_UNAVAILABLE}.
-
-
-get_connection_params(Host, From, IRCServer) ->
- #jid{user = User, server = _Server,
- luser = LUser, lserver = LServer} = From,
- US = {LUser, LServer},
- case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
- {'EXIT', _Reason} ->
- {User, ?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT, ""};
- [] ->
- {User, ?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT, ""};
- [#irc_custom{data = Data}] ->
- Username = xml:get_attr_s(username, Data),
- {NewUsername, NewEncoding, NewPort, NewPassword} =
- case lists:keysearch(IRCServer, 1, xml:get_attr_s(connections_params, Data)) of
- {value, {_, Encoding, Port, Password}} ->
- {Username, Encoding, Port, Password};
- {value, {_, Encoding, Port}} ->
- {Username, Encoding, Port, ""};
- {value, {_, Encoding}} ->
- {Username, Encoding, ?DEFAULT_IRC_PORT, ""};
- _ ->
- {Username, ?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT, ""}
- end,
- {NewUsername,
- NewEncoding,
- if
- NewPort >= 0 andalso NewPort =< 65535 ->
- NewPort;
- true ->
- ?DEFAULT_IRC_PORT
- end,
- NewPassword}
- end.
-
-adhoc_join(_From, _To, #adhoc_request{action = "cancel"} = Request) ->
- adhoc:produce_response(Request,
- #adhoc_response{status = canceled});
-adhoc_join(From, To, #adhoc_request{lang = Lang,
- node = _Node,
- action = _Action,
- xdata = XData} = Request) ->
- %% Access control has already been taken care of in do_route.
- if XData == false ->
- Form =
- {xmlelement, "x",
- [{"xmlns", ?NS_XDATA},
- {"type", "form"}],
- [{xmlelement, "title", [], [{xmlcdata, translate:translate(Lang, "Join IRC channel")}]},
- {xmlelement, "field",
- [{"var", "channel"},
- {"type", "text-single"},
- {"label", translate:translate(Lang, "IRC channel (don't put the first #)")}],
- [{xmlelement, "required", [], []}]},
- {xmlelement, "field",
- [{"var", "server"},
- {"type", "text-single"},
- {"label", translate:translate(Lang, "IRC server")}],
- [{xmlelement, "required", [], []}]}]},
- adhoc:produce_response(Request,
- #adhoc_response{status = executing,
- elements = [Form]});
- true ->
- case jlib:parse_xdata_submit(XData) of
- invalid ->
- {error, ?ERR_BAD_REQUEST};
- Fields ->
- Channel = case lists:keysearch("channel", 1, Fields) of
- {value, {"channel", C}} ->
- C;
- _ ->
- false
- end,
- Server = case lists:keysearch("server", 1, Fields) of
- {value, {"server", S}} ->
- S;
- _ ->
- false
- end,
- if Channel /= false,
- Server /= false ->
- RoomJID = Channel ++ "%" ++ Server ++ "@" ++ To#jid.server,
- Invite = {xmlelement, "message", [],
- [{xmlelement, "x",
- [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "invite",
- [{"from", jlib:jid_to_string(From)}],
- [{xmlelement, "reason", [],
- [{xmlcdata,
- translate:translate(Lang,
- "Join the IRC channel here.")}]}]}]},
- {xmlelement, "x",
- [{"xmlns", ?NS_XCONFERENCE}],
- [{xmlcdata, translate:translate(Lang,
- "Join the IRC channel here.")}]},
- {xmlelement, "body", [],
- [{xmlcdata, io_lib:format(
- translate:translate(Lang,
- "Join the IRC channel in this Jabber ID: ~s"),
- [RoomJID])}]}]},
- ejabberd_router:route(jlib:string_to_jid(RoomJID), From, Invite),
- adhoc:produce_response(Request, #adhoc_response{status = completed});
- true ->
- {error, ?ERR_BAD_REQUEST}
- end
- end
- end.
-
-adhoc_register(_From, _To, #adhoc_request{action = "cancel"} = Request) ->
- adhoc:produce_response(Request,
- #adhoc_response{status = canceled});
-adhoc_register(From, To, #adhoc_request{lang = Lang,
- node = _Node,
- xdata = XData,
- action = Action} = Request) ->
- #jid{user = User, luser = LUser, lserver = LServer} = From,
- #jid{lserver = Host} = To,
- US = {LUser, LServer},
- %% Generate form for setting username and encodings. If the user
- %% hasn't begun to fill out the form, generate an initial form
- %% based on current values.
- if XData == false ->
- case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
- {'EXIT', _Reason} ->
- Username = User,
- ConnectionsParams = [];
- [] ->
- Username = User,
- ConnectionsParams = [];
- [#irc_custom{data = Data}] ->
- Username = xml:get_attr_s(username, Data),
- ConnectionsParams = xml:get_attr_s(connections_params, Data)
- end,
- Error = false;
- true ->
- case jlib:parse_xdata_submit(XData) of
- invalid ->
- Error = {error, ?ERR_BAD_REQUEST},
- Username = false,
- ConnectionsParams = false;
- Fields ->
- Username = case lists:keysearch("username", 1, Fields) of
- {value, {"username", U}} ->
- U;
- _ ->
- User
- end,
- ConnectionsParams = parse_connections_params(Fields),
- Error = false
- end
- end,
-
- if Error /= false ->
- Error;
- Action == "complete" ->
- case mnesia:transaction(
- fun () ->
- mnesia:write(
- #irc_custom{us_host =
- {US, Host},
- data =
- [{username,
- Username},
- {connections_params,
- ConnectionsParams}]})
- end) of
- {atomic, _} ->
- adhoc:produce_response(Request, #adhoc_response{status = completed});
- _ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
- end;
- true ->
- Form = generate_adhoc_register_form(Lang, Username, ConnectionsParams),
- adhoc:produce_response(Request,
- #adhoc_response{status = executing,
- elements = [Form],
- actions = ["next", "complete"]})
- end.
-
-generate_adhoc_register_form(Lang, Username, ConnectionsParams) ->
- {xmlelement, "x",
- [{"xmlns", ?NS_XDATA},
- {"type", "form"}],
- [{xmlelement, "title", [], [{xmlcdata, translate:translate(Lang, "IRC settings")}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- translate:translate(
- Lang,
- "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.")}]},
- {xmlelement, "field",
- [{"var", "username"},
- {"type", "text-single"},
- {"label", translate:translate(Lang, "IRC username")}],
- [{xmlelement, "required", [], []},
- {xmlelement, "value", [], [{xmlcdata, Username}]}]}] ++
- generate_connection_params_fields(Lang, ConnectionsParams, 1, [])}.
-
-generate_connection_params_fields(Lang, [], Number, Acc) ->
- Field = generate_connection_params_field(Lang, "", "", -1, "", Number),
- lists:reverse(Field ++ Acc);
-
-generate_connection_params_fields(Lang, [ConnectionParams | ConnectionsParams], Number, Acc) ->
- case ConnectionParams of
- {Server, Encoding, Port, Password} ->
- Field = generate_connection_params_field(Lang, Server, Encoding, Port, Password, Number),
- generate_connection_params_fields(Lang, ConnectionsParams, Number + 1, Field ++ Acc);
- {Server, Encoding, Port} ->
- Field = generate_connection_params_field(Lang, Server, Encoding, Port, [], Number),
- generate_connection_params_fields(Lang, ConnectionsParams, Number + 1, Field ++ Acc);
- {Server, Encoding} ->
- Field = generate_connection_params_field(Lang, Server, Encoding, [], [], Number),
- generate_connection_params_fields(Lang, ConnectionsParams, Number + 1, Field ++ Acc);
- _ ->
- []
- end.
-
-generate_connection_params_field(Lang, Server, Encoding, Port, Password, Number) ->
- EncodingUsed = case Encoding of
- [] ->
- ?DEFAULT_IRC_ENCODING;
- _ ->
- Encoding
- end,
- PortUsedInt = if
- Port >= 0 andalso Port =< 65535 ->
- Port;
- true ->
- ?DEFAULT_IRC_PORT
- end,
- PortUsed = integer_to_list(PortUsedInt),
- PasswordUsed = case Password of
- [] ->
- "";
- _ ->
- Password
- end,
- NumberString = integer_to_list(Number),
- %% Fields are in reverse order, as they will be reversed again later.
- [{xmlelement, "field",
- [{"var", "password" ++ NumberString},
- {"type", "text-single"},
- {"label", io_lib:format(translate:translate(Lang, "Password ~b"), [Number])}],
- [{xmlelement, "value", [], [{xmlcdata, PasswordUsed}]}]},
- {xmlelement, "field",
- [{"var", "port" ++ NumberString},
- {"type", "text-single"},
- {"label", io_lib:format(translate:translate(Lang, "Port ~b"), [Number])}],
- [{xmlelement, "value", [], [{xmlcdata, PortUsed}]}]},
- {xmlelement, "field",
- [{"var", "encoding" ++ NumberString},
- {"type", "list-single"},
- {"label", io_lib:format(translate:translate(Lang, "Encoding for server ~b"), [Number])}],
- [{xmlelement, "value", [], [{xmlcdata, EncodingUsed}]} |
- lists:map(fun(E) ->
- {xmlelement, "option", [{"label", E}],
- [{xmlelement, "value", [], [{xmlcdata, E}]}]}
- end, ?POSSIBLE_ENCODINGS)]},
- {xmlelement, "field",
- [{"var", "server" ++ NumberString},
- {"type", "text-single"},
- {"label", io_lib:format(translate:translate(Lang, "Server ~b"), [Number])}],
- [{xmlelement, "value", [], [{xmlcdata, Server}]}]}].
-
-parse_connections_params(Fields) ->
- %% Find all fields staring with serverN, encodingN, portN and passwordN for any values
- %% of N, and generate lists of {"N", Value}.
- Servers = lists:sort(
- [{lists:nthtail(6, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
- lists:prefix("server", Var)]),
- Encodings = lists:sort(
- [{lists:nthtail(8, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
- lists:prefix("encoding", Var)]),
-
- Ports = lists:sort(
- [{lists:nthtail(4, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
- lists:prefix("port", Var)]),
-
- Passwords = lists:sort(
- [{lists:nthtail(8, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
- lists:prefix("password", Var)]),
-
- %% Now sort the lists, and find the corresponding pairs.
- parse_connections_params(Servers, Encodings, Ports, Passwords).
-
-retrieve_connections_params(ConnectionParams, ServerN) ->
- case ConnectionParams of
- [{ConnectionParamN, ConnectionParam} | ConnectionParamsTail] ->
- if
- ServerN == ConnectionParamN ->
- {ConnectionParam, ConnectionParamsTail};
- ServerN < ConnectionParamN ->
- {[], [{ConnectionParamN, ConnectionParam} | ConnectionParamsTail]};
- ServerN > ConnectionParamN ->
- {[], ConnectionParamsTail}
- end;
- _ ->
- {[], []}
- end.
-
-parse_connections_params([], _, _, _) ->
- [];
-parse_connections_params(_, [], [], []) ->
- [];
-
-parse_connections_params([{ServerN, Server} | Servers], Encodings, Ports, Passwords) ->
- %% Try to match matches of servers, ports, passwords and encodings, no matter what fields
- %% the client might have left out.
- {NewEncoding, NewEncodings} = retrieve_connections_params(Encodings, ServerN),
- {NewPort, NewPorts} = retrieve_connections_params(Ports, ServerN),
- {NewPassword, NewPasswords} = retrieve_connections_params(Passwords, ServerN),
- [{Server, NewEncoding, NewPort, NewPassword} | parse_connections_params(Servers, NewEncodings, NewPorts, NewPasswords)].
-
-update_table(Host) ->
- Fields = record_info(fields, irc_custom),
- case mnesia:table_info(irc_custom, attributes) of
- Fields ->
- ok;
- [userserver, data] ->
- ?INFO_MSG("Converting irc_custom table from "
- "{userserver, data} format", []),
- {atomic, ok} = mnesia:create_table(
- mod_irc_tmp_table,
- [{disc_only_copies, [node()]},
- {type, bag},
- {local_content, true},
- {record_name, irc_custom},
- {attributes, record_info(fields, irc_custom)}]),
- mnesia:transform_table(irc_custom, ignore, Fields),
- F1 = fun() ->
- mnesia:write_lock_table(mod_irc_tmp_table),
- mnesia:foldl(
- fun(#irc_custom{us_host = US} = R, _) ->
- mnesia:dirty_write(
- mod_irc_tmp_table,
- R#irc_custom{us_host = {US, Host}})
- end, ok, irc_custom)
- end,
- mnesia:transaction(F1),
- mnesia:clear_table(irc_custom),
- F2 = fun() ->
- mnesia:write_lock_table(irc_custom),
- mnesia:foldl(
- fun(R, _) ->
- mnesia:dirty_write(R)
- end, ok, mod_irc_tmp_table)
- end,
- mnesia:transaction(F2),
- mnesia:delete_table(mod_irc_tmp_table);
- _ ->
- ?INFO_MSG("Recreating irc_custom table", []),
- mnesia:transform_table(irc_custom, ignore, Fields)
- end.
diff --git a/src/mod_irc/mod_irc_connection.erl b/src/mod_irc/mod_irc_connection.erl
deleted file mode 100644
index 9dac4de70..000000000
--- a/src/mod_irc/mod_irc_connection.erl
+++ /dev/null
@@ -1,1319 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : mod_irc_connection.erl
-%%% Author : Alexey Shchepin
-%%% Purpose :
-%%% Created : 15 Feb 2003 by Alexey Shchepin
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2009 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_irc_connection).
--author('alexey@process-one.net').
-
--behaviour(gen_fsm).
-
-%% External exports
--export([start_link/7, start/8, route_chan/4, route_nick/3]).
-
-%% gen_fsm callbacks
--export([init/1,
- open_socket/2,
- wait_for_registration/2,
- stream_established/2,
- handle_event/3,
- handle_sync_event/4,
- handle_info/3,
- terminate/3,
- code_change/4]).
-
--include("ejabberd.hrl").
--include("jlib.hrl").
-
--define(SETS, gb_sets).
-
--record(state, {socket, encoding, port, password,
- queue, user, host, server, nick,
- channels = dict:new(),
- nickchannel,
- inbuf = "", outbuf = ""}).
-
-%-define(DBGFSM, true).
-
--ifdef(DBGFSM).
--define(FSMOPTS, [{debug, [trace]}]).
--else.
--define(FSMOPTS, []).
--endif.
-
-%%%----------------------------------------------------------------------
-%%% API
-%%%----------------------------------------------------------------------
-start(From, Host, ServerHost, Server, Username, Encoding, Port, Password) ->
- Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_irc_sup),
- supervisor:start_child(
- Supervisor, [From, Host, Server, Username, Encoding, Port, Password]).
-
-start_link(From, Host, Server, Username, Encoding, Port, Password) ->
- gen_fsm:start_link(?MODULE, [From, Host, Server, Username, Encoding, Port, Password],
- ?FSMOPTS).
-
-%%%----------------------------------------------------------------------
-%%% Callback functions from gen_fsm
-%%%----------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% Func: init/1
-%% Returns: {ok, StateName, StateData} |
-%% {ok, StateName, StateData, Timeout} |
-%% ignore |
-%% {stop, StopReason}
-%%----------------------------------------------------------------------
-init([From, Host, Server, Username, Encoding, Port, Password]) ->
- gen_fsm:send_event(self(), init),
- {ok, open_socket, #state{queue = queue:new(),
- encoding = Encoding,
- port = Port,
- password = Password,
- user = From,
- nick = Username,
- host = Host,
- server = Server}}.
-
-%%----------------------------------------------------------------------
-%% Func: StateName/2
-%% Returns: {next_state, NextStateName, NextStateData} |
-%% {next_state, NextStateName, NextStateData, Timeout} |
-%% {stop, Reason, NewStateData}
-%%----------------------------------------------------------------------
-open_socket(init, StateData) ->
- Addr = StateData#state.server,
- Port = StateData#state.port,
- ?DEBUG("connecting to ~s:~p~n", [Addr, Port]),
- case gen_tcp:connect(Addr, Port, [binary, {packet, 0}]) of
- {ok, Socket} ->
- NewStateData = StateData#state{socket = Socket},
- if
- StateData#state.password /= "" ->
- send_text(NewStateData,
- io_lib:format("PASS ~s\r\n", [StateData#state.password]));
- true -> true
- end,
- send_text(NewStateData,
- io_lib:format("NICK ~s\r\n", [StateData#state.nick])),
- send_text(NewStateData,
- io_lib:format(
- "USER ~s ~s ~s :~s\r\n",
- [StateData#state.nick,
- StateData#state.nick,
- StateData#state.host,
- StateData#state.nick])),
- send_text(NewStateData,
- io_lib:format("CODEPAGE ~s\r\n", [StateData#state.encoding])),
- {next_state, wait_for_registration,
- NewStateData};
- {error, Reason} ->
- ?DEBUG("connect return ~p~n", [Reason]),
- Text = case Reason of
- timeout -> "Server Connect Timeout";
- _ -> "Server Connect Failed"
- end,
- bounce_messages(Text),
- {stop, normal, StateData}
- end.
-
-wait_for_registration(closed, StateData) ->
- {stop, normal, StateData}.
-
-stream_established({xmlstreamend, _Name}, StateData) ->
- {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: {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}.
-
--define(SEND(S),
- if
- StateName == stream_established ->
- send_text(StateData, S),
- StateData;
- true ->
- StateData#state{outbuf = StateData#state.outbuf ++ S}
- end).
-
-%%----------------------------------------------------------------------
-%% Func: handle_info/3
-%% Returns: {next_state, NextStateName, NextStateData} |
-%% {next_state, NextStateName, NextStateData, Timeout} |
-%% {stop, Reason, NewStateData}
-%%----------------------------------------------------------------------
-handle_info({route_chan, Channel, Resource,
- {xmlelement, "presence", Attrs, _Els}},
- StateName, StateData) ->
- NewStateData =
- case xml:get_attr_s("type", Attrs) of
- "unavailable" ->
- S1 = ?SEND(io_lib:format("PART #~s\r\n", [Channel])),
- S1#state{channels =
- dict:erase(Channel, S1#state.channels)};
- "subscribe" -> StateData;
- "subscribed" -> StateData;
- "unsubscribe" -> StateData;
- "unsubscribed" -> StateData;
- "error" -> stop;
- _ ->
- Nick = case Resource of
- "" ->
- StateData#state.nick;
- _ ->
- Resource
- end,
- S1 = if
- Nick /= StateData#state.nick ->
- S11 = ?SEND(io_lib:format("NICK ~s\r\n", [Nick])),
- % The server reply will change the copy of the
- % nick in the state (or indicate a clash).
- S11#state{nickchannel = Channel};
- true ->
- StateData
- end,
- case dict:is_key(Channel, S1#state.channels) of
- true ->
- S1;
- _ ->
- S2 = ?SEND(io_lib:format("JOIN #~s\r\n", [Channel])),
- S2#state{channels =
- dict:store(Channel, ?SETS:new(),
- S1#state.channels)}
- end
- end,
- if
- NewStateData == stop ->
- {stop, normal, StateData};
- true ->
- case dict:fetch_keys(NewStateData#state.channels) of
- [] -> {stop, normal, NewStateData};
- _ -> {next_state, StateName, NewStateData}
- end
- end;
-
-handle_info({route_chan, Channel, Resource,
- {xmlelement, "message", Attrs, _Els} = El},
- StateName, StateData) ->
- NewStateData =
- case xml:get_attr_s("type", Attrs) of
- "groupchat" ->
- case xml:get_path_s(El, [{elem, "subject"}, cdata]) of
- "" ->
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat(
- [Channel, "%", StateData#state.server]),
- StateData#state.host, StateData#state.nick),
- StateData#state.user, El),
- Body = xml:get_path_s(El, [{elem, "body"}, cdata]),
- case Body of
- "/quote " ++ Rest ->
- ?SEND(Rest ++ "\r\n");
- "/msg " ++ Rest ->
- ?SEND("PRIVMSG " ++ Rest ++ "\r\n");
- "/me " ++ Rest ->
- Strings = string:tokens(Rest, "\n"),
- Res = lists:concat(
- lists:map(
- fun(S) ->
- io_lib:format(
- "PRIVMSG #~s :\001ACTION ~s\001\r\n",
- [Channel, S])
- end, Strings)),
- ?SEND(Res);
- "/ctcp " ++ Rest ->
- Words = string:tokens(Rest, " "),
- case Words of
- [CtcpDest | _] ->
- CtcpCmd =
- toupper(
- string:substr(
- Rest,
- string:str(Rest, " ") + 1)),
- Res = io_lib:format(
- "PRIVMSG ~s :\001~s\001\r\n",
- [CtcpDest, CtcpCmd]),
- ?SEND(Res);
- _ ->
- ok
- end;
- _ ->
- Strings = string:tokens(Body, "\n"),
- Res = lists:concat(
- lists:map(
- fun(S) ->
- io_lib:format(
- "PRIVMSG #~s :~s\r\n",
- [Channel, S])
- end, Strings)),
- ?SEND(Res)
- end;
- Subject ->
- Strings = string:tokens(Subject, "\n"),
- Res = lists:concat(
- lists:map(
- fun(S) ->
- io_lib:format("TOPIC #~s :~s\r\n",
- [Channel, S])
- end, Strings)),
- ?SEND(Res)
- end;
- Type when Type == "chat"; Type == ""; Type == "normal" ->
- Body = xml:get_path_s(El, [{elem, "body"}, cdata]),
- case Body of
- "/quote " ++ Rest ->
- ?SEND(Rest ++ "\r\n");
- "/msg " ++ Rest ->
- ?SEND("PRIVMSG " ++ Rest ++ "\r\n");
- "/me " ++ Rest ->
- Strings = string:tokens(Rest, "\n"),
- Res = lists:concat(
- lists:map(
- fun(S) ->
- io_lib:format(
- "PRIVMSG ~s :\001ACTION ~s\001\r\n",
- [Resource, S])
- end, Strings)),
- ?SEND(Res);
- "/ctcp " ++ Rest ->
- Words = string:tokens(Rest, " "),
- case Words of
- [CtcpDest | _ ] ->
- CtcpCmd =
- toupper(
- string:substr(
- Rest, string:str(Rest, " ") + 1)),
- Res = io_lib:format(
- "PRIVMSG ~s :~s\r\n",
- [CtcpDest, "\001" ++ CtcpCmd ++ "\001"]),
- ?SEND(Res);
- _ ->
- ok
- end;
- _ ->
- Strings = string:tokens(Body, "\n"),
- Res = lists:concat(
- lists:map(
- fun(S) ->
- io_lib:format("PRIVMSG ~s :~s\r\n",
- [Resource, S])
- end, Strings)),
- ?SEND(Res)
- end;
- "error" ->
- stop;
- _ ->
- StateData
- end,
- if
- NewStateData == stop ->
- {stop, normal, StateData};
- true ->
- {next_state, StateName, NewStateData}
- end;
-
-
-handle_info({route_chan, Channel, Resource,
- {xmlelement, "iq", _Attrs, _Els} = El},
- StateName, StateData) ->
- From = StateData#state.user,
- To = jlib:make_jid(lists:concat([Channel, "%", StateData#state.server]),
- StateData#state.host, StateData#state.nick),
- _ = case jlib:iq_query_info(El) of
- #iq{xmlns = ?NS_MUC_ADMIN} = IQ ->
- iq_admin(StateData, Channel, From, To, IQ);
- #iq{xmlns = ?NS_VERSION} ->
- Res = io_lib:format("PRIVMSG ~s :\001VERSION\001\r\n",
- [Resource]),
- _ = ?SEND(Res),
- Err = jlib:make_error_reply(
- El, ?ERR_FEATURE_NOT_IMPLEMENTED),
- ejabberd_router:route(To, From, Err);
- #iq{xmlns = ?NS_TIME} ->
- Res = io_lib:format("PRIVMSG ~s :\001TIME\001\r\n",
- [Resource]),
- _ = ?SEND(Res),
- Err = jlib:make_error_reply(
- El, ?ERR_FEATURE_NOT_IMPLEMENTED),
- ejabberd_router:route(To, From, Err);
- #iq{xmlns = ?NS_VCARD} ->
- Res = io_lib:format("WHOIS ~s \r\n",
- [Resource]),
- _ = ?SEND(Res),
- Err = jlib:make_error_reply(
- El, ?ERR_FEATURE_NOT_IMPLEMENTED),
- ejabberd_router:route(To, From, Err);
- #iq{} ->
- Err = jlib:make_error_reply(
- El, ?ERR_FEATURE_NOT_IMPLEMENTED),
- ejabberd_router:route(To, From, Err);
- _ ->
- ok
- end,
- {next_state, StateName, StateData};
-
-handle_info({route_chan, _Channel, _Resource, _Packet}, StateName, StateData) ->
- {next_state, StateName, StateData};
-
-
-handle_info({route_nick, Nick,
- {xmlelement, "message", Attrs, _Els} = El},
- StateName, StateData) ->
- NewStateData =
- case xml:get_attr_s("type", Attrs) of
- "chat" ->
- Body = xml:get_path_s(El, [{elem, "body"}, cdata]),
- case Body of
- "/quote " ++ Rest ->
- ?SEND(Rest ++ "\r\n");
- "/msg " ++ Rest ->
- ?SEND("PRIVMSG " ++ Rest ++ "\r\n");
- "/me " ++ Rest ->
- Strings = string:tokens(Rest, "\n"),
- Res = lists:concat(
- lists:map(
- fun(S) ->
- io_lib:format(
- "PRIVMSG ~s :\001ACTION ~s\001\r\n",
- [Nick, S])
- end, Strings)),
- ?SEND(Res);
- "/ctcp " ++ Rest ->
- Words = string:tokens(Rest, " "),
- case Words of
- [CtcpDest | _ ] ->
- CtcpCmd = toupper(string:substr(Rest, string:str(Rest, " ")+1 )),
- Res = io_lib:format(
- "PRIVMSG ~s :~s\r\n",
- [CtcpDest, "\001" ++ CtcpCmd ++ "\001"]),
- ?SEND(Res);
- _ ->
- ok
- end;
- _ ->
- Strings = string:tokens(Body, "\n"),
- Res = lists:concat(
- lists:map(
- fun(S) ->
- io_lib:format("PRIVMSG ~s :~s\r\n",
- [Nick, S])
- end, Strings)),
- ?SEND(Res)
- end;
- "error" ->
- stop;
- _ ->
- StateData
- end,
- if
- NewStateData == stop ->
- {stop, normal, StateData};
- true ->
- {next_state, StateName, NewStateData}
- end;
-
-handle_info({route_nick, _Nick, _Packet}, StateName, StateData) ->
- {next_state, StateName, StateData};
-
-
-handle_info({ircstring, [$P, $I, $N, $G, $ | ID]}, StateName, StateData) ->
- send_text(StateData, "PONG " ++ ID ++ "\r\n"),
- {next_state, StateName, StateData};
-
-handle_info({ircstring, [$: | String]}, wait_for_registration, StateData) ->
- Words = string:tokens(String, " "),
- {NewState, NewStateData} =
- case Words of
- [_, "001" | _] ->
- {stream_established, StateData};
- [_, "433" | _] ->
- {error,
- {error, error_nick_in_use(StateData, String), StateData}};
- [_, [$4, _, _] | _] ->
- {error,
- {error, error_unknown_num(StateData, String, "cancel"),
- StateData}};
- [_, [$5, _, _] | _] ->
- {error,
- {error, error_unknown_num(StateData, String, "cancel"),
- StateData}};
- _ ->
- ?DEBUG("unknown irc command '~s'~n", [String]),
- {wait_for_registration, StateData}
- end,
- % Note that we don't send any data at this stage.
- if
- NewState == error ->
- {stop, normal, NewStateData};
- true ->
- {next_state, NewState, NewStateData}
- end;
-
-handle_info({ircstring, [$: | String]}, _StateName, StateData) ->
- Words = string:tokens(String, " "),
- NewStateData =
- case Words of
- [_, "353" | Items] ->
- process_channel_list(StateData, Items);
- [_, "332", _Nick, [$# | Chan] | _] ->
- process_channel_topic(StateData, Chan, String),
- StateData;
- [_, "333", _Nick, [$# | Chan] | _] ->
- process_channel_topic_who(StateData, Chan, String),
- StateData;
- [_, "318", _, Nick | _] ->
- process_endofwhois(StateData, String, Nick),
- StateData;
- [_, "311", _, Nick, Ident, Irchost | _ ] ->
- process_whois311(StateData, String, Nick, Ident, Irchost),
- StateData;
- [_, "312", _, Nick, Ircserver | _ ] ->
- process_whois312(StateData, String, Nick, Ircserver),
- StateData;
- [_, "319", _, Nick | _ ] ->
- process_whois319(StateData, String, Nick),
- StateData;
- [_, "433" | _] ->
- process_nick_in_use(StateData, String);
- % CODEPAGE isn't standard, so don't complain if it's not there.
- [_, "421", _, "CODEPAGE" | _] ->
- StateData;
- [_, [$4, _, _] | _] ->
- process_num_error(StateData, String);
- [_, [$5, _, _] | _] ->
- process_num_error(StateData, String);
- [From, "PRIVMSG", [$# | Chan] | _] ->
- process_chanprivmsg(StateData, Chan, From, String),
- StateData;
- [From, "NOTICE", [$# | Chan] | _] ->
- process_channotice(StateData, Chan, From, String),
- StateData;
- [From, "PRIVMSG", Nick, ":\001VERSION\001" | _] ->
- process_version(StateData, Nick, From),
- StateData;
- [From, "PRIVMSG", Nick, ":\001USERINFO\001" | _] ->
- process_userinfo(StateData, Nick, From),
- StateData;
- [From, "PRIVMSG", Nick | _] ->
- process_privmsg(StateData, Nick, From, String),
- StateData;
- [From, "NOTICE", Nick | _] ->
- process_notice(StateData, Nick, From, String),
- StateData;
- [From, "TOPIC", [$# | Chan] | _] ->
- process_topic(StateData, Chan, From, String),
- StateData;
- [From, "PART", [$# | Chan] | _] ->
- process_part(StateData, Chan, From, String);
- [From, "QUIT" | _] ->
- process_quit(StateData, From, String);
- [From, "JOIN", Chan | _] ->
- process_join(StateData, Chan, From, String);
- [From, "MODE", [$# | Chan], "+o", Nick | _] ->
- process_mode_o(StateData, Chan, From, Nick,
- "admin", "moderator"),
- StateData;
- [From, "MODE", [$# | Chan], "-o", Nick | _] ->
- process_mode_o(StateData, Chan, From, Nick,
- "member", "participant"),
- StateData;
- [From, "KICK", [$# | Chan], Nick | _] ->
- process_kick(StateData, Chan, From, Nick, String),
- StateData;
- [From, "NICK", Nick | _] ->
- process_nick(StateData, From, Nick);
- _ ->
- ?DEBUG("unknown irc command '~s'~n", [String]),
- StateData
- end,
- NewStateData1 =
- case StateData#state.outbuf of
- "" ->
- NewStateData;
- Data ->
- send_text(NewStateData, Data),
- NewStateData#state{outbuf = ""}
- end,
- {next_state, stream_established, NewStateData1};
-
-handle_info({ircstring, [$E, $R, $R, $O, $R | _] = String},
- StateName, StateData) ->
- process_error(StateData, String),
- {next_state, StateName, StateData};
-
-
-handle_info({ircstring, String}, StateName, StateData) ->
- ?DEBUG("unknown irc command '~s'~n", [String]),
- {next_state, StateName, StateData};
-
-
-handle_info({send_text, Text}, StateName, StateData) ->
- send_text(StateData, Text),
- {next_state, StateName, StateData};
-handle_info({tcp, _Socket, Data}, StateName, StateData) ->
- Buf = StateData#state.inbuf ++ binary_to_list(Data),
- {ok, Strings} = regexp:split([C || C <- Buf, C /= $\r], "\n"),
- ?DEBUG("strings=~p~n", [Strings]),
- NewBuf = process_lines(StateData#state.encoding, Strings),
- {next_state, StateName, StateData#state{inbuf = NewBuf}};
-handle_info({tcp_closed, _Socket}, StateName, StateData) ->
- gen_fsm:send_event(self(), closed),
- {next_state, StateName, StateData};
-handle_info({tcp_error, _Socket, _Reason}, StateName, StateData) ->
- gen_fsm:send_event(self(), closed),
- {next_state, StateName, StateData}.
-
-%%----------------------------------------------------------------------
-%% Func: terminate/3
-%% Purpose: Shutdown the fsm
-%% Returns: any
-%%----------------------------------------------------------------------
-terminate(_Reason, _StateName, FullStateData) ->
- % Extract error message if there was one.
- {Error, StateData} = case FullStateData of
- {error, SError, SStateData} ->
- {SError, SStateData};
- _ ->
- {{xmlelement, "error", [{"code", "502"}],
- [{xmlcdata, "Server Connect Failed"}]},
- FullStateData}
- end,
- mod_irc:closed_connection(StateData#state.host,
- StateData#state.user,
- StateData#state.server),
- bounce_messages("Server Connect Failed"),
- lists:foreach(
- fun(Chan) ->
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, StateData#state.nick),
- StateData#state.user,
- {xmlelement, "presence", [{"type", "error"}],
- [Error]})
- end, dict:fetch_keys(StateData#state.channels)),
- case StateData#state.socket of
- undefined ->
- ok;
- Socket ->
- gen_tcp:close(Socket)
- end,
- ok.
-
-%%%----------------------------------------------------------------------
-%%% Internal functions
-%%%----------------------------------------------------------------------
-
-send_text(#state{socket = Socket, encoding = Encoding}, Text) ->
- CText = iconv:convert("utf-8", Encoding, lists:flatten(Text)),
- %?DEBUG("IRC OUTu: ~s~nIRC OUTk: ~s~n", [Text, CText]),
- gen_tcp:send(Socket, CText).
-
-
-%send_queue(Socket, Q) ->
-% case queue:out(Q) of
-% {{value, El}, Q1} ->
-% send_element(Socket, El),
-% send_queue(Socket, Q1);
-% {empty, Q1} ->
-% ok
-% end.
-
-bounce_messages(Reason) ->
- receive
- {send_element, El} ->
- {xmlelement, _Name, Attrs, _SubTags} = El,
- case xml:get_attr_s("type", Attrs) of
- "error" ->
- ok;
- _ ->
- Err = jlib:make_error_reply(El,
- "502", Reason),
- From = jlib:string_to_jid(xml:get_attr_s("from", Attrs)),
- To = jlib:string_to_jid(xml:get_attr_s("to", Attrs)),
- ejabberd_router:route(To, From, Err)
- end,
- bounce_messages(Reason)
- after 0 ->
- ok
- end.
-
-
-route_chan(Pid, Channel, Resource, Packet) ->
- Pid ! {route_chan, Channel, Resource, Packet}.
-
-route_nick(Pid, Nick, Packet) ->
- Pid ! {route_nick, Nick, Packet}.
-
-
-process_lines(_Encoding, [S]) ->
- S;
-process_lines(Encoding, [S | Ss]) ->
- self() ! {ircstring, iconv:convert(Encoding, "utf-8", S)},
- process_lines(Encoding, Ss).
-
-process_channel_list(StateData, Items) ->
- process_channel_list_find_chan(StateData, Items).
-
-process_channel_list_find_chan(StateData, []) ->
- StateData;
-process_channel_list_find_chan(StateData, [[$# | Chan] | Items]) ->
- process_channel_list_users(StateData, Chan, Items);
-process_channel_list_find_chan(StateData, [_ | Items]) ->
- process_channel_list_find_chan(StateData, Items).
-
-process_channel_list_users(StateData, _Chan, []) ->
- StateData;
-process_channel_list_users(StateData, Chan, [User | Items]) ->
- NewStateData = process_channel_list_user(StateData, Chan, User),
- process_channel_list_users(NewStateData, Chan, Items).
-
-process_channel_list_user(StateData, Chan, User) ->
- User1 = case User of
- [$: | U1] -> U1;
- _ -> User
- end,
- {User2, Affiliation, Role} =
- case User1 of
- [$@ | U2] -> {U2, "admin", "moderator"};
- [$+ | U2] -> {U2, "member", "participant"};
- [$\% | U2] -> {U2, "admin", "moderator"};
- [$& | U2] -> {U2, "admin", "moderator"};
- [$~ | U2] -> {U2, "admin", "moderator"};
- _ -> {User1, "member", "participant"}
- end,
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, User2),
- StateData#state.user,
- {xmlelement, "presence", [],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", Affiliation},
- {"role", Role}],
- []}]}]}),
- case catch dict:update(Chan,
- fun(Ps) ->
- ?SETS:add_element(User2, Ps)
- end, StateData#state.channels) of
- {'EXIT', _} ->
- StateData;
- NS ->
- StateData#state{channels = NS}
- end.
-
-
-process_channel_topic(StateData, Chan, String) ->
- {ok, Msg, _} = regexp:sub(String, ".*332[^:]*:", ""),
- Msg1 = filter_message(Msg),
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "subject", [], [{xmlcdata, Msg1}]},
- {xmlelement, "body", [], [{xmlcdata, "Topic for #" ++ Chan ++ ": " ++ Msg1}]}
- ]}).
-
-process_channel_topic_who(StateData, Chan, String) ->
- Words = string:tokens(String, " "),
- Msg1 = case Words of
- [_, "333", _, _Chan, Whoset , Timeset] ->
- case string:to_integer(Timeset) of
- {Unixtimeset, _Rest} ->
- "Topic for #" ++ Chan ++ " set by " ++ Whoset ++
- " at " ++ unixtime2string(Unixtimeset);
- _->
- "Topic for #" ++ Chan ++ " set by " ++ Whoset
- end;
- [_, "333", _, _Chan, Whoset | _] ->
- "Topic for #" ++ Chan ++ " set by " ++ Whoset;
- _ ->
- String
- end,
- Msg2 = filter_message(Msg1),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}).
-
-
-error_nick_in_use(_StateData, String) ->
- {ok, Msg, _} = regexp:sub(String, ".*433 +[^ ]* +", ""),
- Msg1 = filter_message(Msg),
- {xmlelement, "error", [{"code", "409"}, {"type", "cancel"}],
- [{xmlelement, "conflict", [{"xmlns", ?NS_STANZAS}], []},
- {xmlelement, "text", [{"xmlns", ?NS_STANZAS}],
- [{xmlcdata, Msg1}]}]}.
-
-process_nick_in_use(StateData, String) ->
- % We can't use the jlib macro because we don't know the language of the
- % message.
- Error = error_nick_in_use(StateData, String),
- case StateData#state.nickchannel of
- undefined ->
- % Shouldn't happen with a well behaved server
- StateData;
- Chan ->
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, StateData#state.nick),
- StateData#state.user,
- {xmlelement, "presence", [{"type", "error"}], [Error]}),
- StateData#state{nickchannel = undefined}
- end.
-
-process_num_error(StateData, String) ->
- Error = error_unknown_num(StateData, String, "continue"),
- lists:foreach(
- fun(Chan) ->
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, StateData#state.nick),
- StateData#state.user,
- {xmlelement, "message", [{"type", "error"}],
- [Error]})
- end, dict:fetch_keys(StateData#state.channels)),
- StateData.
-
-process_endofwhois(StateData, _String, Nick) ->
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Nick, "!", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "chat"}],
- [{xmlelement, "body", [], [{xmlcdata, "End of WHOIS"}]}]}).
-
-process_whois311(StateData, String, Nick, Ident, Irchost) ->
- {ok, Fullname, _} = regexp:sub(String, ".*311[^:]*:", ""),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Nick, "!", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "chat"}],
- [{xmlelement, "body", [],
- [{xmlcdata, lists:concat(
- ["WHOIS: ", Nick, " is ",
- Ident, "@" , Irchost, " : " , Fullname])}]}]}).
-
-process_whois312(StateData, String, Nick, Ircserver) ->
- {ok, Ircserverdesc, _} = regexp:sub(String, ".*312[^:]*:", ""),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Nick, "!", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "chat"}],
- [{xmlelement, "body", [],
- [{xmlcdata, lists:concat(["WHOIS: ", Nick, " use ",
- Ircserver, " : ", Ircserverdesc])}]}]}).
-
-process_whois319(StateData, String, Nick) ->
- {ok, Chanlist, _} = regexp:sub(String, ".*319[^:]*:", ""),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Nick, "!", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "chat"}],
- [{xmlelement, "body", [],
- [{xmlcdata, lists:concat(["WHOIS: ", Nick, " is on ",
- Chanlist])}]}]}).
-
-
-
-process_chanprivmsg(StateData, Chan, From, String) ->
- [FromUser | _] = string:tokens(From, "!"),
- {ok, Msg, _} = regexp:sub(String, ".*PRIVMSG[^:]*:", ""),
- Msg1 = case Msg of
- [1, $A, $C, $T, $I, $O, $N, $ | Rest] ->
- "/me " ++ Rest;
- _ ->
- Msg
- end,
- Msg2 = filter_message(Msg1),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, FromUser),
- StateData#state.user,
- {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}).
-
-
-
-process_channotice(StateData, Chan, From, String) ->
- [FromUser | _] = string:tokens(From, "!"),
- {ok, Msg, _} = regexp:sub(String, ".*NOTICE[^:]*:", ""),
- Msg1 = case Msg of
- [1, $A, $C, $T, $I, $O, $N, $ | Rest] ->
- "/me " ++ Rest;
- _ ->
- "/me NOTICE: " ++ Msg
- end,
- Msg2 = filter_message(Msg1),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, FromUser),
- StateData#state.user,
- {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}).
-
-
-
-
-process_privmsg(StateData, _Nick, From, String) ->
- [FromUser | _] = string:tokens(From, "!"),
- {ok, Msg, _} = regexp:sub(String, ".*PRIVMSG[^:]*:", ""),
- Msg1 = case Msg of
- [1, $A, $C, $T, $I, $O, $N, $ | Rest] ->
- "/me " ++ Rest;
- _ ->
- Msg
- end,
- Msg2 = filter_message(Msg1),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([FromUser, "!", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "chat"}],
- [{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}).
-
-
-process_notice(StateData, _Nick, From, String) ->
- [FromUser | _] = string:tokens(From, "!"),
- {ok, Msg, _} = regexp:sub(String, ".*NOTICE[^:]*:", ""),
- Msg1 = case Msg of
- [1, $A, $C, $T, $I, $O, $N, $ | Rest] ->
- "/me " ++ Rest;
- _ ->
- "/me NOTICE: " ++ Msg
- end,
- Msg2 = filter_message(Msg1),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([FromUser, "!", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "chat"}],
- [{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}).
-
-
-process_version(StateData, _Nick, From) ->
- [FromUser | _] = string:tokens(From, "!"),
- send_text(
- StateData,
- io_lib:format("NOTICE ~s :\001VERSION "
- "ejabberd IRC transport ~s (c) Alexey Shchepin"
- "\001\r\n",
- [FromUser, ?VERSION]) ++
- io_lib:format("NOTICE ~s :\001VERSION "
- "http://ejabberd.jabberstudio.org/"
- "\001\r\n",
- [FromUser])).
-
-
-process_userinfo(StateData, _Nick, From) ->
- [FromUser | _] = string:tokens(From, "!"),
- send_text(
- StateData,
- io_lib:format("NOTICE ~s :\001USERINFO "
- "xmpp:~s"
- "\001\r\n",
- [FromUser,
- jlib:jid_to_string(StateData#state.user)])).
-
-
-process_topic(StateData, Chan, From, String) ->
- [FromUser | _] = string:tokens(From, "!"),
- {ok, Msg, _} = regexp:sub(String, ".*TOPIC[^:]*:", ""),
- Msg1 = filter_message(Msg),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, FromUser),
- StateData#state.user,
- {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "subject", [], [{xmlcdata, Msg1}]},
- {xmlelement, "body", [],
- [{xmlcdata, "/me has changed the subject to: " ++
- Msg1}]}]}).
-
-process_part(StateData, Chan, From, String) ->
- [FromUser | FromIdent] = string:tokens(From, "!"),
- {ok, Msg, _} = regexp:sub(String, ".*PART[^:]*:", ""),
- Msg1 = filter_message(Msg),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, FromUser),
- StateData#state.user,
- {xmlelement, "presence", [{"type", "unavailable"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", "member"},
- {"role", "none"}],
- []}]},
- {xmlelement, "status", [],
- [{xmlcdata, Msg1 ++ " (" ++ FromIdent ++ ")"}]}]
- }),
- case catch dict:update(Chan,
- fun(Ps) ->
- remove_element(FromUser, Ps)
- end, StateData#state.channels) of
- {'EXIT', _} ->
- StateData;
- NS ->
- StateData#state{channels = NS}
- end.
-
-
-process_quit(StateData, From, String) ->
- [FromUser | FromIdent] = string:tokens(From, "!"),
-
- {ok, Msg, _} = regexp:sub(String, ".*QUIT[^:]*:", ""),
- Msg1 = filter_message(Msg),
- %%NewChans =
- dict:map(
- fun(Chan, Ps) ->
- case ?SETS:is_member(FromUser, Ps) of
- true ->
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, FromUser),
- StateData#state.user,
- {xmlelement, "presence", [{"type", "unavailable"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", "member"},
- {"role", "none"}],
- []}]},
- {xmlelement, "status", [],
- [{xmlcdata, Msg1 ++ " (" ++ FromIdent ++ ")"}]}
- ]}),
- remove_element(FromUser, Ps);
- _ ->
- Ps
- end
- end, StateData#state.channels),
- StateData.
-
-
-process_join(StateData, Channel, From, _String) ->
- [FromUser | FromIdent] = string:tokens(From, "!"),
- Chan = lists:subtract(Channel, ":#"),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, FromUser),
- StateData#state.user,
- {xmlelement, "presence", [],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", "member"},
- {"role", "participant"}],
- []}]},
- {xmlelement, "status", [],
- [{xmlcdata, FromIdent}]}]}),
-
- case catch dict:update(Chan,
- fun(Ps) ->
- ?SETS:add_element(FromUser, Ps)
- end, StateData#state.channels) of
- {'EXIT', _} ->
- StateData;
- NS ->
- StateData#state{channels = NS}
- end.
-
-
-
-process_mode_o(StateData, Chan, _From, Nick, Affiliation, Role) ->
- %Msg = lists:last(string:tokens(String, ":")),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, Nick),
- StateData#state.user,
- {xmlelement, "presence", [],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", Affiliation},
- {"role", Role}],
- []}]}]}).
-
-process_kick(StateData, Chan, From, Nick, String) ->
- Msg = lists:last(string:tokens(String, ":")),
- Msg2 = Nick ++ " kicked by " ++ From ++ " (" ++ filter_message(Msg) ++ ")",
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, ""),
- StateData#state.user,
- {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}),
- ejabberd_router:route(
- jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, Nick),
- StateData#state.user,
- {xmlelement, "presence", [{"type", "unavailable"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", "none"},
- {"role", "none"}],
- []},
- {xmlelement, "status", [{"code", "307"}], []}
- ]}]}).
-
-process_nick(StateData, From, NewNick) ->
- [FromUser | _] = string:tokens(From, "!"),
- Nick = lists:subtract(NewNick, ":"),
- NewChans =
- dict:map(
- fun(Chan, Ps) ->
- case ?SETS:is_member(FromUser, Ps) of
- true ->
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, FromUser),
- StateData#state.user,
- {xmlelement, "presence", [{"type", "unavailable"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", "member"},
- {"role", "participant"},
- {"nick", Nick}],
- []},
- {xmlelement, "status", [{"code", "303"}], []}
- ]}]}),
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, Nick),
- StateData#state.user,
- {xmlelement, "presence", [],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item",
- [{"affiliation", "member"},
- {"role", "participant"}],
- []}
- ]}]}),
- ?SETS:add_element(Nick,
- remove_element(FromUser, Ps));
- _ ->
- Ps
- end
- end, StateData#state.channels),
- if
- FromUser == StateData#state.nick ->
- StateData#state{nick = Nick,
- nickchannel = undefined,
- channels = NewChans};
- true ->
- StateData#state{channels = NewChans}
- end.
-
-
-process_error(StateData, String) ->
- lists:foreach(
- fun(Chan) ->
- ejabberd_router:route(
- jlib:make_jid(
- lists:concat([Chan, "%", StateData#state.server]),
- StateData#state.host, StateData#state.nick),
- StateData#state.user,
- {xmlelement, "presence", [{"type", "error"}],
- [{xmlelement, "error", [{"code", "502"}],
- [{xmlcdata, String}]}]})
- end, dict:fetch_keys(StateData#state.channels)).
-
-error_unknown_num(_StateData, String, Type) ->
- {ok, Msg, _} = regexp:sub(String, ".*[45][0-9][0-9] +[^ ]* +", ""),
- Msg1 = filter_message(Msg),
- {xmlelement, "error", [{"code", "500"}, {"type", Type}],
- [{xmlelement, "undefined-condition", [{"xmlns", ?NS_STANZAS}], []},
- {xmlelement, "text", [{"xmlns", ?NS_STANZAS}],
- [{xmlcdata, Msg1}]}]}.
-
-
-
-remove_element(E, Set) ->
- case ?SETS:is_element(E, Set) of
- true ->
- ?SETS:del_element(E, Set);
- _ ->
- Set
- end.
-
-
-
-iq_admin(StateData, Channel, From, To,
- #iq{type = Type, xmlns = XMLNS, sub_el = SubEl} = IQ) ->
- case catch process_iq_admin(StateData, Channel, Type, SubEl) of
- {'EXIT', Reason} ->
- ?ERROR_MSG("~p", [Reason]);
- Res ->
- if
- Res /= ignore ->
- ResIQ = case Res of
- {result, ResEls} ->
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- ResEls
- }]};
- {error, Error} ->
- IQ#iq{type = error,
- sub_el = [SubEl, Error]}
- end,
- ejabberd_router:route(To, From,
- jlib:iq_to_xml(ResIQ));
- true ->
- ok
- end
- end.
-
-
-process_iq_admin(StateData, Channel, set, SubEl) ->
- case xml:get_subtag(SubEl, "item") of
- false ->
- {error, ?ERR_BAD_REQUEST};
- ItemEl ->
- Nick = xml:get_tag_attr_s("nick", ItemEl),
- Affiliation = xml:get_tag_attr_s("affiliation", ItemEl),
- Role = xml:get_tag_attr_s("role", ItemEl),
- Reason = xml:get_path_s(ItemEl, [{elem, "reason"}, cdata]),
- process_admin(StateData, Channel, Nick, Affiliation, Role, Reason)
- end;
-process_iq_admin(_StateData, _Channel, get, _SubEl) ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}.
-
-
-
-process_admin(_StateData, _Channel, "", _Affiliation, _Role, _Reason) ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED};
-
-process_admin(StateData, Channel, Nick, _Affiliation, "none", Reason) ->
- case Reason of
- "" ->
- send_text(StateData,
- io_lib:format("KICK #~s ~s\r\n",
- [Channel, Nick]));
- _ ->
- send_text(StateData,
- io_lib:format("KICK #~s ~s :~s\r\n",
- [Channel, Nick, Reason]))
- end,
- {result, []};
-
-
-
-process_admin(_StateData, _Channel, _Nick, _Affiliation, _Role, _Reason) ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}.
-
-
-
-filter_message(Msg) ->
- lists:filter(
- fun(C) ->
- if (C < 32) and
- (C /= 9) and
- (C /= 10) and
- (C /= 13) ->
- false;
- true -> true
- end
- end, filter_mirc_colors(Msg)).
-
-filter_mirc_colors(Msg) ->
- case regexp:gsub(Msg, "(\\003[0-9]+)(,[0-9]+)?", "") of
- {ok, Msg2, _} ->
- Msg2;
- _ ->
- Msg
- end.
-
-unixtime2string(Unixtime) ->
- Secs = Unixtime + calendar:datetime_to_gregorian_seconds(
- {{1970, 1, 1}, {0,0,0}}),
- case calendar:universal_time_to_local_time(
- calendar:gregorian_seconds_to_datetime(Secs)) of
- {{Year, Month, Day}, {Hour, Minute, Second}} ->
- lists:flatten(
- io_lib:format("~4..0w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w",
- [Year, Month, Day, Hour, Minute, Second]));
- _->
- "0000-00-00 00:00:00"
- end.
-
-toupper([C | Cs]) ->
- if
- C >= $a, C =< $z ->
- [C - 32 | toupper(Cs)];
- true ->
- [C | toupper(Cs)]
- end;
-toupper([]) ->
- [].
diff --git a/src/mod_last.erl b/src/mod_last.erl
index 5e621726f..02615e704 100644
--- a/src/mod_last.erl
+++ b/src/mod_last.erl
@@ -38,52 +38,50 @@
get_last_info/2,
remove_user/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_privacy.hrl").
-record(last_activity, {us, timestamp, status}).
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
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,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_LAST_ACTIVITY,
?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_LAST,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_LAST_ACTIVITY,
?MODULE, process_sm_iq, IQDisc),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(unset_presence_hook, Host,
+ ejabberd_hooks:add(unset_presence_hook, HostB,
?MODULE, on_presence_update, 50).
stop(Host) ->
- ejabberd_hooks:delete(remove_user, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(unset_presence_hook, Host,
+ ejabberd_hooks:delete(unset_presence_hook, HostB,
?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).
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_LAST_ACTIVITY),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_LAST_ACTIVITY).
%%%
%%% 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.
+process_local_iq(_From, _To, #iq{type = get} = IQ_Rec) ->
+ Sec = get_node_uptime(),
+ Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query', attrs =
+ [?XMLATTR('seconds', Sec)]},
+ exmpp_iq:result(IQ_Rec, Response);
+process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
%% @spec () -> integer()
%% @doc Get the uptime of the ejabberd node, expressed in seconds.
@@ -104,57 +102,49 @@ now_to_seconds({MegaSecs, Secs, _MicroSecs}) ->
%%% 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) ->
- 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,
- {From, To,
- {xmlelement, "presence", [], []}},
- out]) of
- allow ->
- get_last(IQ, SubEl, User, Server);
- deny ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
- end;
- true ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
- end
- end.
+process_sm_iq(From, To, #iq{type = get} = IQ_Rec) ->
+ {Subscription, _Groups} =
+ ejabberd_hooks:run_fold(
+ roster_get_jid_info, exmpp_jid:prep_domain(To),
+ {none, []}, [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), From]),
+ if
+ (Subscription == both) or (Subscription == from) ->
+ UserListRecord = ejabberd_hooks:run_fold(
+ privacy_get_user_list, exmpp_jid:prep_domain(To),
+ #userlist{},
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To)]),
+ case ejabberd_hooks:run_fold(
+ privacy_check_packet, exmpp_jid:prep_domain(To),
+ allow,
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), UserListRecord,
+ {From, To,
+ exmpp_presence:available()},
+ out]) of
+ allow ->
+ get_last(IQ_Rec, exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To));
+ deny ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed')
+ end;
+ true ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed')
+ end;
+process_sm_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
%% TODO: This function could use get_last_info/2
-get_last(IQ, SubEl, LUser, LServer) ->
+get_last(IQ_Rec, LUser, LServer) ->
case catch mnesia:dirty_read(last_activity, {LUser, LServer}) of
{'EXIT', _Reason} ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]};
+ exmpp_iq:error(IQ_Rec, 'internal-server-error');
[] ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_SERVICE_UNAVAILABLE]};
+ exmpp_iq:error(IQ_Rec, 'service-unavailable');
[#last_activity{timestamp = TimeStamp, status = 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}]}]}
+ Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query',
+ attrs = [?XMLATTR('seconds', Sec)],
+ children = [#xmlcdata{cdata = Status}]},
+ exmpp_iq:result(IQ_Rec, Response)
end.
@@ -163,20 +153,24 @@ 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).
+store_last_info(User, Server, TimeStamp, Status)
+ when is_binary(User), is_binary(Server) ->
+ try
+ US = {User, Server},
+ F = fun() ->
+ mnesia:write(#last_activity{us = US,
+ timestamp = TimeStamp,
+ status = Status})
+ end,
+ mnesia:transaction(F)
+ catch
+ _ ->
+ ok
+ end.
%% @spec (LUser::string(), LServer::string()) ->
%% {ok, Timestamp::integer(), Status::string()} | not_found
-get_last_info(LUser, LServer) ->
+get_last_info(LUser, LServer) when is_binary(LUser), is_binary(LServer) ->
case catch mnesia:dirty_read(last_activity, {LUser, LServer}) of
{'EXIT', _Reason} ->
not_found;
@@ -186,21 +180,26 @@ get_last_info(LUser, LServer) ->
{ok, TimeStamp, Status}
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).
+remove_user(User, Server) when is_binary(User), is_binary(Server) ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ F = fun() ->
+ mnesia:delete({last_activity, US})
+ end,
+ mnesia:transaction(F)
+ catch
+ _ ->
+ ok
+ end.
update_table() ->
Fields = record_info(fields, last_activity),
case mnesia:table_info(last_activity, attributes) of
Fields ->
- ok;
+ convert_to_exmpp();
[user, timestamp, status] ->
?INFO_MSG("Converting last_activity table from {user, timestamp, status} format", []),
Host = ?MYNAME,
@@ -209,11 +208,12 @@ update_table() ->
mnesia:write_lock_table(last_activity),
mnesia:foldl(
fun({_, U, T, S} = R, _) ->
+ U1 = convert_jid_to_exmpp(U),
mnesia:delete_object(R),
mnesia:write(
- #last_activity{us = {U, Host},
+ #last_activity{us = {U1, Host},
timestamp = T,
- status = S})
+ status = list_to_binary(S)})
end, ok, last_activity)
end,
mnesia:transaction(F);
@@ -225,7 +225,7 @@ update_table() ->
fun({_, U, T}) ->
#last_activity{us = U,
timestamp = T,
- status = ""}
+ status = <<>>}
end, Fields),
F = fun() ->
mnesia:write_lock_table(last_activity),
@@ -244,3 +244,37 @@ update_table() ->
mnesia:transform_table(last_activity, ignore, Fields)
end.
+convert_to_exmpp() ->
+ Fun = fun() ->
+ case mnesia:first(last_activity) of
+ '$end_of_table' ->
+ none;
+ Key ->
+ case mnesia:read({last_activity, Key}) of
+ [#last_activity{status = Status}] when is_binary(Status) ->
+ none;
+ [#last_activity{}] ->
+ mnesia:foldl(fun convert_to_exmpp2/2,
+ done, last_activity, write)
+ end
+ end
+ end,
+ mnesia:transaction(Fun).
+
+convert_to_exmpp2(#last_activity{us = {U, S} = Key, status = Status} = LA,
+ Acc) ->
+ % Remove old entry.
+ mnesia:delete({last_activity, Key}),
+ % Convert "" to undefined in JIDs.
+ U1 = convert_jid_to_exmpp(U),
+ % Convert status.
+ Status1 = list_to_binary(Status),
+ % Prepare the new record.
+ New_LA = LA#last_activity{us = {list_to_binary(U1), list_to_binary(S)},
+ status = Status1},
+ % Write the new record.
+ mnesia:write(New_LA),
+ Acc.
+
+convert_jid_to_exmpp("") -> undefined;
+convert_jid_to_exmpp(V) -> V.
diff --git a/src/mod_last_odbc.erl b/src/mod_last_odbc.erl
index 704af488f..7bc552d8b 100644
--- a/src/mod_last_odbc.erl
+++ b/src/mod_last_odbc.erl
@@ -38,45 +38,43 @@
get_last_info/2,
remove_user/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_privacy.hrl").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_LAST,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_LAST_ACTIVITY,
?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_LAST,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_LAST_ACTIVITY,
?MODULE, process_sm_iq, IQDisc),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(unset_presence_hook, Host,
+ ejabberd_hooks:add(unset_presence_hook, HostB,
?MODULE, on_presence_update, 50).
stop(Host) ->
- ejabberd_hooks:delete(remove_user, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(unset_presence_hook, Host,
+ ejabberd_hooks:delete(unset_presence_hook, HostB,
?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).
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_LAST_ACTIVITY),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_LAST_ACTIVITY).
%%%
%%% 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.
+process_local_iq(_From, _To, #iq{type = get} = IQ_Rec) ->
+ Sec = get_node_uptime(),
+ Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query', attrs =
+ [?XMLATTR('seconds', Sec)]},
+ exmpp_iq:result(IQ_Rec, Response);
+process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
%% @spec () -> integer()
%% @doc Get the uptime of the ejabberd node, expressed in seconds.
@@ -96,77 +94,79 @@ now_to_seconds({MegaSecs, Secs, _MicroSecs}) ->
%%%
%%% 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) ->
- 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,
- {From, To,
- {xmlelement, "presence", [], []}},
- out]) of
- allow ->
- get_last(IQ, SubEl, User, Server);
- deny ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
- end;
- true ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
- end
- end.
+process_sm_iq(From, To, #iq{type = get} = IQ_Rec) ->
+ User = exmpp_jid:prep_node_as_list(To),
+ Server = exmpp_jid:prep_domain_as_list(To),
+ {Subscription, _Groups} =
+ ejabberd_hooks:run_fold(
+ roster_get_jid_info, exmpp_jid:prep_domain(To),
+ {none, []}, [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), From]),
+ if
+ (Subscription == both) or (Subscription == from) ->
+ UserListRecord = ejabberd_hooks:run_fold(
+ privacy_get_user_list, exmpp_jid:prep_domain(To),
+ #userlist{},
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To)]),
+ case ejabberd_hooks:run_fold(
+ privacy_check_packet, exmpp_jid:prep_domain(To),
+ allow,
+ [exmpp_jid:prep_node(To), exmpp_jid:prep_domain(To), UserListRecord,
+ {From, To,
+ exmpp_presence:available()},
+ out]) of
+ allow ->
+ get_last(IQ_Rec, User, Server);
+ deny ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed')
+ end;
+ true ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed')
+ end;
+process_sm_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
%% TODO: This function could use get_last_info/2
-get_last(IQ, SubEl, LUser, LServer) ->
+get_last(IQ_Rec, LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
case catch odbc_queries:get_last(LServer, Username) of
{selected, ["seconds","state"], []} ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_SERVICE_UNAVAILABLE]};
+ exmpp_iq:error(IQ_Rec, 'service-unavailable');
{selected, ["seconds","state"], [{STimeStamp, Status}]} ->
case catch list_to_integer(STimeStamp) of
TimeStamp when is_integer(TimeStamp) ->
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}]}]};
+ Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query',
+ attrs = [?XMLATTR('seconds', Sec)],
+ children = [#xmlcdata{cdata = list_to_binary(Status)}]},
+ exmpp_iq:result(IQ_Rec, Response);
_ ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
+ exmpp_iq:error(IQ_Rec, 'internal-server-error')
end;
_ ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
+ exmpp_iq:error(IQ_Rec, 'internal-server-error')
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),
- Username = ejabberd_odbc:escape(LUser),
- Seconds = ejabberd_odbc:escape(integer_to_list(TimeStamp)),
- State = ejabberd_odbc:escape(Status),
- odbc_queries:set_last_t(LServer, Username, Seconds, State).
+store_last_info(User, Server, TimeStamp, Status)
+ when is_binary(User), is_binary(Server) ->
+ try
+ %LUser = exmpp_stringprep:nodeprep(User),
+ %LServer = exmpp_stringprep:nameprep(Server),
+ LUser = binary_to_list(User),
+ LServer = binary_to_list(Server),
+
+ Username = ejabberd_odbc:escape(LUser),
+ Seconds = ejabberd_odbc:escape(integer_to_list(TimeStamp)),
+ State = ejabberd_odbc:escape(Status),
+ odbc_queries:set_last_t(LServer, Username, Seconds, State)
+ catch
+ _ ->
+ ok
+ end.
%% @spec (LUser::string(), LServer::string()) ->
%% {ok, Timestamp::integer(), Status::string()} | not_found
@@ -187,7 +187,12 @@ get_last_info(LUser, LServer) ->
end.
remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- Username = ejabberd_odbc:escape(LUser),
- odbc_queries:del_last(LServer, Username).
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ Username = ejabberd_odbc:escape(LUser),
+ odbc_queries:del_last(LServer, Username)
+ catch
+ _ ->
+ ok
+ end.
diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl
index c0e2168ae..6215aff10 100644
--- a/src/mod_muc/mod_muc.erl
+++ b/src/mod_muc/mod_muc.erl
@@ -46,6 +46,8 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-include("jlib.hrl").
@@ -98,7 +100,8 @@ stop(Host) ->
%% C) mod_muc:stop was called, and each room is being terminated
%% In this case, the mod_muc process died before the room processes
%% So the message sending must be catched
-room_destroyed(Host, Room, Pid, ServerHost) ->
+room_destroyed(Host, Room, Pid, ServerHost) when is_binary(Host),
+ is_binary(Room) ->
catch gen_mod:get_module_proc(ServerHost, ?PROCNAME) !
{room_destroyed, {Room, Host}, Pid},
ok.
@@ -110,14 +113,14 @@ create_room(Host, Name, From, Nick, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:call(Proc, {create, Name, From, Nick, Opts}).
-store_room(Host, Name, Opts) ->
+store_room(Host, Name, Opts) when is_binary(Host), is_binary(Name) ->
F = fun() ->
mnesia:write(#muc_room{name_host = {Name, Host},
opts = Opts})
end,
mnesia:transaction(F).
-restore_room(Host, Name) ->
+restore_room(Host, Name) when is_binary(Host), is_binary(Name) ->
case catch mnesia:dirty_read(muc_room, {Name, Host}) of
[#muc_room{opts = Opts}] ->
Opts;
@@ -125,27 +128,25 @@ restore_room(Host, Name) ->
error
end.
-forget_room(Host, Name) ->
+forget_room(Host, Name) when is_binary(Host), is_binary(Name) ->
F = fun() ->
mnesia:delete({muc_room, {Name, Host}})
end,
mnesia:transaction(F).
-process_iq_disco_items(Host, From, To, #iq{lang = Lang} = IQ) ->
+process_iq_disco_items(Host, From, To, #iq{lang = Lang} = IQ) when is_binary(Host) ->
Rsm = jlib:rsm_decode(IQ),
- Res = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", ?NS_DISCO_ITEMS}],
- iq_disco_items(Host, From, Lang, Rsm)}]},
+ Res = exmpp_iq:result(IQ, #xmlel{ns = ?NS_DISCO_ITEMS,
+ name = 'query',
+ children = iq_disco_items(Host, From, Lang, Rsm)}),
ejabberd_router:route(To,
From,
- jlib:iq_to_xml(Res)).
+ exmpp_iq:iq_to_xmlel(Res)).
-can_use_nick(_Host, _JID, "") ->
+can_use_nick(_Host, _JID, <<>>) ->
false;
-can_use_nick(Host, JID, Nick) ->
- {LUser, LServer, _} = jlib:jid_tolower(JID),
- LUS = {LUser, LServer},
+can_use_nick(Host, JID, Nick) when is_binary(Host), is_binary(Nick) ->
+ LUS = {exmpp_jid:prep_node(JID), exmpp_jid:prep_domain(JID)},
case catch mnesia:dirty_select(
muc_registered,
[{#muc_registered{us_host = '$1',
@@ -184,7 +185,8 @@ init([Host, Opts]) ->
{attributes, record_info(fields, muc_online_room)}]),
mnesia:add_table_copy(muc_online_room, node(), ram_copies),
catch ets:new(muc_online_users, [bag, named_table, public, {keypos, 2}]),
- MyHost = gen_mod:get_opt_host(Host, Opts, "conference.@HOST@"),
+ MyHost_L = gen_mod:get_opt_host(Host, Opts, "conference.@HOST@"),
+ MyHost = list_to_binary(MyHost_L),
update_tables(MyHost),
clean_table_from_bad_node(node(), MyHost),
mnesia:add_table_index(muc_registered, nick),
@@ -196,7 +198,7 @@ init([Host, Opts]) ->
HistorySize = gen_mod:get_opt(history_size, Opts, 20),
DefRoomOpts = gen_mod:get_opt(default_room_options, Opts, []),
RoomShaper = gen_mod:get_opt(room_shaper, Opts, none),
- ejabberd_router:register_route(MyHost),
+ ejabberd_router:register_route(MyHost_L),
load_permanent_rooms(MyHost, Host,
{Access, AccessCreate, AccessAdmin, AccessPersistent},
HistorySize,
@@ -292,7 +294,7 @@ handle_info(_Info, State) ->
%% The return value is ignored.
%%--------------------------------------------------------------------
terminate(_Reason, State) ->
- ejabberd_router:unregister_route(State#state.host),
+ ejabberd_router:unregister_route(binary_to_list(State#state.host)),
ok.
%%--------------------------------------------------------------------
@@ -330,11 +332,11 @@ do_route(Host, ServerHost, Access, HistorySize, RoomShaper,
do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
From, To, Packet, DefRoomOpts);
_ ->
- {xmlelement, _Name, Attrs, _Els} = Packet,
- Lang = xml:get_attr_s("xml:lang", Attrs),
- ErrText = "Access denied by service policy",
- Err = jlib:make_error_reply(Packet,
- ?ERRT_FORBIDDEN(Lang, ErrText)),
+ Lang = exmpp_stanza:get_lang(Packet),
+ ErrText = "Access denied by service policy",
+ Err = exmpp_iq:error(Packet,exmpp_stanza:error(Packet#xmlel.ns,
+ 'forbidden',
+ {Lang,ErrText})),
ejabberd_router:route(To, From, Err)
end.
@@ -342,128 +344,112 @@ do_route(Host, ServerHost, Access, HistorySize, RoomShaper,
do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
From, To, Packet, DefRoomOpts) ->
{_AccessRoute, AccessCreate, AccessAdmin, _AccessPersistent} = Access,
- {Room, _, Nick} = jlib:jid_tolower(To),
- {xmlelement, Name, Attrs, _Els} = Packet,
+ Room = exmpp_jid:prep_node(To),
+ Nick = exmpp_jid:prep_resource(To),
+ #xmlel{name = Name} = Packet,
case Room of
- "" ->
+ 'undefined' ->
case Nick of
- "" ->
+ 'undefined' ->
case Name of
- "iq" ->
- case jlib:iq_query_info(Packet) of
- #iq{type = get, xmlns = ?NS_DISCO_INFO = XMLNS,
- sub_el = _SubEl, lang = Lang} = IQ ->
- Info = ejabberd_hooks:run_fold(
- disco_info, ServerHost, [],
- [ServerHost, ?MODULE, "", ""]),
- Res = IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- iq_disco_info(Lang)
- ++Info}]},
+ 'iq' ->
+ case exmpp_iq:xmlel_to_iq(Packet) of
+ #iq{type = get, ns = ?NS_DISCO_INFO = XMLNS,
+ payload = _SubEl, lang = Lang} = IQ ->
+ ServerHostB = list_to_binary(ServerHost),
+ Info = ejabberd_hooks:run_fold(
+ disco_info, ServerHostB, [],
+ [ServerHost, ?MODULE, <<>>, ""]),
+ ResPayload = #xmlel{ns = XMLNS, name = 'query',
+ children = iq_disco_info(Lang)++Info},
+ Res = exmpp_iq:result(IQ, ResPayload),
ejabberd_router:route(To,
From,
- jlib:iq_to_xml(Res));
+ exmpp_iq:iq_to_xmlel(Res));
#iq{type = get,
- xmlns = ?NS_DISCO_ITEMS} = IQ ->
+ ns = ?NS_DISCO_ITEMS} = IQ ->
spawn(?MODULE,
process_iq_disco_items,
[Host, From, To, IQ]);
#iq{type = get,
- xmlns = ?NS_REGISTER = XMLNS,
- lang = Lang,
- sub_el = _SubEl} = IQ ->
- Res = IQ#iq{type = result,
- sub_el =
- [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- iq_get_register_info(
- Host, From, Lang)}]},
+ ns = ?NS_INBAND_REGISTER = XMLNS,
+ lang = Lang} = IQ ->
+ ResPayload = #xmlel{ns = XMLNS, name = 'query',
+ children = iq_get_register_info(Host,
+ From,
+ Lang)},
+ Res = exmpp_iq:result(IQ,ResPayload),
ejabberd_router:route(To,
From,
- jlib:iq_to_xml(Res));
+ exmpp_iq:iq_to_xmlel(Res));
#iq{type = set,
- xmlns = ?NS_REGISTER = XMLNS,
+ ns = ?NS_INBAND_REGISTER ,
lang = Lang,
- sub_el = SubEl} = IQ ->
+ payload = SubEl} = IQ ->
case process_iq_register_set(Host, From, SubEl, Lang) of
- {result, IQRes} ->
- Res = IQ#iq{type = result,
- sub_el =
- [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- IQRes}]},
+ ok ->
+ Res = exmpp_iq:result(IQ),
ejabberd_router:route(
- To, From, jlib:iq_to_xml(Res));
+ To, From, exmpp_iq:iq_to_xmlel(Res));
{error, Error} ->
- Err = jlib:make_error_reply(
- Packet, Error),
+ Err = exmpp_iq:error(IQ,Error),
ejabberd_router:route(
- To, From, Err)
+ To, From, exmpp_iq:iq_to_xmlel(Err))
end;
#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)}]},
+ ns = ?NS_VCARD,
+ lang = Lang} = IQ ->
+ Res = exmpp_iq:result(IQ,iq_get_vcard(Lang)),
ejabberd_router:route(To,
From,
- jlib:iq_to_xml(Res));
- #iq{} ->
- Err = jlib:make_error_reply(
- Packet,
- ?ERR_FEATURE_NOT_IMPLEMENTED),
+ exmpp_iq:iq_to_xmlel(Res));
+ #iq{} = IQ ->
+ Err = exmpp_iq:error(IQ,'feature-not-implemented'),
ejabberd_router:route(To, From, Err);
_ ->
ok
end;
- "message" ->
- case xml:get_attr_s("type", Attrs) of
+ 'message' ->
+ case exmpp_xml:get_attribute_as_list(Packet,type, "chat") of
"error" ->
ok;
_ ->
case acl:match_rule(ServerHost, AccessAdmin, From) of
allow ->
- Msg = xml:get_path_s(
- Packet,
- [{elem, "body"}, cdata]),
+ Msg = exmpp_xml:get_path(Packet,
+ [{element,'body'},cdata]),
broadcast_service_message(Host, Msg);
_ ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Lang = exmpp_stanza:get_lang(Packet),
ErrText = "Only service administrators "
"are allowed to send service messages",
- Err = jlib:make_error_reply(
- Packet,
- ?ERRT_FORBIDDEN(Lang, ErrText)),
+ Err = exmpp_iq:error(Packet,exmpp_stanza:error(Packet#xmlel.ns,
+ 'forbidden',
+ {Lang,ErrText})),
ejabberd_router:route(
To, From, Err)
end
end;
- "presence" ->
+ 'presence' ->
ok
end;
_ ->
- case xml:get_attr_s("type", Attrs) of
- "error" ->
+ case exmpp_stanza:get_type(Packet) of
+ <<"error">> ->
ok;
- "result" ->
+ <<"result">> ->
ok;
_ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_ITEM_NOT_FOUND),
+ Err = exmpp_iq:error(Packet,'item-not-found'),
ejabberd_router:route(To, From, Err)
end
end;
_ ->
case mnesia:dirty_read(muc_online_room, {Room, Host}) of
[] ->
- Type = xml:get_attr_s("type", Attrs),
+ Type = exmpp_stanza:get_type(Packet),
case {Name, Type} of
- {"presence", ""} ->
+ {'presence', 'undefined'} ->
case check_user_can_create_room(ServerHost,
AccessCreate, From,
Room) of
@@ -477,17 +463,20 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
mod_muc_room:route(Pid, From, Nick, Packet),
ok;
false ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Lang = exmpp_stanza:get_lang(Packet),
ErrText = "Room creation is denied by service policy",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_FORBIDDEN(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,exmpp_stanza:error(Packet#xmlel.ns,
+ 'forbidden',
+ {Lang,ErrText})),
ejabberd_router:route(To, From, Err)
end;
_ ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Lang = exmpp_stanza:get_lang(Packet),
ErrText = "Conference room does not exist",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_ITEM_NOT_FOUND(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns,
+ 'item-not-found',
+ {Lang,ErrText})),
ejabberd_router:route(To, From, Err)
end;
[R] ->
@@ -501,7 +490,7 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
check_user_can_create_room(ServerHost, AccessCreate, From, RoomID) ->
case acl:match_rule(ServerHost, AccessCreate, From) of
allow ->
- (length(RoomID) =< gen_mod:get_module_opt(ServerHost, mod_muc,
+ (size(RoomID) =< gen_mod:get_module_opt(ServerHost, mod_muc,
max_room_id, infinite));
_ ->
false
@@ -554,7 +543,7 @@ start_new_room(Host, ServerHost, Access, Room,
RoomShaper, Opts)
end.
-register_room(Host, Room, Pid) ->
+register_room(Host, Room, Pid) when is_binary(Host), is_binary(Room) ->
F = fun() ->
mnesia:write(#muc_online_room{name_host = {Room, Host},
pid = Pid})
@@ -563,28 +552,46 @@ register_room(Host, Room, Pid) ->
iq_disco_info(Lang) ->
- [{xmlelement, "identity",
- [{"category", "conference"},
- {"type", "text"},
- {"name", translate:translate(Lang, "Chatrooms")}], []},
- {xmlelement, "feature", [{"var", ?NS_DISCO_INFO}], []},
- {xmlelement, "feature", [{"var", ?NS_DISCO_ITEMS}], []},
- {xmlelement, "feature", [{"var", ?NS_MUC}], []},
- {xmlelement, "feature", [{"var", ?NS_REGISTER}], []},
- {xmlelement, "feature", [{"var", ?NS_RSM}], []},
- {xmlelement, "feature", [{"var", ?NS_VCARD}], []}].
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
+ attrs = [?XMLATTR('category',
+ <<"conference">>),
+ ?XMLATTR('type',
+ <<"text">>),
+ ?XMLATTR('name',
+ translate:translate(Lang, "Chatrooms"))]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
+ [?XMLATTR('var',
+ ?NS_DISCO_INFO_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
+ [?XMLATTR('var',
+ ?NS_DISCO_ITEMS_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
+ [?XMLATTR('var',
+ ?NS_MUC_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
+ [?XMLATTR('var',
+ ?NS_INBAND_REGISTER_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
+ [?XMLATTR('var',
+ ?NS_RSM_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
+ [?XMLATTR('var',
+ ?NS_VCARD_s)]}].
-iq_disco_items(Host, From, Lang, none) ->
+iq_disco_items(Host, From, Lang, none) when is_binary(Host) ->
lists:zf(fun(#muc_online_room{name_host = {Name, _Host}, pid = Pid}) ->
case catch gen_fsm:sync_send_all_state_event(
Pid, {get_disco_item, From, Lang}, 100) of
{item, Desc} ->
flush(),
{true,
- {xmlelement, "item",
- [{"jid", jlib:jid_to_string({Name, Host, ""})},
- {"name", Desc}], []}};
+ #xmlel{name = 'item',
+ attrs = [?XMLATTR('jid',
+ exmpp_jid:to_binary(Name,
+ Host)),
+ ?XMLATTR('name',
+ Desc)]}};
_ ->
false
end
@@ -664,13 +671,17 @@ flush() ->
end.
-define(XFIELD(Type, Label, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{name = "field",
+ attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label',
+ translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)],
+ children = [#xmlel{name = 'value',
+ children = [#xmlcdata{cdata = Val}]}]}).
-iq_get_register_info(Host, From, Lang) ->
- {LUser, LServer, _} = jlib:jid_tolower(From),
+iq_get_register_info(Host, From, Lang) ->
+ LUser = exmpp_jid:prep_node(From),
+ LServer = exmpp_jid:prep_domain(From),
LUS = {LUser, LServer},
{Nick, Registered} =
case catch mnesia:dirty_read(muc_registered, {LUS, Host}) of
@@ -679,31 +690,32 @@ iq_get_register_info(Host, From, Lang) ->
[] ->
{"", []};
[#muc_registered{nick = N}] ->
- {N, [{xmlelement, "registered", [], []}]}
+ {N, [#xmlel{name = 'registered'}]}
end,
Registered ++
- [{xmlelement, "instructions", [],
- [{xmlcdata,
- translate:translate(
- Lang, "You need an x:data capable client to register nickname")}]},
- {xmlelement, "x",
- [{"xmlns", ?NS_XDATA}],
- [{xmlelement, "title", [],
- [{xmlcdata,
- translate:translate(
- Lang, "Nickname Registration at ") ++ Host}]},
- {xmlelement, "instructions", [],
- [{xmlcdata,
- translate:translate(
- Lang, "Enter nickname you want to register")}]},
- ?XFIELD("text-single", "Nickname", "nick", Nick)]}].
+ [#xmlel{name = 'instructions' ,
+ children = [#xmlcdata{cdata =
+ translate:translate(Lang,
+ "You need an x:data capable client to register nickname")}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'x',
+ children = [
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'title',
+ children = [#xmlcdata{cdata =
+ [translate:translate(Lang, "Nickname Registration at "), Host]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions',
+ children = [#xmlcdata{cdata =
+ translate:translate(Lang, "Enter nickname you want to register")}]},
+ ?XFIELD(<<"text-single">>, "Nickname", <<"nick">>, Nick)]}].
-iq_set_register_info(Host, From, Nick, Lang) ->
- {LUser, LServer, _} = jlib:jid_tolower(From),
+
+
+iq_set_register_info(Host, From, Nick, Lang) when is_binary(Host), is_binary(Nick) ->
+ LUser = exmpp_jid:prep_node(From),
+ LServer = exmpp_jid:prep_domain(From),
LUS = {LUser, LServer},
F = fun() ->
case Nick of
- "" ->
+ <<>> ->
mnesia:delete({muc_registered, {LUS, Host}}),
ok;
_ ->
@@ -733,56 +745,64 @@ iq_set_register_info(Host, From, Nick, Lang) ->
end,
case mnesia:transaction(F) of
{atomic, ok} ->
- {result, []};
+ ok;
{atomic, false} ->
ErrText = "That nickname is registered by another person",
- {error, ?ERRT_CONFLICT(Lang, ErrText)};
+ %%TODO: Always in the jabber:client namespace?
+ {error,exmpp_stanza:error(?NS_JABBER_CLIENT,
+ 'conflict',
+ {Lang, ErrText})};
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end.
process_iq_register_set(Host, From, SubEl, Lang) ->
- {xmlelement, _Name, _Attrs, Els} = SubEl,
- case xml:get_subtag(SubEl, "remove") of
- false ->
- case xml:remove_cdata(Els) of
- [{xmlelement, "x", _Attrs1, _Els1} = XEl] ->
- case {xml:get_tag_attr_s("xmlns", XEl),
- xml:get_tag_attr_s("type", XEl)} of
- {?NS_XDATA, "cancel"} ->
- {result, []};
- {?NS_XDATA, "submit"} ->
+% {xmlelement, _Name, _Attrs, Els} = SubEl,
+ case exmpp_xml:get_element(SubEl,'remove') of
+ undefined ->
+ case exmpp_xml:get_child_elements(SubEl) of
+ [#xmlel{ns= NS, name = 'x'} = XEl] ->
+ case {NS, exmpp_stanza:get_type(XEl)} of
+ {?NS_DATA_FORMS, <<"cancel">>} ->
+ ok;
+ {?NS_DATA_FORMS, <<"submit">>} ->
XData = jlib:parse_xdata_submit(XEl),
case XData of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
_ ->
case lists:keysearch("nick", 1, XData) of
- {value, {_, [Nick]}} when Nick /= "" ->
- iq_set_register_info(Host, From, Nick, Lang);
+ {value, {_, [Nick]}} ->
+ iq_set_register_info(Host, From, list_to_binary(Nick), Lang);
_ ->
ErrText = "You must fill in field \"Nickname\" in the form",
- {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)}
+ Err = exmpp_stanza:error(SubEl#xmlel.ns,
+ 'not-acceptable',
+ {Lang, translate:translate(Lang,ErrText)}),
+ {error, Err}
end
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- iq_set_register_info(Host, From, "", Lang)
+ iq_set_register_info(Host, From, <<>>, Lang)
end.
iq_get_vcard(Lang) ->
- [{xmlelement, "FN", [],
- [{xmlcdata, "ejabberd/mod_muc"}]},
- {xmlelement, "URL", [],
- [{xmlcdata, ?EJABBERD_URI}]},
- {xmlelement, "DESC", [],
- [{xmlcdata, translate:translate(Lang, "ejabberd MUC module") ++
- "\nCopyright (c) 2003-2009 Alexey Shchepin"}]}].
+ #xmlel{ns = ?NS_VCARD, name = 'vCard',
+ children =
+ [#xmlel{ns = ?NS_VCARD, name = 'FN',
+ children = [#xmlcdata{cdata = <<"ejabberd/mod_muc">>}]},
+ #xmlel{ns = ?NS_VCARD, name = 'URL',
+ children = [#xmlcdata{cdata = ?EJABBERD_URI}]},
+ #xmlel{ns = ?NS_VCARD, name = 'DESC',
+ children = [#xmlcdata{cdata =
+ translate:translate(Lang, "ejabberd MUC module") ++
+ "\nCopyright (c) 2003-2009 Alexey Shchepin"}]}]}.
broadcast_service_message(Host, Msg) ->
@@ -792,7 +812,7 @@ broadcast_service_message(Host, Msg) ->
Pid, {service_message, Msg})
end, get_vh_rooms(Host)).
-get_vh_rooms(Host) ->
+get_vh_rooms(Host) when is_binary(Host) ->
mnesia:dirty_select(muc_online_room,
[{#muc_online_room{name_host = '$1', _ = '_'},
[{'==', {element, 2, '$1'}, Host}],
diff --git a/src/mod_muc/mod_muc_log.erl b/src/mod_muc/mod_muc_log.erl
index d1942f4bb..1dbd27474 100644
--- a/src/mod_muc/mod_muc_log.erl
+++ b/src/mod_muc/mod_muc_log.erl
@@ -41,8 +41,9 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_muc_room.hrl").
%% Copied from mod_muc/mod_muc.erl
@@ -141,7 +142,7 @@ init([Host, Opts]) ->
file_format = FileFormat,
css_file = CSSFile,
access = AccessLog,
- lang = Lang,
+ lang = list_to_binary(Lang),
timezone = Timezone,
spam_prevention = NoFollow,
top_link = Top_link}}.
@@ -208,15 +209,16 @@ code_change(_OldVsn, State, _Extra) ->
%%% Internal functions
%%--------------------------------------------------------------------
add_to_log2(text, {Nick, Packet}, Room, Opts, State) ->
- case {xml:get_subtag(Packet, "subject"), xml:get_subtag(Packet, "body")} of
- {false, false} ->
+ case {exmpp_xml:get_element(Packet, 'subject'),
+ exmpp_xml:get_element(Packet, 'body')} of
+ {'undefined', 'undefined'} ->
ok;
- {false, SubEl} ->
- Message = {body, xml:get_tag_cdata(SubEl)},
- add_message_to_log(Nick, Message, Room, Opts, State);
+ {'undefined', SubEl} ->
+ Message = {body, exmpp_xml:get_cdata_as_list(SubEl)},
+ add_message_to_log(binary_to_list(Nick), Message, Room, Opts, State);
{SubEl, _} ->
- Message = {subject, xml:get_tag_cdata(SubEl)},
- add_message_to_log(Nick, Message, Room, Opts, State)
+ Message = {subject, exmpp_xml:get_cdata_as_list(SubEl)},
+ add_message_to_log(binary_to_list(Nick), Message, Room, Opts, State)
end;
add_to_log2(roomconfig_change, _Occupants, Room, Opts, State) ->
@@ -226,19 +228,19 @@ add_to_log2(roomconfig_change_enabledlogging, Occupants, Room, Opts, State) ->
add_message_to_log("", {roomconfig_change, Occupants}, Room, Opts, State);
add_to_log2(nickchange, {OldNick, NewNick}, Room, Opts, State) ->
- add_message_to_log(NewNick, {nickchange, OldNick}, Room, Opts, State);
+ add_message_to_log(binary_to_list(NewNick), {nickchange, binary_to_list(OldNick)}, Room, Opts, State);
add_to_log2(join, Nick, Room, Opts, State) ->
- add_message_to_log(Nick, join, Room, Opts, State);
+ add_message_to_log(binary_to_list(Nick), join, Room, Opts, State);
add_to_log2(leave, {Nick, Reason}, Room, Opts, State) ->
- case Reason of
- "" -> add_message_to_log(Nick, leave, Room, Opts, State);
- _ -> add_message_to_log(Nick, {leave, Reason}, Room, Opts, State)
+ case binary_to_list(Reason) of
+ "" -> add_message_to_log(binary_to_list(Nick), leave, Room, Opts, State);
+ R -> add_message_to_log(binary_to_list(Nick), {leave, R}, Room, Opts, State)
end;
add_to_log2(kickban, {Nick, Reason, Code}, Room, Opts, State) ->
- add_message_to_log(Nick, {kickban, Code, Reason}, Room, Opts, State).
+ add_message_to_log(binary_to_list(Nick), {kickban, Code, binary_to_list(Reason)}, Room, Opts, State).
%%----------------------------------------------------------------------
@@ -276,8 +278,8 @@ build_filename_string(TimeStamp, OutDir, RoomJID, DirType, DirName, FileFormat)
{Fd, Fn, Fnrel}.
get_room_name(RoomJID) ->
- JID = jlib:string_to_jid(RoomJID),
- JID#jid.user.
+ JID = exmpp_jid:parse(RoomJID),
+ exmpp_jid:node_as_list(JID).
%% calculate day before
get_timestamp_daydiff(TimeStamp, Daydiff) ->
@@ -413,11 +415,11 @@ add_message_to_log(Nick1, Message, RoomJID, Opts, State) ->
io_lib:format("~s~s~s ",
[Nick, ?T(" has set the subject to: "), htmlize(T,NoFollow,FileFormat)]);
{body, T} ->
- case {regexp:first_match(T, "^/me\s"), Nick} of
+ case {re:run(T, "^/me\s", [{capture, none}]), Nick} of
{_, ""} ->
io_lib:format("~s ",
[htmlize(T,NoFollow,FileFormat)]);
- {{match, _, _}, _} ->
+ {match, _} ->
io_lib:format("~s ~s ",
[Nick, string:substr(htmlize(T,FileFormat), 5)]);
{nomatch, _} ->
@@ -475,16 +477,27 @@ get_dateweek(Date, Lang) ->
end.
make_dir_rec(Dir) ->
+ Path = filename:split(Dir),
+ inc_foreach(Path,fun make_dir_if_not_exists/1).
+
+
+make_dir_if_not_exists(DirPath) ->
+ Dir = filename:join(DirPath),
case file:read_file_info(Dir) of
{ok, _} ->
ok;
{error, enoent} ->
- DirS = filename:split(Dir),
- DirR = lists:sublist(DirS, length(DirS)-1),
- make_dir_rec(filename:join(DirR)),
file:make_dir(Dir)
end.
+inc_foreach(Lists, F) ->
+ lists:foldl(fun(Item, Accum) ->
+ New = Accum ++ [Item],
+ F(New),
+ New
+ end,[],Lists).
+
+
%% {ok, F1}=file:open("valid-xhtml10.png", [read]).
%% {ok, F1b}=file:read(F1, 1000000).
@@ -651,8 +664,7 @@ fw(F, S, O, FileFormat) ->
html ->
S1;
plaintext ->
- {ok, Res, _} = regexp:gsub(S1, "<[^>]*>", ""),
- Res
+ re:replace(S1, "<[^>]*>", "", [global,{return,list}])
end,
io:format(F, S2, []).
@@ -753,6 +765,8 @@ put_room_occupants(F, RoomOccupants, Lang, _FileFormat) ->
%% htmlize
%% The default behaviour is to ignore the nofollow spam prevention on links
%% (NoFollow=false)
+
+
htmlize(S1) ->
htmlize(S1, html).
@@ -779,15 +793,20 @@ htmlize(S1, NoFollow, _FileFormat) ->
S2_list).
htmlize2(S1, NoFollow) ->
- S2 = element(2, regexp:gsub(S1, "\\&", "\\&")),
- S3 = element(2, regexp:gsub(S2, "<", "\\<")),
- S4 = element(2, regexp:gsub(S3, ">", "\\>")),
- S5 = element(2, regexp:gsub(S4, "((http|https|ftp)://|(mailto|xmpp):)[^] )\'\"}]+",
- link_regexp(NoFollow))),
- %% Remove 'right-to-left override' unicode character 0x202e
- S6 = element(2, regexp:gsub(S5, " ", "\\ \\ ")),
- S7 = element(2, regexp:gsub(S6, "\\t", "\\ \\ \\ \\ ")),
- element(2, regexp:gsub(S7, [226,128,174], "[RLO]")).
+ ReplacementRules =
+ [{"\\&", "\\&"},
+ {"<", "\\<"},
+ {">", "\\>"},
+ {"((http|https|ftp)://|(mailto|xmpp):)[^] )\'\"}]+", link_regexp(NoFollow)},
+ {" ", "\\ \\ "},
+ {"\\t", "\\ \\ \\ \\ "},
+ {[226,128,174], "[RLO]"}], %% Remove 'right-to-left override' unicode character 0x202e
+ lists:foldl(
+ fun({RegExp, Replace}, Acc) ->
+ re:replace(Acc, RegExp, Replace)
+ end,
+ S1,
+ ReplacementRules).
%% Regexp link
%% Add the nofollow rel attribute when required
@@ -812,7 +831,7 @@ get_room_info(RoomJID, Opts) ->
{value, {_, SA}} -> SA;
false -> ""
end,
- #room{jid = jlib:jid_to_string(RoomJID),
+ #room{jid = exmpp_jid:to_list(RoomJID),
title = Title,
subject = Subject,
subject_author = SubjectAuthor,
@@ -910,9 +929,9 @@ role_users_to_string(RoleS, Users) ->
[RoleS, ": ", UsersString].
get_room_occupants(RoomJIDString) ->
- RoomJID = jlib:string_to_jid(RoomJIDString),
- RoomName = RoomJID#jid.luser,
- MucService = RoomJID#jid.lserver,
+ RoomJID = exmpp_jid:parse(RoomJIDString),
+ RoomName = exmpp_jid:node(RoomJID),
+ MucService = exmpp_jid:domain(RoomJID),
StateData = get_room_state(RoomName, MucService),
[{U#user.jid, U#user.nick, U#user.role}
|| {_, U} <- ?DICT:to_list(StateData#state.users)].
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl
index 47b40f6dd..2b1ad12fa 100644
--- a/src/mod_muc/mod_muc_room.erl
+++ b/src/mod_muc/mod_muc_room.erl
@@ -46,9 +46,11 @@
terminate/3,
code_change/4]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_muc_room.hrl").
+-include("jlib.hrl"). %% Used for captcha
-define(MAX_USERS_DEFAULT_LIST,
[5, 10, 20, 30, 50, 100, 200, 500, 1000, 2000, 5000]).
@@ -75,6 +77,12 @@
Creator, Nick, DefRoomOpts])).
-endif.
+
+-define(ERR(Packet,Type, Lang, ErrText),
+ exmpp_stanza:error(Packet#xmlel.ns,
+ Type,
+ {Lang, translate:translate(Lang, ErrText)})).
+
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
@@ -119,12 +127,12 @@ init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Creator, _Nick, D
access = Access,
room = Room,
history = lqueue_new(HistorySize),
- jid = jlib:make_jid(Room, Host, ""),
+ jid = exmpp_jid:make(Room, Host),
just_created = true,
room_shaper = Shaper}),
State1 = set_opts(DefRoomOpts, State),
?INFO_MSG("Created MUC room ~s@~s by ~s",
- [Room, Host, jlib:jid_to_string(Creator)]),
+ [Room, Host, exmpp_jid:to_binary(Creator)]),
{ok, normal_state, State1};
init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts]) ->
process_flag(trap_exit, true),
@@ -134,7 +142,7 @@ init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts]) ->
access = Access,
room = Room,
history = lqueue_new(HistorySize),
- jid = jlib:make_jid(Room, Host, ""),
+ jid = exmpp_jid:make(Room, Host),
room_shaper = Shaper}),
{ok, normal_state, State}.
@@ -144,32 +152,33 @@ init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts]) ->
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
-normal_state({route, From, "",
- {xmlelement, "message", Attrs, Els} = Packet},
+normal_state({route, From, undefined,
+ #xmlel{name = 'message'} = Packet},
StateData) ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Lang = exmpp_stanza:get_lang(Packet),
case is_user_online(From, StateData) orelse
is_user_allowed_message_nonparticipant(From, StateData) of
true ->
- case xml:get_attr_s("type", Attrs) of
- "groupchat" ->
+ case exmpp_message:get_type(Packet) of
+ groupchat ->
Activity = get_user_activity(From, StateData),
Now = now_to_usec(now()),
MinMessageInterval =
trunc(gen_mod:get_module_opt(
StateData#state.server_host,
mod_muc, min_message_interval, 0) * 1000000),
- Size = lists:flatlength(xml:element_to_string(Packet)),
+ Size = erlang:iolist_size(exmpp_xml:document_to_iolist(Packet)),
{MessageShaper, MessageShaperInterval} =
shaper:update(Activity#activity.message_shaper, Size),
if
Activity#activity.message /= undefined ->
ErrText = "Traffic rate limit is exceeded",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_RESOURCE_CONSTRAINT(Lang, ErrText)),
+ Err = exmpp_stanza:error(Packet#xmlel.ns,
+ 'resource-constraint',
+ {Lang, translate:translate(Lang, ErrText)}),
ejabberd_router:route(
StateData#state.jid,
- From, Err),
+ From, exmpp_stanza:reply_with_error(Packet, Err)),
{next_state, normal_state, StateData};
Now >= Activity#activity.message_time + MinMessageInterval,
MessageShaperInterval == 0 ->
@@ -233,7 +242,7 @@ normal_state({route, From, "",
From, NewActivity, StateData),
{next_state, normal_state, StateData1}
end;
- "error" ->
+ error ->
case is_user_online(From, StateData) of
true ->
ErrorText = "This participant is kicked from the room because "
@@ -244,19 +253,23 @@ normal_state({route, From, "",
_ ->
{next_state, normal_state, StateData}
end;
- "chat" ->
+ chat ->
ErrText = "It is not allowed to send private messages to the conference",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)),
+ Err = exmpp_stanza:error(Packet#xmlel.ns,
+ 'not-acceptable',
+ {Lang, translate:translate(Lang, ErrText)}),
ejabberd_router:route(
StateData#state.jid,
- From, Err),
+ From, exmpp_stanza:reply_with_error(Packet, Err)),
{next_state, normal_state, StateData};
- Type when (Type == "") or (Type == "normal") ->
- case catch check_invitation(From, Els, Lang, StateData) of
+ %%TODO: currently exmpp_message:get_type/1 never returns 'undefined'
+ Type when (Type == 'normal') orelse (Type == 'undefined') ->
+ case catch check_invitation(From,
+ exmpp_xml:get_child_elements(Packet),
+ Lang,
+ StateData) of
{error, Error} ->
- Err = jlib:make_error_reply(
- Packet, Error),
+ Err = exmpp_stanza:reply_with_error(Packet, Error),
ejabberd_router:route(
StateData#state.jid,
From, Err),
@@ -291,28 +304,29 @@ normal_state({route, From, "",
end;
_ ->
ErrText = "Improper message type",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)),
+ Err = exmpp_stanza:error(Packet#xmlel.ns,
+ 'not-acceptable',
+ {Lang, translate:translate(Lang, ErrText)}),
ejabberd_router:route(
StateData#state.jid,
- From, Err),
+ From, exmpp_stanza:reply_with_error(Packet, Err)),
{next_state, normal_state, StateData}
end;
_ ->
- case xml:get_attr_s("type", Attrs) of
- "error" ->
+ case exmpp_stanza:is_stanza_error(Packet) of
+ true ->
ok;
- _ ->
+ false ->
handle_roommessage_from_nonparticipant(Packet, Lang, StateData, From)
end,
{next_state, normal_state, StateData}
end;
-normal_state({route, From, "",
- {xmlelement, "iq", _Attrs, _Els} = Packet},
+normal_state({route, From, undefined,
+ #xmlel{name = 'iq'} = Packet},
StateData) ->
- case jlib:iq_query_info(Packet) of
- #iq{type = Type, xmlns = XMLNS, lang = Lang, sub_el = SubEl} = IQ when
+ case exmpp_iq:xmlel_to_iq(Packet) of
+ #iq{type = Type, ns = XMLNS, lang = Lang, payload = SubEl} = IQ when
(XMLNS == ?NS_MUC_ADMIN) or
(XMLNS == ?NS_MUC_OWNER) or
(XMLNS == ?NS_DISCO_INFO) or
@@ -332,21 +346,18 @@ normal_state({route, From, "",
end,
{IQRes, NewStateData} =
case Res1 of
+ {result, [], SD} ->
+ {exmpp_iq:result(IQ), SD};
{result, Res, SD} ->
- {IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- Res
- }]},
- SD};
+ {exmpp_iq:result(IQ,#xmlel{ns = XMLNS,
+ name = 'query',
+ children = Res}), SD};
{error, Error} ->
- {IQ#iq{type = error,
- sub_el = [SubEl, Error]},
- StateData}
+ {exmpp_iq:error(IQ, Error), StateData}
end,
ejabberd_router:route(StateData#state.jid,
From,
- jlib:iq_to_xml(IQRes)),
+ exmpp_iq:iq_to_xmlel(IQRes)),
case NewStateData of
stop ->
{stop, normal, StateData};
@@ -356,14 +367,13 @@ normal_state({route, From, "",
reply ->
{next_state, normal_state, StateData};
_ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
+ Err = exmpp_stanza:reply_with_error(Packet, 'feature-not-implemented'),
ejabberd_router:route(StateData#state.jid, From, Err),
{next_state, normal_state, StateData}
end;
normal_state({route, From, Nick,
- {xmlelement, "presence", _Attrs, _Els} = Packet},
+ #xmlel{name = 'presence'} = Packet},
StateData) ->
Activity = get_user_activity(From, StateData),
Now = now_to_usec(now()),
@@ -393,10 +403,10 @@ normal_state({route, From, Nick,
end;
normal_state({route, From, ToNick,
- {xmlelement, "message", Attrs, _} = Packet},
+ #xmlel{name = 'message'} = Packet},
StateData) ->
- Type = xml:get_attr_s("type", Attrs),
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Type = exmpp_message:get_type(Packet),
+ Lang = exmpp_stanza:get_lang(Packet),
case decide_fate_message(Type, Packet, From, StateData) of
{expulse_sender, Reason} ->
?DEBUG(Reason, []),
@@ -415,10 +425,11 @@ normal_state({route, From, ToNick,
"groupchat" ->
ErrText = "It is not allowed to send private "
"messages of type \"groupchat\"",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_BAD_REQUEST(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'bad-request',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
ToNick),
From, Err);
@@ -426,19 +437,20 @@ normal_state({route, From, ToNick,
case find_jid_by_nick(ToNick, StateData) of
false ->
ErrText = "Recipient is not in the conference room",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_ITEM_NOT_FOUND(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'item-not-found',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
ToNick),
From, Err);
ToJID ->
{ok, #user{nick = FromNick}} =
- ?DICT:find(jlib:jid_tolower(From),
+ ?DICT:find(jlib:short_prepd_jid(From),
StateData#state.users),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
FromNick),
ToJID, Packet)
@@ -446,19 +458,21 @@ normal_state({route, From, ToNick,
end;
{true, false} ->
ErrText = "Only occupants are allowed to send messages to the conference",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'not-acceptable',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
ToNick),
From, Err);
{false, _} ->
ErrText = "It is not allowed to send private messages",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_FORBIDDEN(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'forbidden',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
ToNick),
From, Err)
@@ -467,56 +481,65 @@ normal_state({route, From, ToNick,
end;
normal_state({route, From, ToNick,
- {xmlelement, "iq", Attrs, _Els} = Packet},
+ #xmlel{name = 'iq'} = Packet},
StateData) ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Lang = exmpp_stanza:get_lang(Packet),
case {(StateData#state.config)#config.allow_query_users,
is_user_online(From, StateData)} of
{true, true} ->
case find_jid_by_nick(ToNick, StateData) of
false ->
- case jlib:iq_query_info(Packet) of
- reply ->
+ case exmpp_iq:get_type(Packet) of
+ result ->
+ ok;
+ error ->
ok;
_ ->
ErrText = "Recipient is not in the conference room",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_ITEM_NOT_FOUND(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'item-not-found',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid, ToNick),
From, Err)
end;
ToJID ->
{ok, #user{nick = FromNick}} =
- ?DICT:find(jlib:jid_tolower(From),
+ ?DICT:find(jlib:short_prepd_jid(From),
StateData#state.users),
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, FromNick),
+ jid_replace_resource(StateData#state.jid, FromNick),
ToJID, Packet)
end;
{_, false} ->
- case jlib:iq_query_info(Packet) of
- reply ->
+ case exmpp_iq:get_type(Packet) of
+ result ->
+ ok;
+ error ->
ok;
_ ->
ErrText = "Only occupants are allowed to send queries to the conference",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'not-acceptable',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, ToNick),
+ jid_replace_resource(StateData#state.jid, ToNick),
From, Err)
end;
_ ->
- case jlib:iq_query_info(Packet) of
- reply ->
+ case exmpp_iq:get_type(Packet) of
+ result ->
+ ok;
+ error ->
ok;
_ ->
ErrText = "Queries to the conference members are not allowed in this room",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_ALLOWED(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'not-allowed',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, ToNick),
+ jid_replace_resource(StateData#state.jid, ToNick),
From, Err)
end
end,
@@ -534,9 +557,10 @@ normal_state(_Event, StateData) ->
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_event({service_message, Msg}, _StateName, StateData) ->
- MessagePkt = {xmlelement, "message",
- [{"type", "groupchat"}],
- [{xmlelement, "body", [], [{xmlcdata, Msg}]}]},
+ MessagePkt = #xmlel{name = 'message',
+ attrs = [?XMLATTR('type', <<"groupchat">>)],
+ children = [#xmlel{name = 'body',
+ children = [#xmlcdata{cdata = Msg}]}]},
lists:foreach(
fun({_LJID, Info}) ->
ejabberd_router:route(
@@ -553,21 +577,20 @@ handle_event({service_message, Msg}, _StateName, StateData) ->
handle_event({destroy, Reason}, _StateName, StateData) ->
{result, [], stop} =
- destroy_room(
- {xmlelement, "destroy",
- [{"xmlns", ?NS_MUC_OWNER}],
- case Reason of
- none -> [];
- _Else ->
- [{xmlelement, "reason",
- [], [{xmlcdata, Reason}]}]
- end}, StateData),
+ destroy_room(
+ #xmlel{ns = ?NS_MUC_OWNER, name = 'destroy',
+ children = case Reason of
+ none -> [];
+ _Else -> [#xmlel{name = 'reason',
+ children = [#xmlcdata{cdata = Reason}]}]
+ end}, StateData),
+
?INFO_MSG("Destroyed MUC room ~s with reason: ~p",
- [jlib:jid_to_string(StateData#state.jid), Reason]),
+ [exmpp_jid:to_binary(StateData#state.jid), Reason]),
{stop, normal, StateData};
handle_event(destroy, StateName, StateData) ->
?INFO_MSG("Destroyed MUC room ~s",
- [jlib:jid_to_string(StateData#state.jid)]),
+ [exmpp_jid:to_binary(StateData#state.jid)]),
handle_event({destroy, none}, StateName, StateData);
handle_event({set_affiliations, Affiliations}, StateName, StateData) ->
@@ -606,12 +629,12 @@ handle_sync_event({get_disco_item, JID, Lang}, _From, StateName, StateData) ->
_ ->
" (n/a)"
end,
- Reply = case ((StateData#state.config)#config.public == true) orelse
+ Reply = case ((StateData#state.config)#config.public == true) orelse
(FRole /= none) orelse
(FAffiliation == admin) orelse
(FAffiliation == owner) of
true ->
- {item, get_title(StateData) ++ Tail};
+ {item, list_to_binary([get_title(StateData), Tail])};
_ ->
false
end,
@@ -702,10 +725,10 @@ handle_info({captcha_failed, From}, normal_state, StateData) ->
NewState = case ?DICT:find(From, StateData#state.robots) of
{ok, {Nick, Packet}} ->
Robots = ?DICT:erase(From, StateData#state.robots),
- Err = jlib:make_error_reply(
- Packet, ?ERR_NOT_AUTHORIZED),
+ Err = exmpp_stanza:reply_with_error(
+ Packet, ?ERR(Packet, 'not-authorized', undefined, "")),
ejabberd_router:route( % TODO: s/Nick/""/
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid, Nick),
From, Err),
StateData#state{robots=Robots};
@@ -737,9 +760,9 @@ terminate(_Reason, _StateName, StateData) ->
route(Pid, From, ToNick, Packet) ->
gen_fsm:send_event(Pid, {route, From, ToNick, Packet}).
-process_groupchat_message(From, {xmlelement, "message", Attrs, _Els} = Packet,
+process_groupchat_message(From, #xmlel{name = 'message'} = Packet,
StateData) ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Lang = exmpp_stanza:get_lang(Packet),
case is_user_online(From, StateData) orelse
is_user_allowed_message_nonparticipant(From, StateData) of
true ->
@@ -779,7 +802,7 @@ process_groupchat_message(From, {xmlelement, "message", Attrs, _Els} = Packet,
lists:foreach(
fun({_LJID, Info}) ->
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
FromNick),
Info#user.jid,
@@ -796,26 +819,29 @@ process_groupchat_message(From, {xmlelement, "message", Attrs, _Els} = Packet,
Err =
case (StateData#state.config)#config.allow_change_subj of
true ->
- ?ERRT_FORBIDDEN(
- Lang,
- "Only moderators and participants "
- "are allowed to change the subject in this room");
+ exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'forbidden',
+ {Lang, translate:translate(Lang,
+ "Only moderators and participants "
+ "are allowed to change the subject in this room")}));
_ ->
- ?ERRT_FORBIDDEN(
- Lang,
- "Only moderators "
- "are allowed to change the subject in this room")
+ exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'forbidden',
+ {Lang, translate:translate(Lang,
+ "Only moderators "
+ "are allowed to change the subject in this room")}))
end,
ejabberd_router:route(
StateData#state.jid,
From,
- jlib:make_error_reply(Packet, Err)),
+ Err),
{next_state, normal_state, StateData}
end;
true ->
ErrText = "Visitors are not allowed to send messages to all occupants",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_FORBIDDEN(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'forbidden',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
StateData#state.jid,
From, Err),
@@ -823,8 +849,9 @@ process_groupchat_message(From, {xmlelement, "message", Attrs, _Els} = Packet,
end;
false ->
ErrText = "Only occupants are allowed to send messages to the conference",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'not-acceptable',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(StateData#state.jid, From, Err),
{next_state, normal_state, StateData}
end.
@@ -850,35 +877,35 @@ is_user_allowed_message_nonparticipant(JID, StateData) ->
%% @doc Get information of this participant, or default values.
%% If the JID is not a participant, return values for a service message.
get_participant_data(From, StateData) ->
- case ?DICT:find(jlib:jid_tolower(From), StateData#state.users) of
+ case ?DICT:find(jlib:short_prepd_jid(From), StateData#state.users) of
{ok, #user{nick = FromNick, role = Role}} ->
{FromNick, Role};
error ->
- {"", moderator}
+ {<<>>, moderator}
end.
-process_presence(From, Nick, {xmlelement, "presence", Attrs, _Els} = Packet,
+process_presence(From, Nick, #xmlel{name = 'presence'} = Packet,
StateData) ->
- Type = xml:get_attr_s("type", Attrs),
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Type = exmpp_presence:get_type(Packet),
+ Lang = exmpp_stanza:get_lang(Packet),
StateData1 =
case Type of
- "unavailable" ->
+ unavailable ->
case is_user_online(From, StateData) of
true ->
NewState =
add_user_presence_un(From, Packet, StateData),
send_new_presence(From, NewState),
- Reason = case xml:get_subtag(Packet, "status") of
- false -> "";
- Status_el -> xml:get_tag_cdata(Status_el)
+ Reason = case exmpp_xml:get_element(Packet, 'status') of
+ undefined -> <<>>;
+ Status_el -> exmpp_xml:get_cdata(Status_el)
end,
remove_online_user(From, NewState, Reason);
_ ->
StateData
end;
- "error" ->
+ error ->
case is_user_online(From, StateData) of
true ->
ErrorText = "This participant is kicked from the room because "
@@ -888,48 +915,48 @@ process_presence(From, Nick, {xmlelement, "presence", Attrs, _Els} = Packet,
_ ->
StateData
end;
- "" ->
+ 'available' ->
case is_user_online(From, StateData) of
true ->
case is_nick_change(From, Nick, StateData) of
true ->
case {is_nick_exists(Nick, StateData),
mod_muc:can_use_nick(
- StateData#state.host, From, Nick),
- {(StateData#state.config)#config.allow_visitor_nickchange,
- is_visitor(From, StateData)}} of
- {_, _, {false, true}} ->
+ StateData#state.host, From, Nick),
+ {(StateData#state.config)#config.allow_visitor_nickchange,
+ is_visitor(From, StateData)}} of
+ {_, _, {false, true}} ->
ErrText = "Visitors are not allowed to change their nicknames in this room",
- Err = jlib:make_error_reply(
- Packet,
- ?ERRT_NOT_ALLOWED(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'not-allowed',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
% TODO: s/Nick/""/
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
Nick),
From, Err),
StateData;
{true, _, _} ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+ Lang = exmpp_stanza:get_lang(Packet),
ErrText = "That nickname is already in use by another occupant",
- Err = jlib:make_error_reply(
- Packet,
- ?ERRT_CONFLICT(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'conflict',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
Nick), % TODO: s/Nick/""/
From, Err),
StateData;
{_, false, _} ->
ErrText = "That nickname is registered by another person",
- Err = jlib:make_error_reply(
- Packet,
- ?ERRT_CONFLICT(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns, 'conflict',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
% TODO: s/Nick/""/
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid,
Nick),
From, Err),
@@ -959,59 +986,59 @@ process_presence(From, Nick, {xmlelement, "presence", Attrs, _Els} = Packet,
(?DICT:to_list(StateData1#state.users) == []) of
true ->
?INFO_MSG("Destroyed MUC room ~s because it's temporary and empty",
- [jlib:jid_to_string(StateData#state.jid)]),
+ [exmpp_jid:to_binary(StateData#state.jid)]),
{stop, normal, StateData1};
_ ->
{next_state, normal_state, StateData1}
end.
is_user_online(JID, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
?DICT:is_key(LJID, StateData#state.users).
-role_to_list(Role) ->
+role_to_binary(Role) ->
case Role of
- moderator -> "moderator";
- participant -> "participant";
- visitor -> "visitor";
- none -> "none"
+ moderator -> <<"moderator">>;
+ participant -> <<"participant">>;
+ visitor -> <<"visitor">>;
+ none -> <<"none">>
end.
-affiliation_to_list(Affiliation) ->
+affiliation_to_binary(Affiliation) ->
case Affiliation of
- owner -> "owner";
- admin -> "admin";
- member -> "member";
- outcast -> "outcast";
- none -> "none"
+ owner -> <<"owner">>;
+ admin -> <<"admin">>;
+ member -> <<"member">>;
+ outcast -> <<"outcast">>;
+ none -> <<"none">>
end.
-list_to_role(Role) ->
+binary_to_role(Role) ->
case Role of
- "moderator" -> moderator;
- "participant" -> participant;
- "visitor" -> visitor;
- "none" -> none
+ <<"moderator">> -> moderator;
+ <<"participant">> -> participant;
+ <<"visitor">> -> visitor;
+ <<"none">> -> none
end.
-list_to_affiliation(Affiliation) ->
+binary_to_affiliation(Affiliation) ->
case Affiliation of
- "owner" -> owner;
- "admin" -> admin;
- "member" -> member;
- "outcast" -> outcast;
- "none" -> none
+ <<"owner">> -> owner;
+ <<"admin">> -> admin;
+ <<"member">> -> member;
+ <<"outcast">> -> outcast;
+ <<"none">> -> none
end.
%% Decide the fate of the message and its sender
%% Returns: continue_delivery | forget_message | {expulse_sender, Reason}
-decide_fate_message("error", Packet, From, StateData) ->
+decide_fate_message(error, Packet, From, StateData) ->
%% Make a preliminary decision
PD = case check_error_kick(Packet) of
%% If this is an error stanza and its condition matches a criteria
true ->
Reason = io_lib:format("This participant is considered a ghost and is expulsed: ~s",
- [jlib:jid_to_string(From)]),
+ [exmpp_jid:to_binary(From)]),
{expulse_sender, Reason};
false ->
continue_delivery
@@ -1036,47 +1063,39 @@ decide_fate_message(_, _, _, _) ->
%% If so, return true to kick the participant.
check_error_kick(Packet) ->
case get_error_condition(Packet) of
- "gone" -> true;
- "internal-server-error" -> true;
- "item-not-found" -> true;
- "jid-malformed" -> true;
- "recipient-unavailable" -> true;
- "redirect" -> true;
- "remote-server-not-found" -> true;
- "remote-server-timeout" -> true;
- "service-unavailable" -> true;
+ 'gone' -> true;
+ 'internal-server-error' -> true;
+ 'item-not-found' -> true;
+ 'jid-malformed' -> true;
+ 'recipient-unavailable' -> true;
+ 'redirect' -> true;
+ 'remote-server-not-found' -> true;
+ 'remote-server-timeout' -> true;
+ 'service-unavailable' -> true;
_ -> false
end.
get_error_condition(Packet) ->
- case catch get_error_condition2(Packet) of
- {condition, ErrorCondition} ->
- ErrorCondition;
- {'EXIT', _} ->
- "badformed error stanza"
+ try exmpp_stanza:get_condition(Packet) of
+ ErrorCondition -> ErrorCondition
+ catch
+ _:_ ->
+ 'badformed-error-stanza'
end.
-get_error_condition2(Packet) ->
- {xmlelement, _, _, EEls} = xml:get_subtag(Packet, "error"),
- [Condition] = [Name || {xmlelement, Name, [{"xmlns", ?NS_STANZAS}], []} <- EEls],
- {condition, Condition}.
expulse_participant(Packet, From, StateData, Reason1) ->
ErrorCondition = get_error_condition(Packet),
Reason2 = io_lib:format(Reason1 ++ ": " ++ "~s", [ErrorCondition]),
NewState = add_user_presence_un(
From,
- {xmlelement, "presence",
- [{"type", "unavailable"}],
- [{xmlelement, "status", [],
- [{xmlcdata, Reason2}]
- }]},
+ exmpp_presence:presence('unavailable',Reason2),
StateData),
send_new_presence(From, NewState),
remove_online_user(From, NewState).
set_affiliation(JID, Affiliation, StateData) ->
- LJID = jlib:jid_remove_resource(jlib:jid_tolower(JID)),
+ LJID = jlib:short_prepd_bare_jid(JID),
Affiliations = case Affiliation of
none ->
?DICT:erase(LJID,
@@ -1089,7 +1108,7 @@ set_affiliation(JID, Affiliation, StateData) ->
StateData#state{affiliations = Affiliations}.
set_affiliation_and_reason(JID, Affiliation, Reason, StateData) ->
- LJID = jlib:jid_remove_resource(jlib:jid_tolower(JID)),
+ LJID = jlib:short_prepd_bare_jid(JID),
Affiliations = case Affiliation of
none ->
?DICT:erase(LJID,
@@ -1108,22 +1127,22 @@ get_affiliation(JID, StateData) ->
allow ->
owner;
_ ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
case ?DICT:find(LJID, StateData#state.affiliations) of
{ok, Affiliation} ->
Affiliation;
_ ->
- LJID1 = jlib:jid_remove_resource(LJID),
+ LJID1 = jlib:short_prepd_bare_jid(JID),
case ?DICT:find(LJID1, StateData#state.affiliations) of
{ok, Affiliation} ->
Affiliation;
_ ->
- LJID2 = setelement(1, LJID, ""),
+ LJID2 = setelement(1, LJID, undefined),
case ?DICT:find(LJID2, StateData#state.affiliations) of
{ok, Affiliation} ->
Affiliation;
_ ->
- LJID3 = jlib:jid_remove_resource(LJID2),
+ LJID3 = setelement(1,jlib:short_prepd_bare_jid(JID),undefined),
case ?DICT:find(LJID3, StateData#state.affiliations) of
{ok, Affiliation} ->
Affiliation;
@@ -1152,9 +1171,9 @@ get_service_affiliation(JID, StateData) ->
end.
set_role(JID, Role, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
LJIDs = case LJID of
- {U, S, ""} ->
+ {U, S, undefined} ->
?DICT:fold(
fun(J, _, Js) ->
case J of
@@ -1189,7 +1208,7 @@ set_role(JID, Role, StateData) ->
StateData#state{users = Users}.
get_role(JID, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
case ?DICT:find(LJID, StateData#state.users) of
{ok, #user{role = Role}} ->
Role;
@@ -1237,7 +1256,7 @@ get_max_users_admin_threshold(StateData) ->
mod_muc, max_users_admin_threshold, 5).
get_user_activity(JID, StateData) ->
- case treap:lookup(jlib:jid_tolower(JID),
+ case treap:lookup(jlib:short_prepd_jid(JID),
StateData#state.activity) of
{ok, _P, A} -> A;
error ->
@@ -1262,7 +1281,7 @@ store_user_activity(JID, UserActivity, StateData) ->
gen_mod:get_module_opt(
StateData#state.server_host,
mod_muc, min_presence_interval, 0),
- Key = jlib:jid_tolower(JID),
+ Key = jlib:short_prepd_jid(JID),
Now = now_to_usec(now()),
Activity1 = clean_treap(StateData#state.activity, {1, -Now}),
Activity =
@@ -1334,7 +1353,7 @@ prepare_room_queue(StateData) ->
{{value, {message, From}}, _RoomQueue} ->
Activity = get_user_activity(From, StateData),
Packet = Activity#activity.message,
- Size = lists:flatlength(xml:element_to_string(Packet)),
+ Size = erlang:iolist_size(exmpp_xml:document_to_iolist(Packet)),
{RoomShaper, RoomShaperInterval} =
shaper:update(StateData#state.room_shaper, Size),
erlang:send_after(
@@ -1345,7 +1364,7 @@ prepare_room_queue(StateData) ->
{{value, {presence, From}}, _RoomQueue} ->
Activity = get_user_activity(From, StateData),
{_Nick, Packet} = Activity#activity.presence,
- Size = lists:flatlength(xml:element_to_string(Packet)),
+ Size = erlang:iolist_size(exmpp_xml:document_to_iolist(Packet)),
{RoomShaper, RoomShaperInterval} =
shaper:update(StateData#state.room_shaper, Size),
erlang:send_after(
@@ -1359,7 +1378,7 @@ prepare_room_queue(StateData) ->
add_online_user(JID, Nick, Role, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
Users = ?DICT:store(LJID,
#user{jid = JID,
nick = Nick,
@@ -1370,10 +1389,10 @@ add_online_user(JID, Nick, Role, StateData) ->
StateData#state{users = Users}.
remove_online_user(JID, StateData) ->
- remove_online_user(JID, StateData, "").
+ remove_online_user(JID, StateData, <<>>).
remove_online_user(JID, StateData, Reason) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
{ok, #user{nick = Nick}} =
?DICT:find(LJID, StateData#state.users),
add_to_log(leave, {Nick, Reason}, StateData),
@@ -1382,34 +1401,31 @@ remove_online_user(JID, StateData, Reason) ->
StateData#state{users = Users}.
-filter_presence({xmlelement, "presence", Attrs, Els}) ->
+filter_presence(#xmlel{name = 'presence'} = Packet) ->
FEls = lists:filter(
fun(El) ->
- case El of
- {xmlcdata, _} ->
- false;
- {xmlelement, _Name1, Attrs1, _Els1} ->
- XMLNS = xml:get_attr_s("xmlns", Attrs1),
- case XMLNS of
- ?NS_MUC ++ _ ->
+ case El of
+ #xmlel{ns = XMLNS} ->
+ case atom_to_list(XMLNS) of
+ ?NS_MUC_s ++ _ ->
false;
_ ->
true
end
end
- end, Els),
- {xmlelement, "presence", Attrs, FEls}.
+ end, exmpp_xml:get_child_elements(Packet)),
+ exmpp_xml:set_children(Packet, FEls).
-strip_status({xmlelement, "presence", Attrs, Els}) ->
+strip_status(#xmlel{name = 'presence', children = Children} = Packet) ->
FEls = lists:filter(
- fun({xmlelement, "status", _Attrs1, _Els1}) ->
+ fun(#xmlel{name = 'status'}) ->
false;
(_) -> true
- end, Els),
- {xmlelement, "presence", Attrs, FEls}.
+ end, Children),
+ exmpp_xml:set_children(Packet,FEls).
add_user_presence(JID, Presence, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
FPresence = filter_presence(Presence),
Users =
?DICT:update(
@@ -1420,7 +1436,7 @@ add_user_presence(JID, Presence, StateData) ->
StateData#state{users = Users}.
add_user_presence_un(JID, Presence, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
FPresence = filter_presence(Presence),
Users =
?DICT:update(
@@ -1446,9 +1462,9 @@ find_jid_by_nick(Nick, StateData) ->
end, false, StateData#state.users).
is_nick_change(JID, Nick, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
case Nick of
- "" ->
+ <<>> ->
false;
_ ->
{ok, #user{nick = OldNick}} =
@@ -1456,8 +1472,8 @@ is_nick_change(JID, Nick, StateData) ->
Nick /= OldNick
end.
-add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) ->
- Lang = xml:get_attr_s("xml:lang", Attrs),
+add_new_user(From, Nick, Packet, StateData) ->
+ Lang = exmpp_stanza:get_lang(Packet),
MaxUsers = get_max_users(StateData),
MaxAdminUsers = MaxUsers + get_max_users_admin_threshold(StateData),
NUsers = dict:fold(fun(_, _, Acc) -> Acc + 1 end, 0,
@@ -1479,60 +1495,70 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) ->
get_default_role(Affiliation, StateData)} of
{false, _, _, _} ->
% max user reached and user is not admin or owner
- Err = jlib:make_error_reply(
+ Err = exmpp_stanza:reply_with_error(
Packet,
- ?ERR_SERVICE_UNAVAILABLE),
+ 'service-unavailable'),
ejabberd_router:route( % TODO: s/Nick/""/
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
From, Err),
StateData;
{_, _, _, none} ->
- Err = jlib:make_error_reply(
+ Err = exmpp_stanza:reply_with_error(
Packet,
case Affiliation of
outcast ->
ErrText = "You have been banned from this room",
- ?ERRT_FORBIDDEN(Lang, ErrText);
+ exmpp_stanza:error(Packet#xmlel.ns,
+ 'forbidden',
+ {Lang, translate:translate(Lang, ErrText)});
_ ->
ErrText = "Membership is required to enter this room",
- ?ERRT_REGISTRATION_REQUIRED(Lang, ErrText)
+ exmpp_stanza:error(Packet#xmlel.ns,
+ 'registration-required',
+ {Lang, translate:translate(Lang, ErrText)})
end),
ejabberd_router:route( % TODO: s/Nick/""/
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
From, Err),
StateData;
{_, true, _, _} ->
ErrText = "That nickname is already in use by another occupant",
- Err = jlib:make_error_reply(Packet, ?ERRT_CONFLICT(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ exmpp_stanza:error(Packet#xmlel.ns,
+ 'conflict',
+ {Lang, translate:translate(Lang, ErrText)})),
ejabberd_router:route(
% TODO: s/Nick/""/
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
From, Err),
StateData;
{_, _, false, _} ->
ErrText = "That nickname is registered by another person",
- Err = jlib:make_error_reply(Packet, ?ERRT_CONFLICT(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ ?ERR(Packet, 'conflict', Lang, ErrText)),
ejabberd_router:route(
% TODO: s/Nick/""/
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
From, Err),
StateData;
{_, _, _, Role} ->
case check_password(ServiceAffiliation, Affiliation,
- Els, From, StateData) of
+ exmpp_xml:get_child_elements(Packet), From,
+ StateData) of
true ->
NewState =
add_user_presence(
From, Packet,
add_online_user(From, Nick, Role, StateData)),
if not (NewState#state.config)#config.anonymous ->
- WPacket = {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "body", [],
- [{xmlcdata, translate:translate(
- Lang,
- "This room is not anonymous")}]},
- {xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "status", [{"code", "100"}], []}]}]},
+ WPacket =
+ #xmlel{name = 'message',
+ attrs = [?XMLATTR('type', <<"groupchat">>)],
+ children = [
+ #xmlel{name = 'body',
+ children = [#xmlcdata{cdata =
+ translate:translate(Lang,
+ "This room is not anonymous")}]}]},
ejabberd_router:route(
StateData#state.jid,
From, WPacket);
@@ -1541,7 +1567,9 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) ->
end,
send_existing_presences(From, NewState),
send_new_presence(From, NewState),
- Shift = count_stanza_shift(Nick, Els, NewState),
+ Shift = count_stanza_shift(Nick,
+ exmpp_xml:get_child_elements(Packet),
+ NewState),
case send_history(From, Shift, NewState) of
true ->
ok;
@@ -1557,18 +1585,18 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) ->
end;
nopass ->
ErrText = "A password is required to enter this room",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_AUTHORIZED(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(
+ Packet, ?ERR(Packet, 'not-authorized', Lang, ErrText)),
ejabberd_router:route( % TODO: s/Nick/""/
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid, Nick),
From, Err),
StateData;
captcha_required ->
ID = randoms:get_string(),
- SID = xml:get_attr_s("id", Attrs),
+ SID = case exmpp_stanza:get_id(Packet) of undefined -> ""; SID1 -> SID1 end,
RoomJID = StateData#state.jid,
- To = jlib:jid_replace_resource(RoomJID, Nick),
+ To = jid_replace_resource(RoomJID, Nick),
case ejabberd_captcha:create_captcha(
ID, SID, RoomJID, To, Lang, From) of
{ok, CaptchaEls} ->
@@ -1579,20 +1607,20 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) ->
StateData#state{robots = Robots};
error ->
ErrText = "Unable to generate a captcha",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_INTERNAL_SERVER_ERROR(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(
+ Packet, ?ERR(Packet, 'internal-server-error', Lang, ErrText)),
ejabberd_router:route( % TODO: s/Nick/""/
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid, Nick),
From, Err),
StateData
end;
_ ->
ErrText = "Incorrect password",
- Err = jlib:make_error_reply(
- Packet, ?ERRT_NOT_AUTHORIZED(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(
+ Packet, ?ERR(Packet, 'not-authorized', Lang, ErrText)),
ejabberd_router:route( % TODO: s/Nick/""/
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid, Nick),
From, Err),
StateData
@@ -1637,14 +1665,14 @@ check_captcha(Affiliation, From, StateData) ->
extract_password([]) ->
false;
-extract_password([{xmlelement, _Name, Attrs, _SubEls} = El | Els]) ->
- case xml:get_attr_s("xmlns", Attrs) of
+extract_password([#xmlel{ns = XMLNS} = El | Els]) ->
+ case XMLNS of
?NS_MUC ->
- case xml:get_subtag(El, "password") of
- false ->
+ case exmpp_xml:get_element(El, 'password') of
+ undefined ->
false;
SubEl ->
- xml:get_tag_cdata(SubEl)
+ exmpp_xml:get_cdata(SubEl)
end;
_ ->
extract_password(Els)
@@ -1733,11 +1761,11 @@ calc_shift(MaxSize, Size, Shift, [S | TSizes]) ->
extract_history([], _Type) ->
false;
-extract_history([{xmlelement, _Name, Attrs, _SubEls} = El | Els], Type) ->
- case xml:get_attr_s("xmlns", Attrs) of
+extract_history([#xmlel{ns = XMLNS} = El | Els], Type) ->
+ case XMLNS of
?NS_MUC ->
- AttrVal = xml:get_path_s(El,
- [{elem, "history"}, {attr, Type}]),
+ AttrVal = exmpp_xml:get_path(El,
+ [{element, 'history'}, {attribute, Type,""}]),
case Type of
"since" ->
case jlib:datetime_string_to_timestamp(AttrVal) of
@@ -1762,12 +1790,12 @@ extract_history([_ | Els], Type) ->
send_update_presence(JID, StateData) ->
- send_update_presence(JID, "", StateData).
+ send_update_presence(JID, <<>>, StateData).
send_update_presence(JID, Reason, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
LJIDs = case LJID of
- {U, S, ""} ->
+ {U, S, undefined} ->
?DICT:fold(
fun(J, _, Js) ->
case J of
@@ -1790,56 +1818,58 @@ send_update_presence(JID, Reason, StateData) ->
end, LJIDs).
send_new_presence(NJID, StateData) ->
- send_new_presence(NJID, "", StateData).
+ send_new_presence(NJID, <<>>, StateData).
send_new_presence(NJID, Reason, StateData) ->
{ok, #user{jid = RealJID,
nick = Nick,
role = Role,
last_presence = Presence}} =
- ?DICT:find(jlib:jid_tolower(NJID), StateData#state.users),
+ ?DICT:find(jlib:short_prepd_jid(NJID), StateData#state.users),
Affiliation = get_affiliation(NJID, StateData),
- SAffiliation = affiliation_to_list(Affiliation),
- SRole = role_to_list(Role),
+ SAffiliation = affiliation_to_binary(Affiliation),
+ SRole = role_to_binary(Role),
lists:foreach(
fun({_LJID, Info}) ->
ItemAttrs =
case (Info#user.role == moderator) orelse
((StateData#state.config)#config.anonymous == false) of
true ->
- [{"jid", jlib:jid_to_string(RealJID)},
- {"affiliation", SAffiliation},
- {"role", SRole}];
+ [?XMLATTR('jid', exmpp_jid:to_binary(RealJID)),
+ ?XMLATTR('affiliation', SAffiliation),
+ ?XMLATTR('role', SRole)];
_ ->
- [{"affiliation", SAffiliation},
- {"role", SRole}]
+ [?XMLATTR('affiliation', SAffiliation),
+ ?XMLATTR('role', SRole)]
end,
ItemEls = case Reason of
- "" ->
+ <<>> ->
[];
_ ->
- [{xmlelement, "reason", [],
- [{xmlcdata, Reason}]}]
+ [#xmlel{name = 'reason',
+ children = [#xmlcdata{cdata = Reason}]}]
end,
Status = case StateData#state.just_created of
true ->
- [{xmlelement, "status", [{"code", "201"}], []}];
+ [#xmlel{name = 'status',
+ attrs = [?XMLATTR('code', <<"201">>)]}];
false ->
[]
end,
- Packet = xml:append_subtags(
- Presence,
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item", ItemAttrs, ItemEls} | Status]}]),
+ Packet = exmpp_xml:append_child(Presence,
+ #xmlel{ns = ?NS_MUC_USER, name = 'x',
+ children = [#xmlel{ns = ?NS_MUC_USER, name ='item',
+ attrs = ItemAttrs,
+ children = ItemEls} | Status]}),
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
Info#user.jid,
Packet)
end, ?DICT:to_list(StateData#state.users)).
send_existing_presences(ToJID, StateData) ->
- LToJID = jlib:jid_tolower(ToJID),
+ LToJID = jlib:short_prepd_jid(ToJID),
{ok, #user{jid = RealToJID,
role = Role}} =
?DICT:find(LToJID, StateData#state.users),
@@ -1853,27 +1883,29 @@ send_existing_presences(ToJID, StateData) ->
FromJID ->
ok;
_ ->
- FromAffiliation = get_affiliation(LJID, StateData),
+ {N,D,R} = LJID,
+ FromAffiliation = get_affiliation(exmpp_jid:make(N,D,R),
+ StateData),
ItemAttrs =
case (Role == moderator) orelse
((StateData#state.config)#config.anonymous ==
false) of
true ->
- [{"jid", jlib:jid_to_string(FromJID)},
- {"affiliation",
- affiliation_to_list(FromAffiliation)},
- {"role", role_to_list(FromRole)}];
+ [?XMLATTR('jid', exmpp_jid:to_binary(FromJID)),
+ ?XMLATTR('affiliation',
+ affiliation_to_binary(FromAffiliation)),
+ ?XMLATTR('role', role_to_binary(FromRole))];
_ ->
- [{"affiliation",
- affiliation_to_list(FromAffiliation)},
- {"role", role_to_list(FromRole)}]
+ [?XMLATTR('affiliation',
+ affiliation_to_binary(FromAffiliation)),
+ ?XMLATTR('role', role_to_binary(FromRole))]
end,
- Packet = xml:append_subtags(
- Presence,
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item", ItemAttrs, []}]}]),
+ Packet = exmpp_xml:append_child(Presence,
+ #xmlel{ns = ?NS_MUC_USER, name = 'x',
+ children = [#xmlel{ns = ?NS_MUC_USER, name ='item',
+ attrs = ItemAttrs}]}),
ejabberd_router:route(
- jlib:jid_replace_resource(
+ jid_replace_resource(
StateData#state.jid, FromNick),
RealToJID,
Packet)
@@ -1881,12 +1913,13 @@ send_existing_presences(ToJID, StateData) ->
end, ?DICT:to_list(StateData#state.users)).
+
now_to_usec({MSec, Sec, USec}) ->
(MSec*1000000 + Sec)*1000000 + USec.
change_nick(JID, Nick, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
{ok, #user{nick = OldNick}} =
?DICT:find(LJID, StateData#state.users),
Users =
@@ -1905,51 +1938,61 @@ send_nick_changing(JID, OldNick, StateData) ->
nick = Nick,
role = Role,
last_presence = Presence}} =
- ?DICT:find(jlib:jid_tolower(JID), StateData#state.users),
+ ?DICT:find(jlib:short_prepd_jid(JID), StateData#state.users),
Affiliation = get_affiliation(JID, StateData),
- SAffiliation = affiliation_to_list(Affiliation),
- SRole = role_to_list(Role),
+ SAffiliation = affiliation_to_binary(Affiliation),
+ SRole = role_to_binary(Role),
lists:foreach(
fun({_LJID, Info}) ->
ItemAttrs1 =
case (Info#user.role == moderator) orelse
((StateData#state.config)#config.anonymous == false) of
true ->
- [{"jid", jlib:jid_to_string(RealJID)},
- {"affiliation", SAffiliation},
- {"role", SRole},
- {"nick", Nick}];
+ [?XMLATTR('jid', exmpp_jid:to_binary(RealJID)),
+ ?XMLATTR('affiliation', SAffiliation),
+ ?XMLATTR('role', SRole),
+ ?XMLATTR('nick', Nick)];
_ ->
- [{"affiliation", SAffiliation},
- {"role", SRole},
- {"nick", Nick}]
+ [?XMLATTR('affiliation', SAffiliation),
+ ?XMLATTR('role', SRole),
+ ?XMLATTR('nick', Nick)]
end,
ItemAttrs2 =
case (Info#user.role == moderator) orelse
((StateData#state.config)#config.anonymous == false) of
true ->
- [{"jid", jlib:jid_to_string(RealJID)},
- {"affiliation", SAffiliation},
- {"role", SRole}];
+ [?XMLATTR('jid', exmpp_jid:to_binary(RealJID)),
+ ?XMLATTR('affiliation', SAffiliation),
+ ?XMLATTR('role', SRole)];
_ ->
- [{"affiliation", SAffiliation},
- {"role", SRole}]
+ [?XMLATTR('affiliation', SAffiliation),
+ ?XMLATTR('role', SRole)]
end,
Packet1 =
- {xmlelement, "presence", [{"type", "unavailable"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item", ItemAttrs1, []},
- {xmlelement, "status", [{"code", "303"}], []}]}]},
- Packet2 = xml:append_subtags(
+ #xmlel{ns = ?NS_JABBER_CLIENT,
+ name = 'presence',
+ attrs = [?XMLATTR('type', <<"unavailable">>)],
+ children = [#xmlel{ns = ?NS_MUC_USER, name = 'x',
+ children = [
+ #xmlel{ns = ?NS_MUC_USER, name = 'item',
+ attrs = ItemAttrs1},
+ #xmlel{ns = ?NS_MUC_USER, name = 'status',
+ attrs = [?XMLATTR('code',
+ <<"303">>)]}]}]},
+
+ Packet2 = exmpp_xml:append_child(
Presence,
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item", ItemAttrs2, []}]}]),
+ #xmlel{ns = ?NS_MUC_USER, name = 'x',
+ children =[#xmlel{ns = ?NS_MUC_USER,
+ name = 'item',
+ attrs = ItemAttrs2}]}),
+
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, OldNick),
+ jid_replace_resource(StateData#state.jid, OldNick),
Info#user.jid,
Packet1),
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
Info#user.jid,
Packet2)
end, ?DICT:to_list(StateData#state.users)).
@@ -1985,12 +2028,7 @@ lqueue_to_list(#lqueue{queue = Q1}) ->
add_message_to_history(FromNick, FromJID, Packet, StateData) ->
- HaveSubject = case xml:get_subtag(Packet, "subject") of
- false ->
- false;
- _ ->
- true
- end,
+ HaveSubject = exmpp_xml:has_element(Packet, 'subject'),
TimeStamp = calendar:now_to_universal_time(now()),
%% Chatroom history is stored as XMPP packets, so
%% the decision to include the original sender's JID or not is based on the
@@ -2000,15 +2038,16 @@ add_message_to_history(FromNick, FromJID, Packet, StateData) ->
true -> StateData#state.jid;
false -> FromJID
end,
- TSPacket = xml:append_subtags(Packet,
+ TSPacket = exmpp_xml:append_children(Packet,
[jlib:timestamp_to_xml(TimeStamp, utc, SenderJid, ""),
%% TODO: Delete the next line once XEP-0091 is Obsolete
jlib:timestamp_to_xml(TimeStamp)]),
- SPacket = jlib:replace_from_to(
- jlib:jid_replace_resource(StateData#state.jid, FromNick),
- StateData#state.jid,
- TSPacket),
- Size = lists:flatlength(xml:element_to_string(SPacket)),
+ SPacket = exmpp_stanza:set_recipient(
+ exmpp_stanza:set_sender(TSPacket,
+ jid_replace_resource(StateData#state.jid, FromNick)),
+ StateData#state.jid),
+
+ Size = erlang:iolist_size(exmpp_xml:document_to_iolist(SPacket)),
Q1 = lqueue_in({FromNick, TSPacket, HaveSubject, TimeStamp, Size},
StateData#state.history),
add_to_log(text, {FromNick, Packet}, StateData),
@@ -2018,7 +2057,7 @@ send_history(JID, Shift, StateData) ->
lists:foldl(
fun({Nick, Packet, HaveSubject, _TimeStamp, _Size}, B) ->
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
JID,
Packet),
B or HaveSubject
@@ -2027,18 +2066,13 @@ send_history(JID, Shift, StateData) ->
send_subject(JID, Lang, StateData) ->
case StateData#state.subject_author of
- "" ->
+ <<>> ->
ok;
Nick ->
Subject = StateData#state.subject,
- Packet = {xmlelement, "message", [{"type", "groupchat"}],
- [{xmlelement, "subject", [], [{xmlcdata, Subject}]},
- {xmlelement, "body", [],
- [{xmlcdata,
- Nick ++
- translate:translate(Lang,
- " has set the subject to: ") ++
- Subject}]}]},
+ Packet = exmpp_message:groupchat(Subject,
+ Nick ++ translate:translate(Lang,
+ " has set the subject to: ") ++ Subject),
ejabberd_router:route(
StateData#state.jid,
JID,
@@ -2046,11 +2080,11 @@ send_subject(JID, Lang, StateData) ->
end.
check_subject(Packet) ->
- case xml:get_subtag(Packet, "subject") of
- false ->
+ case exmpp_message:get_subject(Packet) of
+ undefined ->
false;
- SubjEl ->
- xml:get_tag_cdata(SubjEl)
+ Subj ->
+ Subj
end.
can_change_subject(Role, StateData) ->
@@ -2065,25 +2099,25 @@ can_change_subject(Role, StateData) ->
% Admin stuff
process_iq_admin(From, set, Lang, SubEl, StateData) ->
- {xmlelement, _, _, Items} = SubEl,
+ #xmlel{children = Items} = SubEl,
process_admin_items_set(From, Items, Lang, StateData);
process_iq_admin(From, get, Lang, SubEl, StateData) ->
- case xml:get_subtag(SubEl, "item") of
- false ->
- {error, ?ERR_BAD_REQUEST};
+ case exmpp_xml:get_element(SubEl, 'item') of
+ 'undefined' ->
+ {error, 'bad-request'};
Item ->
FAffiliation = get_affiliation(From, StateData),
FRole = get_role(From, StateData),
- case xml:get_tag_attr("role", Item) of
+ case exmpp_xml:get_attribute_as_binary(Item, 'role', false) of
false ->
- case xml:get_tag_attr("affiliation", Item) of
+ case exmpp_xml:get_attribute_as_binary(Item, 'affiliation', false) of
false ->
- {error, ?ERR_BAD_REQUEST};
- {value, StrAffiliation} ->
- case catch list_to_affiliation(StrAffiliation) of
+ {error, 'bad-request'};
+ StrAffiliation ->
+ case catch binary_to_affiliation(StrAffiliation) of
{'EXIT', _} ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
SAffiliation ->
if
(FAffiliation == owner) or
@@ -2093,14 +2127,14 @@ process_iq_admin(From, get, Lang, SubEl, StateData) ->
{result, Items, StateData};
true ->
ErrText = "Administrator privileges required",
- {error, ?ERRT_FORBIDDEN(Lang, ErrText)}
+ {error, ?ERR(SubEl, 'forbidden', Lang, ErrText)}
end
end
end;
- {value, StrRole} ->
- case catch list_to_role(StrRole) of
+ StrRole ->
+ case catch binary_to_role(StrRole) of
{'EXIT', _} ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
SRole ->
if
FRole == moderator ->
@@ -2108,7 +2142,7 @@ process_iq_admin(From, get, Lang, SubEl, StateData) ->
{result, Items, StateData};
true ->
ErrText = "Moderator privileges required",
- {error, ?ERRT_FORBIDDEN(Lang, ErrText)}
+ {error, ?ERR(SubEl, 'forbidden', Lang, ErrText)}
end
end
end
@@ -2124,15 +2158,22 @@ items_with_role(SRole, StateData) ->
items_with_affiliation(SAffiliation, StateData) ->
lists:map(
fun({JID, {Affiliation, Reason}}) ->
- {xmlelement, "item",
- [{"affiliation", affiliation_to_list(Affiliation)},
- {"jid", jlib:jid_to_string(JID)}],
- [{xmlelement, "reason", [], [{xmlcdata, Reason}]}]};
+ {N, D, R} = JID,
+ #xmlel{name = 'item',
+ attrs = [?XMLATTR('affiliation',
+ affiliation_to_binary(Affiliation)),
+ ?XMLATTR('jid',
+ exmpp_jid:to_binary(N, D, R))],
+ children = [ #xmlel{name = 'reason',
+ children = [#xmlcdata{cdata = Reason}]}]};
+
({JID, Affiliation}) ->
- {xmlelement, "item",
- [{"affiliation", affiliation_to_list(Affiliation)},
- {"jid", jlib:jid_to_string(JID)}],
- []}
+ {N, D, R} = JID,
+ #xmlel{name = 'item',
+ attrs = [?XMLATTR('affiliation',
+ affiliation_to_binary(Affiliation)),
+ ?XMLATTR('jid',
+ exmpp_jid:to_binary(N, D, R))]}
end, search_affiliation(SAffiliation, StateData)).
user_to_item(#user{role = Role,
@@ -2140,12 +2181,13 @@ user_to_item(#user{role = Role,
jid = JID
}, StateData) ->
Affiliation = get_affiliation(JID, StateData),
- {xmlelement, "item",
- [{"role", role_to_list(Role)},
- {"affiliation", affiliation_to_list(Affiliation)},
- {"nick", Nick},
- {"jid", jlib:jid_to_string(JID)}],
- []}.
+ #xmlel{name = 'item',
+ attrs = [
+ ?XMLATTR('role', role_to_binary(Role)),
+ ?XMLATTR('affiliation', affiliation_to_binary(Affiliation)),
+ ?XMLATTR('nick', Nick),
+ ?XMLATTR('jid', exmpp_jid:to_binary(JID))]
+ }.
search_role(Role, StateData) ->
lists:filter(
@@ -2171,17 +2213,22 @@ process_admin_items_set(UJID, Items, Lang, StateData) ->
case find_changed_items(UJID, UAffiliation, URole, Items, Lang, StateData, []) of
{result, Res} ->
?INFO_MSG("Processing MUC admin query from ~s in room ~s:~n ~p",
- [jlib:jid_to_string(UJID), jlib:jid_to_string(StateData#state.jid), Res]),
+ [exmpp_jid:to_binary(UJID), exmpp_jid:to_binary(StateData#state.jid), Res]),
NSD =
lists:foldl(
fun(E, SD) ->
case catch (
case E of
- {JID, affiliation, owner, _}
- when (JID#jid.luser == "") ->
+ {JID, affiliation, owner, _} ->
+ case exmpp_jid:prep_node(JID) of
+ <<>> ->
+ SD;
+ %% TODO: <<>> or 'undefined' ?
+ %% TODO: double case on the E var, because
+ %% exmpp_jid:prep_node/1 can't be used in guards
%% If the provided JID does not have username,
%% forget the affiliation completely
- SD;
+ _ -> case E of
{JID, role, none, Reason} ->
catch send_kickban_presence(
JID, Reason, "307", SD),
@@ -2225,6 +2272,8 @@ process_admin_items_set(UJID, Items, Lang, StateData) ->
send_update_presence(JID, SD1),
SD1
end
+ end
+ end
) of
{'EXIT', ErrReason} ->
?ERROR_MSG("MUC ITEMS SET ERR: ~p~n",
@@ -2249,27 +2298,28 @@ process_admin_items_set(UJID, Items, Lang, StateData) ->
find_changed_items(_UJID, _UAffiliation, _URole, [], _Lang, _StateData, Res) ->
{result, Res};
-find_changed_items(UJID, UAffiliation, URole, [{xmlcdata, _} | Items],
+find_changed_items(UJID, UAffiliation, URole, [#xmlcdata{} | Items],
Lang, StateData, Res) ->
find_changed_items(UJID, UAffiliation, URole, Items, Lang, StateData, Res);
find_changed_items(UJID, UAffiliation, URole,
- [{xmlelement, "item", Attrs, _Els} = Item | Items],
+ [#xmlel{name = 'item'} = Item | Items],
Lang, StateData, Res) ->
- TJID = case xml:get_attr("jid", Attrs) of
- {value, S} ->
- case jlib:string_to_jid(S) of
- error ->
+ TJID = case exmpp_xml:get_attribute_as_binary(Item, 'jid',false) of
+ S when S =/= false ->
+ try exmpp_jid:parse(S) of
+ J ->
+ {value, J}
+ catch
+ _:_ ->
ErrText = io_lib:format(
translate:translate(
Lang,
"Jabber ID ~s is invalid"), [S]),
- {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)};
- J ->
- {value, J}
+ {error, ?ERR(Item, 'not-acceptable', Lang, ErrText)}
end;
_ ->
- case xml:get_attr("nick", Attrs) of
- {value, N} ->
+ case exmpp_xml:get_attribute_as_list(Item, 'nick', false) of
+ N when N =/= false ->
case find_jid_by_nick(N, StateData) of
false ->
ErrText =
@@ -2278,25 +2328,25 @@ find_changed_items(UJID, UAffiliation, URole,
Lang,
"Nickname ~s does not exist in the room"),
[N]),
- {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)};
+ {error, ?ERR(Item, 'not-acceptable', Lang, ErrText)};
J ->
{value, J}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end
end,
case TJID of
{value, JID} ->
TAffiliation = get_affiliation(JID, StateData),
TRole = get_role(JID, StateData),
- case xml:get_attr("role", Attrs) of
+ case exmpp_xml:get_attribute_as_binary(Item, 'role',false) of
false ->
- case xml:get_attr("affiliation", Attrs) of
+ case exmpp_xml:get_attribute_as_binary(Item, 'affiliation', false) of
false ->
- {error, ?ERR_BAD_REQUEST};
- {value, StrAffiliation} ->
- case catch list_to_affiliation(StrAffiliation) of
+ {error, 'bad-request'};
+ StrAffiliation ->
+ case catch binary_to_affiliation(StrAffiliation) of
{'EXIT', _} ->
ErrText1 =
io_lib:format(
@@ -2304,7 +2354,7 @@ find_changed_items(UJID, UAffiliation, URole,
Lang,
"Invalid affiliation: ~s"),
[StrAffiliation]),
- {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText1)};
+ {error, ?ERR(Item, 'not-acceptable', Lang, ErrText1)};
SAffiliation ->
ServiceAf = get_service_affiliation(JID, StateData),
CanChangeRA =
@@ -2321,8 +2371,8 @@ find_changed_items(UJID, UAffiliation, URole,
case search_affiliation(
owner, StateData) of
[{OJID, _}] ->
- jlib:jid_remove_resource(OJID) /=
- jlib:jid_tolower(jlib:jid_remove_resource(UJID));
+ jlib:short_bare_jid(OJID) /=
+ jlib:short_prepd_bare_jid(UJID);
_ ->
true
end;
@@ -2341,19 +2391,19 @@ find_changed_items(UJID, UAffiliation, URole,
UJID,
UAffiliation, URole,
Items, Lang, StateData,
- [{jlib:jid_remove_resource(JID),
+ [{exmpp_jid:bare(JID),
affiliation,
SAffiliation,
- xml:get_path_s(
- Item, [{elem, "reason"},
+ exmpp_xml:get_path(
+ Item, [{element, 'reason'},
cdata])} | Res]);
false ->
- {error, ?ERR_NOT_ALLOWED}
+ {error, 'not-allowed'}
end
end
end;
- {value, StrRole} ->
- case catch list_to_role(StrRole) of
+ StrRole ->
+ case catch binary_to_role(StrRole) of
{'EXIT', _} ->
ErrText1 =
io_lib:format(
@@ -2361,7 +2411,7 @@ find_changed_items(UJID, UAffiliation, URole,
Lang,
"Invalid role: ~s"),
[StrRole]),
- {error, ?ERRT_BAD_REQUEST(Lang, ErrText1)};
+ {error, ?ERR(Item, 'bad-request', Lang, ErrText1)};
SRole ->
ServiceAf = get_service_affiliation(JID, StateData),
CanChangeRA =
@@ -2378,8 +2428,8 @@ find_changed_items(UJID, UAffiliation, URole,
case search_affiliation(
owner, StateData) of
[{OJID, _}] ->
- jlib:jid_remove_resource(OJID) /=
- jlib:jid_tolower(jlib:jid_remove_resource(UJID));
+ jlib:short_bare_jid(OJID) /=
+ jlib:short_prepd_bare_jid(UJID);
_ ->
true
end;
@@ -2399,11 +2449,11 @@ find_changed_items(UJID, UAffiliation, URole,
UAffiliation, URole,
Items, Lang, StateData,
[{JID, role, SRole,
- xml:get_path_s(
- Item, [{elem, "reason"},
+ exmpp_xml:get_path(
+ Item, [{element, 'reason'},
cdata])} | Res]);
_ ->
- {error, ?ERR_NOT_ALLOWED}
+ {error, 'not-allowed'}
end
end
end;
@@ -2412,7 +2462,7 @@ find_changed_items(UJID, UAffiliation, URole,
end;
find_changed_items(_UJID, _UAffiliation, _URole, _Items,
_Lang, _StateData, _Res) ->
- {error, ?ERR_BAD_REQUEST}.
+ {error, 'bad-request'}.
can_change_ra(_FAffiliation, _FRole,
@@ -2562,9 +2612,9 @@ can_change_ra(_FAffiliation, _FRole,
send_kickban_presence(JID, Reason, Code, StateData) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = jlib:short_prepd_jid(JID),
LJIDs = case LJID of
- {U, S, ""} ->
+ {U, S, undefined} ->
?DICT:fold(
fun(J, _, Js) ->
case J of
@@ -2592,27 +2642,35 @@ send_kickban_presence(JID, Reason, Code, StateData) ->
send_kickban_presence1(UJID, Reason, Code, StateData) ->
{ok, #user{jid = _RealJID,
- nick = Nick}} =
- ?DICT:find(jlib:jid_tolower(UJID), StateData#state.users),
- Affiliation = get_affiliation(UJID, StateData),
- SAffiliation = affiliation_to_list(Affiliation),
+ nick = Nick}} = ?DICT:find(UJID, StateData#state.users),
+ {N,D,R} = UJID,
+ Affiliation = get_affiliation(exmpp_jid:make(N,D,R), StateData),
+ SAffiliation = affiliation_to_binary(Affiliation),
lists:foreach(
fun({_LJID, Info}) ->
- ItemAttrs = [{"affiliation", SAffiliation},
- {"role", "none"}],
+ ItemAttrs = [?XMLATTR('affiliation', SAffiliation),
+ ?XMLATTR('role', <<"none">>)],
ItemEls = case Reason of
- "" ->
+ <<>> ->
[];
_ ->
- [{xmlelement, "reason", [],
- [{xmlcdata, Reason}]}]
- end,
- Packet = {xmlelement, "presence", [{"type", "unavailable"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item", ItemAttrs, ItemEls},
- {xmlelement, "status", [{"code", Code}], []}]}]},
+ [#xmlel{name = 'reason',
+ children = [#xmlcdata{cdata = Reason}]}]
+ end,
+ Packet =
+ #xmlel{ns = ?NS_JABBER_CLIENT,
+ name = 'presence',
+ attrs = [?XMLATTR('type', <<"unavailable">>)],
+ children = [#xmlel{ns = ?NS_MUC_USER, name = 'x',
+ children = [
+ #xmlel{ns = ?NS_MUC_USER, name = 'item',
+ attrs = ItemAttrs,
+ children = ItemEls},
+ #xmlel{ns = ?NS_MUC_USER, name = 'status',
+ attrs = [?XMLATTR('code',
+ Code)]}]}]},
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
Info#user.jid,
Packet)
end, ?DICT:to_list(StateData#state.users)).
@@ -2626,14 +2684,12 @@ process_iq_owner(From, set, Lang, SubEl, StateData) ->
FAffiliation = get_affiliation(From, StateData),
case FAffiliation of
owner ->
- {xmlelement, _Name, _Attrs, Els} = SubEl,
- case xml:remove_cdata(Els) of
- [{xmlelement, "x", _Attrs1, _Els1} = XEl] ->
- case {xml:get_tag_attr_s("xmlns", XEl),
- xml:get_tag_attr_s("type", XEl)} of
- {?NS_XDATA, "cancel"} ->
+ case exmpp_xml:get_child_elements(SubEl) of
+ [#xmlel{ns = XMLNS, name = 'x'} = XEl] ->
+ case {XMLNS, exmpp_xml:get_attribute_as_binary(XEl, 'type',false)} of
+ {?NS_DATA_FORMS, <<"cancel">>} ->
{result, [], StateData};
- {?NS_XDATA, "submit"} ->
+ {?NS_DATA_FORMS, <<"submit">>} ->
case is_allowed_log_change(XEl, StateData, From)
andalso
is_allowed_persistent_change(XEl, StateData,
@@ -2644,37 +2700,36 @@ process_iq_owner(From, set, Lang, SubEl, StateData) ->
andalso
is_password_settings_correct(XEl, StateData) of
true -> set_config(XEl, StateData);
- false -> {error, ?ERR_NOT_ACCEPTABLE}
+ false -> {error, 'not-acceptable'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
- [{xmlelement, "destroy", _Attrs1, _Els1} = SubEl1] ->
+ [#xmlel{name = 'destroy'} = SubEl1] ->
?INFO_MSG("Destroyed MUC room ~s by the owner ~s",
- [jlib:jid_to_string(StateData#state.jid), jlib:jid_to_string(From)]),
+ [exmpp_jid:to_binary(StateData#state.jid), exmpp_jid:to_binary(From)]),
destroy_room(SubEl1, StateData);
Items ->
process_admin_items_set(From, Items, Lang, StateData)
end;
_ ->
ErrText = "Owner privileges required",
- {error, ?ERRT_FORBIDDEN(Lang, ErrText)}
+ {error, ?ERR(SubEl, 'forbidden', Lang, ErrText)}
end;
process_iq_owner(From, get, Lang, SubEl, StateData) ->
FAffiliation = get_affiliation(From, StateData),
case FAffiliation of
owner ->
- {xmlelement, _Name, _Attrs, Els} = SubEl,
- case xml:remove_cdata(Els) of
+ case exmpp_xml:get_child_elements(SubEl) of
[] ->
get_config(Lang, StateData, From);
[Item] ->
- case xml:get_tag_attr("affiliation", Item) of
+ case exmpp_xml:get_attribute_as_binary(Item, 'affiliation',false) of
false ->
- {error, ?ERR_BAD_REQUEST};
- {value, StrAffiliation} ->
- case catch list_to_affiliation(StrAffiliation) of
+ {error, 'bad-request'};
+ StrAffiliation ->
+ case catch binary_to_affiliation(StrAffiliation) of
{'EXIT', _} ->
ErrText =
io_lib:format(
@@ -2682,7 +2737,7 @@ process_iq_owner(From, get, Lang, SubEl, StateData) ->
Lang,
"Invalid affiliation: ~s"),
[StrAffiliation]),
- {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)};
+ {error, ?ERR(SubEl, 'not-acceptable', Lang, ErrText)};
SAffiliation ->
Items = items_with_affiliation(
SAffiliation, StateData),
@@ -2690,11 +2745,11 @@ process_iq_owner(From, get, Lang, SubEl, StateData) ->
end
end;
_ ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}
+ {error, 'feature-not-implemented'}
end;
_ ->
ErrText = "Owner privileges required",
- {error, ?ERRT_FORBIDDEN(Lang, ErrText)}
+ {error, ?ERR(SubEl, 'forbidden', Lang, ErrText)}
end.
is_allowed_log_change(XEl, StateData, From) ->
@@ -2781,10 +2836,13 @@ is_password_settings_correct(XEl, StateData) ->
-define(XFIELD(Type, Label, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{name = 'field',
+ attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)],
+ children = [#xmlel{name = 'value',
+ children = [#xmlcdata{cdata = Val} ]}]}).
+
-define(BOOLXFIELD(Label, Var, Val),
?XFIELD("boolean", Label, Var,
@@ -2799,6 +2857,7 @@ is_password_settings_correct(XEl, StateData) ->
-define(PRIVATEXFIELD(Label, Var, Val),
?XFIELD("text-private", Label, Var, Val)).
+
get_default_room_maxusers(RoomState) ->
DefRoomOpts = gen_mod:get_module_opt(RoomState#state.server_host, mod_muc, default_room_options, []),
RoomState2 = set_opts(DefRoomOpts, RoomState),
@@ -2816,12 +2875,15 @@ get_config(Lang, StateData, From) ->
_ -> {0, "none"}
end,
Res =
- [{xmlelement, "title", [],
- [{xmlcdata, io_lib:format(translate:translate(Lang, "Configuration of room ~s"), [jlib:jid_to_string(StateData#state.jid)])}]},
- {xmlelement, "field", [{"type", "hidden"},
- {"var", "FORM_TYPE"}],
- [{xmlelement, "value", [],
- [{xmlcdata, "http://jabber.org/protocol/muc#roomconfig"}]}]},
+ [#xmlel{name = 'title', children = [ #xmlcdata{cdata =
+ io_lib:format(translate:translate(Lang, "Configuration of room ~s"),
+ [exmpp_jid:to_list(StateData#state.jid)])
+ }]},
+ #xmlel{name = 'field', attrs = [?XMLATTR('type', <<"hidden">>),
+ ?XMLATTR('var', <<"FORM_TYPE">>)],
+ children = [#xmlel{name = 'value', children = [#xmlcdata{cdata =
+ <<"http://jabber.org/protocol/muc#roomconfig">>
+ }]}]},
?STRINGXFIELD("Room title",
"muc#roomconfig_roomname",
Config#config.title),
@@ -2852,65 +2914,76 @@ get_config(Lang, StateData, From) ->
true -> Config#config.password;
false -> ""
end),
- {xmlelement, "field",
- [{"type", "list-single"},
- {"label", translate:translate(Lang, "Maximum Number of Occupants")},
- {"var", "muc#roomconfig_maxusers"}],
- [{xmlelement, "value", [], [{xmlcdata, MaxUsersRoomString}]}] ++
+ #xmlel{name = 'field', attrs = [
+ ?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('label', translate:translate(Lang,
+ "Maximum Number of Occupants")),
+ ?XMLATTR('var', <<"muc#roomconfig_maxusers">>)],
+ children = [#xmlel{name = 'value',
+ children = [#xmlcdata{cdata =
+ MaxUsersRoomString}]}] ++
if
is_integer(ServiceMaxUsers) -> [];
true ->
- [{xmlelement, "option",
- [{"label", translate:translate(Lang, "No limit")}],
- [{xmlelement, "value", [], [{xmlcdata, "none"}]}]}]
+ [#xmlel{name = 'option', attrs = [?XMLATTR('label',
+ translate:translate(Lang, "No limit"))],
+ children = [#xmlel{name = 'value', children = [#xmlcdata{
+ cdata = <<"none">>}]}]}]
end ++
- [{xmlelement, "option", [{"label", erlang:integer_to_list(N)}],
- [{xmlelement, "value", [],
- [{xmlcdata, erlang:integer_to_list(N)}]}]} ||
- N <- lists:usort([ServiceMaxUsers, DefaultRoomMaxUsers, MaxUsersRoomInteger |
- ?MAX_USERS_DEFAULT_LIST]), N =< ServiceMaxUsers]
- },
- {xmlelement, "field",
- [{"type", "list-single"},
- {"label", translate:translate(Lang, "Present real Jabber IDs to")},
- {"var", "muc#roomconfig_whois"}],
- [{xmlelement, "value", [], [{xmlcdata,
- if Config#config.anonymous ->
- "moderators";
- true ->
- "anyone"
- end}]},
- {xmlelement, "option", [{"label", translate:translate(Lang, "moderators only")}],
- [{xmlelement, "value", [], [{xmlcdata, "moderators"}]}]},
- {xmlelement, "option", [{"label", translate:translate(Lang, "anyone")}],
- [{xmlelement, "value", [], [{xmlcdata, "anyone"}]}]}]},
- ?BOOLXFIELD("Make room members-only",
- "muc#roomconfig_membersonly",
- Config#config.members_only),
- ?BOOLXFIELD("Make room moderated",
- "muc#roomconfig_moderatedroom",
- Config#config.moderated),
- ?BOOLXFIELD("Default users as participants",
- "members_by_default",
- Config#config.members_by_default),
- ?BOOLXFIELD("Allow users to change the subject",
- "muc#roomconfig_changesubject",
- Config#config.allow_change_subj),
- ?BOOLXFIELD("Allow users to send private messages",
- "allow_private_messages",
- Config#config.allow_private_messages),
- ?BOOLXFIELD("Allow users to query other users",
- "allow_query_users",
- Config#config.allow_query_users),
- ?BOOLXFIELD("Allow users to send invites",
- "muc#roomconfig_allowinvites",
- Config#config.allow_user_invites),
- ?BOOLXFIELD("Allow visitors to send status text in presence updates",
- "muc#roomconfig_allowvisitorstatus",
- Config#config.allow_visitor_status),
- ?BOOLXFIELD("Allow visitors to change nickname",
- "muc#roomconfig_allowvisitornickchange",
- Config#config.allow_visitor_nickchange)
+ [#xmlel{name = 'option', attrs = [?XMLATTR('label', N)],
+ children = [#xmlel{name = 'value', children = [
+ #xmlcdata{cdata = erlang:integer_to_list(N)}]}]} ||
+ N <- lists:usort([ServiceMaxUsers, DefaultRoomMaxUsers, MaxUsersRoomInteger |
+ ?MAX_USERS_DEFAULT_LIST]), N =< ServiceMaxUsers]},
+ #xmlel{name = 'field', attrs = [
+ ?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('label',
+ translate:translate(Lang, "Present real Jabber IDs to")),
+ ?XMLATTR('var', <<"muc#roomconfig_whois">>)],
+ children = [#xmlel{name = 'value',
+ children = [#xmlcdata{cdata =
+ if Config#config.anonymous -> <<"moderators">>;
+ true -> <<"anyone">>
+ end}]},
+ #xmlel{name = 'option', attrs = [
+ ?XMLATTR('label',
+ translate:translate(Lang, "moderators only"))],
+ children = [#xmlel{name = 'value',
+ children = [#xmlcdata{cdata =
+ <<"moderators">>}]}]},
+ #xmlel{name = 'option', attrs = [
+ ?XMLATTR('label',
+ translate:translate(Lang, "anyone"))],
+ children = [#xmlel{name = 'value',
+ children = [#xmlcdata{cdata =
+ <<"anyone">>}]}]}]},
+ ?BOOLXFIELD("Make room members-only",
+ "muc#roomconfig_membersonly",
+ Config#config.members_only),
+ ?BOOLXFIELD("Make room moderated",
+ "muc#roomconfig_moderatedroom",
+ Config#config.moderated),
+ ?BOOLXFIELD("Default users as participants",
+ "members_by_default",
+ Config#config.members_by_default),
+ ?BOOLXFIELD("Allow users to change the subject",
+ "muc#roomconfig_changesubject",
+ Config#config.allow_change_subj),
+ ?BOOLXFIELD("Allow users to send private messages",
+ "allow_private_messages",
+ Config#config.allow_private_messages),
+ ?BOOLXFIELD("Allow users to query other users",
+ "allow_query_users",
+ Config#config.allow_query_users),
+ ?BOOLXFIELD("Allow users to send invites",
+ "muc#roomconfig_allowinvites",
+ Config#config.allow_user_invites),
+ ?BOOLXFIELD("Allow visitors to send status text in presence updates",
+ "muc#roomconfig_allowvisitorstatus",
+ Config#config.allow_visitor_status),
+ ?BOOLXFIELD("Allow visitors to change nickname",
+ "muc#roomconfig_allowvisitornickchange",
+ Config#config.allow_visitor_nickchange)
] ++
case ejabberd_captcha:is_feature_available() of
true ->
@@ -2920,7 +2993,7 @@ get_config(Lang, StateData, From) ->
false -> []
end ++
case mod_muc_log:check_access_log(
- StateData#state.server_host, From) of
+ StateData#state.server_host, From) of
allow ->
[?BOOLXFIELD(
"Enable logging",
@@ -2928,14 +3001,13 @@ get_config(Lang, StateData, From) ->
Config#config.logging)];
_ -> []
end,
- {result, [{xmlelement, "instructions", [],
- [{xmlcdata,
- translate:translate(
- Lang, "You need an x:data capable client to configure room")}]},
- {xmlelement, "x", [{"xmlns", ?NS_XDATA},
- {"type", "form"}],
- Res}],
- StateData}.
+ {result , [#xmlel{name = 'instructions', children = [
+ #xmlcdata{cdata = translate:translate(Lang,
+ "You need an x:data capable client to configure room")}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'x',
+ attrs = [?XMLATTR('type', <<"form">>)],
+ children = Res}],
+ StateData}.
@@ -2943,7 +3015,7 @@ set_config(XEl, StateData) ->
XData = jlib:parse_xdata_submit(XEl),
case XData of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
_ ->
case set_xoption(XData, StateData#state.config) of
#config{} = Config ->
@@ -2973,7 +3045,7 @@ set_config(XEl, StateData) ->
"false" -> set_xoption(Opts, Config#config{Opt = false});
"1" -> set_xoption(Opts, Config#config{Opt = true});
"true" -> set_xoption(Opts, Config#config{Opt = true});
- _ -> {error, ?ERR_BAD_REQUEST}
+ _ -> {error, 'bad-request'}
end).
-define(SET_NAT_XOPT(Opt, Val),
@@ -2982,7 +3054,7 @@ set_config(XEl, StateData) ->
I > 0 ->
set_xoption(Opts, Config#config{Opt = I});
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end).
-define(SET_STRING_XOPT(Opt, Val),
@@ -3034,7 +3106,7 @@ set_xoption([{"muc#roomconfig_whois", [Val]} | Opts], Config) ->
"anyone" ->
?SET_BOOL_XOPT(anonymous, "0");
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
set_xoption([{"muc#roomconfig_maxusers", [Val]} | Opts], Config) ->
case Val of
@@ -3049,7 +3121,7 @@ set_xoption([{"FORM_TYPE", _} | Opts], Config) ->
%% Ignore our FORM_TYPE
set_xoption(Opts, Config);
set_xoption([_ | _Opts], _Config) ->
- {error, ?ERR_BAD_REQUEST}.
+ {error, 'bad-request'}.
change_config(Config, StateData) ->
@@ -3169,13 +3241,18 @@ destroy_room(DEl, StateData) ->
lists:foreach(
fun({_LJID, Info}) ->
Nick = Info#user.nick,
- ItemAttrs = [{"affiliation", "none"},
- {"role", "none"}],
- Packet = {xmlelement, "presence", [{"type", "unavailable"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
- [{xmlelement, "item", ItemAttrs, []}, DEl]}]},
+ ItemAttrs = [?XMLATTR('affiliation', <<"none">>),
+ ?XMLATTR('role', <<"none">>)],
+ Packet = #xmlel{ns = ?NS_JABBER_CLIENT,
+ name = 'presence',
+ attrs = [?XMLATTR('type',
+ <<"unavailable">>)],
+ children = [
+ #xmlel{ns = ?NS_MUC_USER, name = 'x', children =
+ [#xmlel{name = 'item', attrs = ItemAttrs},
+ DEl]}]},
ejabberd_router:route(
- jlib:jid_replace_resource(StateData#state.jid, Nick),
+ jid_replace_resource(StateData#state.jid, Nick),
Info#user.jid,
Packet)
end, ?DICT:to_list(StateData#state.users)),
@@ -3193,7 +3270,8 @@ destroy_room(DEl, StateData) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Disco
--define(FEATURE(Var), {xmlelement, "feature", [{"var", Var}], []}).
+-define(FEATURE(Var), #xmlel{name = 'feature',
+ attrs = [?XMLATTR('var', Var)]}).
-define(CONFIG_OPT_TO_FEATURE(Opt, Fiftrue, Fiffalse),
case Opt of
@@ -3204,16 +3282,19 @@ destroy_room(DEl, StateData) ->
end).
process_iq_disco_info(_From, set, _Lang, _StateData) ->
- {error, ?ERR_NOT_ALLOWED};
+ {error, 'not-allowed'};
process_iq_disco_info(_From, get, Lang, StateData) ->
Config = StateData#state.config,
- {result, [{xmlelement, "identity",
- [{"category", "conference"},
- {"type", "text"},
- {"name", get_title(StateData)}], []},
- {xmlelement, "feature",
- [{"var", ?NS_MUC}], []},
+ {result, [ #xmlel{name = 'identity',
+ attrs = [?XMLATTR('category',
+ <<"conference">>),
+ ?XMLATTR('type', <<"text">>),
+ ?XMLATTR('name',
+ get_title(StateData))]},
+ #xmlel{name = 'feature',
+ attrs = [?XMLATTR('var', ?NS_MUC_s)]},
+
?CONFIG_OPT_TO_FEATURE(Config#config.public,
"muc_public", "muc_hidden"),
?CONFIG_OPT_TO_FEATURE(Config#config.persistent,
@@ -3229,18 +3310,24 @@ process_iq_disco_info(_From, get, Lang, StateData) ->
] ++ iq_disco_info_extras(Lang, StateData), StateData}.
-define(RFIELDT(Type, Var, Val),
- {xmlelement, "field", [{"type", Type}, {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('var', Var)],
+ children = [#xmlel{name = 'value',
+ children = [#xmlcdata{cdata = Val}]}]}).
-define(RFIELD(Label, Var, Val),
- {xmlelement, "field", [{"label", translate:translate(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{name = 'field', attrs = [?XMLATTR('label',
+ translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)],
+ children = [#xmlel{name = 'value', children = [
+ #xmlcdata{cdata = Val}]}]}).
iq_disco_info_extras(Lang, StateData) ->
Len = length(?DICT:to_list(StateData#state.users)),
RoomDescription = (StateData#state.config)#config.description,
- [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x',
+ attrs = [?XMLATTR('type', <<"result">>)],
+ children =
[?RFIELDT("hidden", "FORM_TYPE",
"http://jabber.org/protocol/muc#roominfo"),
?RFIELD("Room description", "muc#roominfo_description",
@@ -3250,7 +3337,7 @@ iq_disco_info_extras(Lang, StateData) ->
]}].
process_iq_disco_items(_From, set, _Lang, _StateData) ->
- {error, ?ERR_NOT_ALLOWED};
+ {error, 'not-allowed'};
process_iq_disco_items(From, get, _Lang, StateData) ->
FAffiliation = get_affiliation(From, StateData),
@@ -3264,34 +3351,35 @@ process_iq_disco_items(From, get, _Lang, StateData) ->
lists:map(
fun({_LJID, Info}) ->
Nick = Info#user.nick,
- {xmlelement, "item",
- [{"jid", jlib:jid_to_string(
- {StateData#state.room,
- StateData#state.host,
- Nick})},
- {"name", Nick}], []}
+ #xmlel{name = 'item', attrs = [?XMLATTR('jid',
+ exmpp_jid:to_binary(
+ StateData#state.room,
+ StateData#state.host,
+ Nick)),
+ ?XMLATTR('name',
+ Nick)]}
end,
?DICT:to_list(StateData#state.users)),
{result, UList, StateData};
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end.
process_iq_captcha(_From, get, _Lang, _SubEl, _StateData) ->
- {error, ?ERR_NOT_ALLOWED};
+ {error, 'not-allowed'};
process_iq_captcha(_From, set, _Lang, SubEl, StateData) ->
case ejabberd_captcha:process_reply(SubEl) of
ok ->
{result, [], StateData};
_ ->
- {error, ?ERR_NOT_ACCEPTABLE}
+ {error, 'not-acceptable'}
end.
get_title(StateData) ->
case (StateData#state.config)#config.title of
"" ->
- StateData#state.room;
+ binary_to_list(StateData#state.room);
Name ->
Name
end.
@@ -3304,72 +3392,72 @@ check_invitation(From, Els, Lang, StateData) ->
FAffiliation = get_affiliation(From, StateData),
CanInvite = (StateData#state.config)#config.allow_user_invites
orelse (FAffiliation == admin) orelse (FAffiliation == owner),
- InviteEl = case xml:remove_cdata(Els) of
- [{xmlelement, "x", _Attrs1, Els1} = XEl] ->
- case xml:get_tag_attr_s("xmlns", XEl) of
- ?NS_MUC_USER ->
- ok;
- _ ->
- throw({error, ?ERR_BAD_REQUEST})
- end,
- case xml:remove_cdata(Els1) of
- [{xmlelement, "invite", _Attrs2, _Els2} = InviteEl1] ->
- InviteEl1;
- _ ->
- throw({error, ?ERR_BAD_REQUEST})
- end;
- _ ->
- throw({error, ?ERR_BAD_REQUEST})
- end,
- JID = case jlib:string_to_jid(
- xml:get_tag_attr_s("to", InviteEl)) of
- error ->
- throw({error, ?ERR_JID_MALFORMED});
- JID1 ->
- JID1
- end,
+ InviteEl = case Els of
+ [#xmlel{ns = XMLNS, name = 'x'} = XEl] ->
+ case XMLNS of
+ ?NS_MUC_USER -> ok;
+ _ -> throw({error, 'bad-request'})
+ end,
+ case exmpp_xml:get_child_elements(XEl) of
+ [#xmlel{name = 'invite'} = InviteEl1] ->
+ InviteEl1;
+ _ ->
+ throw({error, 'bad-request'})
+ end;
+ _ ->
+ throw({error, 'bad-request'})
+ end,
+ JID = try exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(InviteEl,
+ 'to',
+ false)) of
+ JID1 -> JID1
+ catch
+ _:_ ->
+ throw({error, 'jid-malformed'})
+ end,
case CanInvite of
false ->
- throw({error, ?ERR_NOT_ALLOWED});
+ throw({error, 'not-allowed'});
true ->
Reason =
- xml:get_path_s(
+ exmpp_xml:get_path(
InviteEl,
- [{elem, "reason"}, cdata]),
+ [{element, 'reason'}, cdata]),
ContinueEl =
- case xml:get_path_s(
+ case exmpp_xml:get_path(
InviteEl,
- [{elem, "continue"}]) of
- [] -> [];
+ [{element, 'continue'}]) of
+ 'undefined' -> [];
Continue1 -> [Continue1]
end,
IEl =
- [{xmlelement, "invite",
- [{"from",
- jlib:jid_to_string(From)}],
- [{xmlelement, "reason", [],
- [{xmlcdata, Reason}]}] ++ ContinueEl}],
+ [#xmlel{ns = ?NS_MUC_USER,
+ name = 'invite',
+ attrs = [?XMLATTR('from',
+ exmpp_jid:to_binary(From))],
+ children = [#xmlel{ns =?NS_MUC_USER, name = 'reason',
+ children = [#xmlcdata{cdata = Reason} ]}]
+ ++ ContinueEl}],
PasswdEl =
case (StateData#state.config)#config.password_protected of
true ->
- [{xmlelement, "password", [],
- [{xmlcdata, (StateData#state.config)#config.password}]}];
+ [#xmlel{ns = ?NS_MUC_USER, name = 'password',
+ children = [#xmlcdata{cdata =
+ (StateData#state.config)#config.password}]}];
_ ->
[]
end,
Body =
- {xmlelement, "body", [],
- [{xmlcdata,
- lists:flatten(
- io_lib:format(
- translate:translate(
- Lang,
- "~s invites you to the room ~s"),
- [jlib:jid_to_string(From),
- jlib:jid_to_string({StateData#state.room,
- StateData#state.host,
- ""})
- ])) ++
+ #xmlel{name = 'body',
+ children = [#xmlcdata{cdata =
+ list_to_binary([
+ io_lib:format(
+ translate:translate(Lang,
+ "~s invites you to the room ~s"),
+ [exmpp_jid:to_binary(From),
+ exmpp_jid:to_binary(StateData#state.room,
+ StateData#state.host)
+ ]),
case (StateData#state.config)#config.password_protected of
true ->
", " ++
@@ -3378,24 +3466,26 @@ check_invitation(From, Els, Lang, StateData) ->
(StateData#state.config)#config.password ++ "'";
_ ->
""
- end ++
+ end,
case Reason of
- "" -> "";
- _ -> " (" ++ Reason ++ ") "
+ <<>> -> "";
+ _ -> [" (", Reason, ") "]
end
- }]},
+ ])}]},
+ %%TODO: always NS_JABBER_CLIENT?
Msg =
- {xmlelement, "message",
- [{"type", "normal"}],
- [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], IEl ++ PasswdEl},
- {xmlelement, "x",
- [{"xmlns", ?NS_XCONFERENCE},
- {"jid", jlib:jid_to_string(
- {StateData#state.room,
- StateData#state.host,
- ""})}],
- [{xmlcdata, Reason}]},
- Body]},
+ #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message',
+ attrs = [?XMLATTR('type', <<"normal">>)],
+ children = [#xmlel{ns = ?NS_MUC_USER, name = 'x',
+ children = IEl ++ PasswdEl},
+ #xmlel{ns = 'jabber:x:conference', name = 'x',
+ attrs = [?XMLATTR('jid',
+ exmpp_jid:to_binary(
+ StateData#state.room,
+ StateData#state.host)
+ )],
+ children = [#xmlcdata{cdata = Reason}]},
+ Body]},
ejabberd_router:route(StateData#state.jid, JID, Msg),
JID
end.
@@ -3416,36 +3506,37 @@ handle_roommessage_from_nonparticipant(Packet, Lang, StateData, From) ->
%% This function must be catched,
%% because it crashes when the packet is not a decline message.
check_decline_invitation(Packet) ->
- {xmlelement, "message", _, _} = Packet,
- XEl = xml:get_subtag(Packet, "x"),
- ?NS_MUC_USER = xml:get_tag_attr_s("xmlns", XEl),
- DEl = xml:get_subtag(XEl, "decline"),
- ToString = xml:get_tag_attr_s("to", DEl),
- ToJID = jlib:string_to_jid(ToString),
+ #xmlel{name = 'message'} = Packet,
+ #xmlel{ns = ?NS_MUC_USER} = XEl = exmpp_xml:get_element(Packet, 'x'),
+ DEl = exmpp_xml:get_element(XEl, 'decline'),
+ ToString = exmpp_xml:get_attribute_as_binary(DEl, 'to', false),
+ ToJID = exmpp_jid:parse(ToString),
{true, {Packet, XEl, DEl, ToJID}}.
%% Send the decline to the inviter user.
%% The original stanza must be slightly modified.
-send_decline_invitation({Packet, XEl, DEl, ToJID}, RoomJID, FromJID) ->
- FromString = jlib:jid_to_string(FromJID),
- {xmlelement, "decline", DAttrs, DEls} = DEl,
- DAttrs2 = lists:keydelete("to", 1, DAttrs),
- DAttrs3 = [{"from", FromString} | DAttrs2],
- DEl2 = {xmlelement, "decline", DAttrs3, DEls},
- XEl2 = replace_subelement(XEl, DEl2),
- Packet2 = replace_subelement(Packet, XEl2),
+send_decline_invitation({Packet, XEl, DEl = #xmlel{name='decline'}, ToJID},
+ RoomJID, FromJID) ->
+ FromString = exmpp_jid:to_binary(FromJID),
+
+ DEl1 = exmpp_xml:remove_attribute(DEl, 'to'),
+ DEl2 = exmpp_xml:set_attribute(DEl1, 'from',FromString),
+ XEl2 = replace_subelement(XEl,DEl2),
+ Packet2 = replace_subelement(Packet,XEl2),
ejabberd_router:route(RoomJID, ToJID, Packet2).
%% Given an element and a new subelement,
%% replace the instance of the subelement in element with the new subelement.
-replace_subelement({xmlelement, Name, Attrs, SubEls}, NewSubEl) ->
- {_, NameNewSubEl, _, _} = NewSubEl,
- SubEls2 = lists:keyreplace(NameNewSubEl, 2, SubEls, NewSubEl),
- {xmlelement, Name, Attrs, SubEls2}.
+replace_subelement(#xmlel{children = Els} = El, #xmlel{name = Name} = NewSubEl) ->
+ Els2 = lists:map(fun(#xmlel{name = Name2}) when Name2 =:= Name -> NewSubEl;
+ (S) -> S
+ end, Els),
+ exmpp_xml:set_children(El, Els2).
send_error_only_occupants(Packet, Lang, RoomJID, From) ->
ErrText = "Only occupants are allowed to send messages to the conference",
- Err = jlib:make_error_reply(Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)),
+ Err = exmpp_stanza:reply_with_error(
+ Packet, ?ERR(Packet, 'not-acceptable', Lang, ErrText)),
ejabberd_router:route(RoomJID, From, Err).
@@ -3472,7 +3563,8 @@ add_to_log(Type, Data, StateData) ->
%% Users number checking
tab_add_online_user(JID, StateData) ->
- {LUser, LServer, _} = jlib:jid_tolower(JID),
+ LUser = exmpp_jid:prep_node(JID),
+ LServer = exmpp_jid:prep_domain(JID),
US = {LUser, LServer},
Room = StateData#state.room,
Host = StateData#state.host,
@@ -3481,8 +3573,13 @@ tab_add_online_user(JID, StateData) ->
#muc_online_users{us = US, room = Room, host = Host}).
-tab_remove_online_user(JID, StateData) ->
- {LUser, LServer, _} = jlib:jid_tolower(JID),
+
+tab_remove_online_user(JID, StateData) when ?IS_JID(JID) ->
+ LUser = exmpp_jid:prep_node(JID),
+ LServer = exmpp_jid:prep_domain(JID),
+ tab_remove_online_user({LUser, LServer, none},StateData);
+
+tab_remove_online_user({LUser, LServer,_}, StateData) ->
US = {LUser, LServer},
Room = StateData#state.room,
Host = StateData#state.host,
@@ -3491,7 +3588,8 @@ tab_remove_online_user(JID, StateData) ->
#muc_online_users{us = US, room = Room, host = Host}).
tab_count_user(JID) ->
- {LUser, LServer, _} = jlib:jid_tolower(JID),
+ LUser = exmpp_jid:prep_node(JID),
+ LServer = exmpp_jid:prep_domain(JID),
US = {LUser, LServer},
case catch ets:select(
muc_online_users,
@@ -3501,3 +3599,10 @@ tab_count_user(JID) ->
_ ->
0
end.
+
+
+jid_replace_resource(JID, Resource) ->
+ exmpp_jid:full(JID, Resource).
+
+
+
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index 78c3b2eca..f0a8cef59 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -43,8 +43,9 @@
webadmin_user/4,
webadmin_user_parse_query/5]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
@@ -53,32 +54,38 @@
-define(PROCNAME, ejabberd_offline).
-define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_CLIENT).
+-define(PREFIXED_NS, [{?NS_XMPP, ?NS_XMPP_pfx}]).
+
%% default value for the maximum number of user messages
-define(MAX_USER_MESSAGES, infinity).
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
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,
+ ejabberd_hooks:add(offline_message_hook, HostB,
?MODULE, store_packet, 50),
- ejabberd_hooks:add(resend_offline_messages_hook, Host,
+ ejabberd_hooks:add(resend_offline_messages_hook, HostB,
?MODULE, pop_offline_messages, 50),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(anonymous_purge_hook, Host,
+ ejabberd_hooks:add(anonymous_purge_hook, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(disco_sm_features, Host,
+ ejabberd_hooks:add(disco_sm_features, HostB,
?MODULE, get_sm_features, 50),
- ejabberd_hooks:add(disco_local_features, Host,
+ ejabberd_hooks:add(disco_local_features, HostB,
?MODULE, get_sm_features, 50),
- ejabberd_hooks:add(webadmin_page_host, Host,
+ ejabberd_hooks:add(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:add(webadmin_user, Host,
+ ejabberd_hooks:add(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- ejabberd_hooks:add(webadmin_user_parse_query, Host,
+ ejabberd_hooks:add(webadmin_user_parse_query, HostB,
?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),
@@ -125,7 +132,7 @@ loop(AccessMaxOfflineMsgs) ->
%% 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
+ Host, AccessRule, exmpp_jid:make(LUser, Host, "")) of
Max when is_integer(Max) -> Max;
infinity -> infinity;
_ -> ?MAX_USER_MESSAGES
@@ -141,21 +148,22 @@ receive_all(US, Msgs) ->
stop(Host) ->
- ejabberd_hooks:delete(offline_message_hook, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(offline_message_hook, HostB,
?MODULE, store_packet, 50),
- ejabberd_hooks:delete(resend_offline_messages_hook, Host,
+ ejabberd_hooks:delete(resend_offline_messages_hook, HostB,
?MODULE, pop_offline_messages, 50),
- ejabberd_hooks:delete(remove_user, Host,
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(anonymous_purge_hook, Host,
+ ejabberd_hooks:delete(anonymous_purge_hook, HostB,
?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,
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:delete(disco_local_features, HostB, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:delete(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:delete(webadmin_user, Host,
+ ejabberd_hooks:delete(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- ejabberd_hooks:delete(webadmin_user_parse_query, Host,
+ ejabberd_hooks:delete(webadmin_user_parse_query, HostB,
?MODULE, webadmin_user_parse_query, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
exit(whereis(Proc), stop),
@@ -166,9 +174,9 @@ get_sm_features(Acc, _From, _To, "", _Lang) ->
{result, I} -> I;
_ -> []
end,
- {result, Feats ++ [?NS_FEATURE_MSGOFFLINE]};
+ {result, Feats ++ [?NS_MSGOFFLINE]};
-get_sm_features(_Acc, _From, _To, ?NS_FEATURE_MSGOFFLINE, _Lang) ->
+get_sm_features(_Acc, _From, _To, ?NS_MSGOFFLINE, _Lang) ->
%% override all lesser features...
{result, []};
@@ -177,17 +185,17 @@ get_sm_features(Acc, _From, _To, _Node, _Lang) ->
store_packet(From, To, Packet) ->
- Type = xml:get_tag_attr_s("type", Packet),
+ Type = exmpp_stanza:get_type(Packet),
if
- (Type /= "error") and (Type /= "groupchat") and
- (Type /= "headline") ->
+ (Type /= <<"error">>) and (Type /= <<"groupchat">>) and
+ (Type /= <<"headline">>) ->
case check_event_chatstates(From, To, Packet) of
true ->
- #jid{luser = LUser, lserver = LServer} = To,
+ LUser = exmpp_jid:prep_node_as_list(To),
+ LServer = exmpp_jid:prep_domain_as_list(To),
TimeStamp = now(),
- {xmlelement, _Name, _Attrs, Els} = Packet,
- Expire = find_x_expire(TimeStamp, Els),
- gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME) !
+ Expire = find_x_expire(TimeStamp, Packet#xmlel.children),
+ gen_mod:get_module_proc(LServer, ?PROCNAME) !
#offline_msg{us = {LUser, LServer},
timestamp = TimeStamp,
expire = Expire,
@@ -204,40 +212,37 @@ store_packet(From, To, Packet) ->
%% 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
+ case find_x_event_chatstates(Packet#xmlel.children, {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;
+ 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 ->
+ {El, _, _} when El /= false->
+ case exmpp_xml:get_element(El, 'id') of
+ undefined ->
+ case exmpp_xml:get_element(El, 'offline') of
+ undefined ->
true;
_ ->
- ID = case xml:get_tag_attr_s("id", Packet) of
- "" ->
- {xmlelement, "id", [], []};
+ ID = case exmpp_stanza:get_id(Packet) of
+ undefined ->
+ #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'id'};
S ->
- {xmlelement, "id", [],
- [{xmlcdata, S}]}
+ #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'id',
+ children = [#xmlcdata{cdata =
+ S}]}
end,
+ X = #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'x', children =
+ [ID, #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'offline'}]},
ejabberd_router:route(
- To, From, {xmlelement, Name, Attrs,
- [{xmlelement, "x",
- [{"xmlns", ?NS_EVENT}],
- [ID,
- {xmlelement, "offline", [], []}]}]
- }),
+ To, From, exmpp_xml:set_children(Packet, [X])),
true
end;
_ ->
@@ -248,120 +253,125 @@ check_event_chatstates(From, To, Packet) ->
%% 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_event_chatstates([#xmlel{ns = ?NS_MESSAGE_EVENT} = El | Els], {_, B, C}) ->
+ find_x_event_chatstates(Els, {El, B, C});
+find_x_event_chatstates([#xmlel{ns = ?NS_CHATSTATES} = El | Els], {A, _, C}) ->
+ find_x_event_chatstates(Els, {A, El, C});
+find_x_event_chatstates([#xmlcdata{} = _ | Els], {A, B, C}) ->
+ find_x_event_chatstates(Els, {A, B, C});
+find_x_event_chatstates([_ | Els], {A, B, _}) ->
+ find_x_event_chatstates(Els, {A, B, true}).
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, [#xmlel{ns = ?NS_MESSAGE_EXPIRE} = El | _Els]) ->
+ Val = exmpp_xml:get_attribute_as_list(El, 'seconds', ""),
+ 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};
_ ->
- find_x_expire(TimeStamp, Els)
- end.
+ never
+ end;
+find_x_expire(TimeStamp, [_ | Els]) ->
+ find_x_expire(TimeStamp, Els).
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));
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep: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) ->
+ Packet = R#offline_msg.packet,
+ ejabberd_sm !
+ {route,
+ R#offline_msg.from,
+ R#offline_msg.to,
+ exmpp_xml:append_children(
+ Packet,
+ [jlib:timestamp_to_xml(
+ calendar:now_to_universal_time(R#offline_msg.timestamp),
+ utc,
+ exmpp_jid:make("", 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
+ catch
_ ->
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)));
+pop_offline_messages(Ls, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(User),
+ LServer = binary_to_list(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) ->
+ Packet = R#offline_msg.packet,
+ {route,
+ R#offline_msg.from,
+ R#offline_msg.to,
+ exmpp_xml:append_children(
+ Packet,
+ [jlib:timestamp_to_xml(
+ calendar:now_to_universal_time(
+ R#offline_msg.timestamp),
+ utc,
+ exmpp_jid:make("", 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
+ catch
_ ->
Ls
end.
@@ -405,20 +415,25 @@ remove_old_messages(Days) ->
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).
+remove_user(User, Server) when is_binary(User), is_binary(Server) ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ F = fun() ->
+ mnesia:delete({offline_msg, US})
+ end,
+ mnesia:transaction(F)
+ catch
+ _ ->
+ ok
+ end.
update_table() ->
Fields = record_info(fields, offline_msg),
case mnesia:table_info(offline_msg, attributes) of
Fields ->
- ok;
+ convert_to_exmpp();
[user, timestamp, expire, from, to, packet] ->
?INFO_MSG("Converting offline_msg table from "
"{user, timestamp, expire, from, to, packet} format", []),
@@ -434,10 +449,23 @@ update_table() ->
F1 = fun() ->
mnesia:write_lock_table(mod_offline_tmp_table),
mnesia:foldl(
- fun(#offline_msg{us = U} = R, _) ->
+ fun(#offline_msg{us = U, from = F, to = T, packet = P} = R, _) ->
+ U1 = convert_jid_to_exmpp(U),
+ F1 = jlib:from_old_jid(F),
+ T1 = jlib:from_old_jid(T),
+ P1 = exmpp_xml:xmlelement_to_xmlel(
+ P,
+ [?DEFAULT_NS],
+ ?PREFIXED_NS),
+ New_R = R#offline_msg{
+ us = {U1, Host},
+ from = F1,
+ to = T1,
+ packet = P1
+ },
mnesia:dirty_write(
mod_offline_tmp_table,
- R#offline_msg{us = {U, Host}})
+ New_R)
end, ok, offline_msg)
end,
mnesia:transaction(F1),
@@ -465,14 +493,20 @@ update_table() ->
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,
+ Expire = find_x_expire(TS, P#xmlelement.children),
+ U1 = convert_jid_to_exmpp(U),
+ F1 = jlib:from_old_jid(F),
+ T1 = jlib:from_old_jid(T),
+ P1 = exmpp_xml:xmlelement_to_xmlel(
+ P,
+ [?DEFAULT_NS],
+ ?PREFIXED_NS),
+ #offline_msg{us = U1,
timestamp = TS,
expire = Expire,
- from = F,
- to = T,
- packet = P}
+ from = F1,
+ to = T1,
+ packet = P1}
end, Fields),
F1 = fun() ->
mnesia:write_lock_table(mod_offline_tmp_table),
@@ -499,6 +533,50 @@ update_table() ->
mnesia:transform_table(offline_msg, ignore, Fields)
end.
+convert_to_exmpp() ->
+ Fun = fun() ->
+ case mnesia:first(offline_msg) of
+ '$end_of_table' ->
+ none;
+ Key ->
+ case mnesia:read({offline_msg, Key}) of
+ [#offline_msg{packet = #xmlel{}} | _] ->
+ none;
+ [#offline_msg{packet = #xmlelement{}} | _] ->
+ mnesia:foldl(fun convert_to_exmpp2/2,
+ done, offline_msg, write)
+ end
+ end
+ end,
+ mnesia:transaction(Fun).
+
+convert_to_exmpp2(#offline_msg{
+ us = {US_U, US_S},
+ from = From,
+ to = To,
+ packet = Packet} = R, Acc) ->
+ % Remove old entry.
+ mnesia:delete_object(R),
+ % Convert "" to undefined in JIDs.
+ US_U1 = convert_jid_to_exmpp(US_U),
+ US_S1 = convert_jid_to_exmpp(US_S),
+ From1 = jlib:from_old_jid(From),
+ To1 = jlib:from_old_jid(To),
+ % Convert stanza.
+ Packet1 = exmpp_xml:xmlelement_to_xmlel(Packet,
+ [?DEFAULT_NS], ?PREFIXED_NS),
+ % Prepare the new record.
+ New_R = R#offline_msg{
+ us = {US_U1, US_S1},
+ from = From1,
+ to = To1,
+ packet = Packet1},
+ % Write the new record.
+ mnesia:write(New_R),
+ Acc.
+
+convert_jid_to_exmpp("") -> undefined;
+convert_jid_to_exmpp(V) -> V.
%% Helper functions:
@@ -507,9 +585,9 @@ 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)),
+ Error = exmpp_stanza:error('resource-constraint',
+ {"en", ErrText}),
+ Err = exmpp_stanza:reply_with_error(Packet, Error),
ejabberd_router:route(
To,
From, Err)
@@ -527,14 +605,25 @@ webadmin_page(_, Host,
webadmin_page(Acc, _, _) -> Acc.
user_queue(User, Server, Query, Lang) ->
- US = {jlib:nodeprep(User), jlib:nameprep(Server)},
- Res = user_queue_parse_query(US, Query),
- Msgs = lists:keysort(#offline_msg.timestamp,
- mnesia:dirty_read({offline_msg, US})),
+ {US, Msgs, Res} = try
+ US0 = {
+ exmpp_stringprep:nodeprep(User),
+ exmpp_stringprep:nameprep(Server)
+ },
+ {
+ US0,
+ lists:keysort(#offline_msg.timestamp,
+ mnesia:dirty_read({offline_msg, US0})),
+ user_queue_parse_query(US0, Query)
+ }
+ catch
+ _ ->
+ {{"invalid", "invalid"}, [], nothing}
+ end,
FMsgs =
lists:map(
fun(#offline_msg{timestamp = TimeStamp, from = From, to = To,
- packet = {xmlelement, Name, Attrs, Els}} = Msg) ->
+ packet = Packet} = Msg) ->
ID = jlib:encode_base64(binary_to_list(term_to_binary(Msg))),
{{Year, Month, Day}, {Hour, Minute, Second}} =
calendar:now_to_local_time(TimeStamp),
@@ -542,17 +631,18 @@ user_queue(User, Server, Query, Lang) ->
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),
+ SFrom = exmpp_jid:to_list(From),
+ STo = exmpp_jid:to_list(To),
+ Packet1 = exmpp_stanza:set_jids(Packet, SFrom, STo),
+ FPacket = exmpp_xml:node_to_list(
+ exmpp_xml:indent_document(Packet1, <<" ">>),
+ [?DEFAULT_NS], ?PREFIXED_NS),
?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)])]
+ [?XAE("td", [?XMLATTR('class', <<"valign">>)], [?INPUT("checkbox", "selected", ID)]),
+ ?XAC("td", [?XMLATTR('class', <<"valign">>)], Time),
+ ?XAC("td", [?XMLATTR('class', <<"valign">>)], SFrom),
+ ?XAC("td", [?XMLATTR('class', <<"valign">>)], STo),
+ ?XAE("td", [?XMLATTR('class', <<"valign">>)], [?XC("pre", FPacket)])]
)
end, Msgs),
[?XC("h1", io_lib:format(?T("~s's Offline Messages Queue"),
@@ -561,7 +651,7 @@ user_queue(User, Server, Query, Lang) ->
ok -> [?XREST("Submitted")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
[?XE("table",
[?XE("thead",
[?XE("tr",
@@ -575,7 +665,7 @@ user_queue(User, Server, Query, Lang) ->
if
FMsgs == [] ->
[?XE("tr",
- [?XAC("td", [{"colspan", "4"}], " ")]
+ [?XAC("td", [?XMLATTR('colspan', <<"4">>)], " ")]
)];
true ->
FMsgs
@@ -610,13 +700,21 @@ user_queue_parse_query(US, Query) ->
end.
us_to_list({User, Server}) ->
- jlib:jid_to_string({User, Server, ""}).
+ exmpp_jid:to_list(User, Server).
webadmin_user(Acc, User, Server, Lang) ->
- US = {jlib:nodeprep(User), jlib:nameprep(Server)},
- QueueLen = length(mnesia:dirty_read({offline_msg, US})),
- FQueueLen = [?AC("queue/",
- integer_to_list(QueueLen))],
+ FQueueLen = try
+ US = {
+ exmpp_stringprep:nodeprep(User),
+ exmpp_stringprep:nameprep(Server)
+ },
+ QueueLen = length(mnesia:dirty_read({offline_msg, US})),
+ [?AC("queue/",
+ integer_to_list(QueueLen))]
+ catch
+ _ ->
+ [?C("?")]
+ end,
Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen ++ [?C(" "), ?INPUTT("submit", "removealloffline", "Remove All Offline Messages")].
webadmin_user_parse_query(_, "removealloffline", User, Server, _Query) ->
diff --git a/src/mod_offline_odbc.erl b/src/mod_offline_odbc.erl
index d7bbd3bf3..abab042df 100644
--- a/src/mod_offline_odbc.erl
+++ b/src/mod_offline_odbc.erl
@@ -42,8 +42,9 @@
webadmin_user/4,
webadmin_user_parse_query/5]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
@@ -52,27 +53,33 @@
-define(PROCNAME, ejabberd_offline).
-define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000).
+% These are the namespace already declared by the stream opening. This is
+% used at serialization time.
+-define(DEFAULT_NS, ?NS_JABBER_CLIENT).
+-define(PREFIXED_NS, [{?NS_XMPP, ?NS_XMPP_pfx}]).
+
%% default value for the maximum number of user messages
-define(MAX_USER_MESSAGES, infinity).
start(Host, Opts) ->
- ejabberd_hooks:add(offline_message_hook, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:add(offline_message_hook, HostB,
?MODULE, store_packet, 50),
- ejabberd_hooks:add(resend_offline_messages_hook, Host,
+ ejabberd_hooks:add(resend_offline_messages_hook, HostB,
?MODULE, pop_offline_messages, 50),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(anonymous_purge_hook, Host,
+ ejabberd_hooks:add(anonymous_purge_hook, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(disco_sm_features, Host,
+ ejabberd_hooks:add(disco_sm_features, HostB,
?MODULE, get_sm_features, 50),
- ejabberd_hooks:add(disco_local_features, Host,
+ ejabberd_hooks:add(disco_local_features, HostB,
?MODULE, get_sm_features, 50),
- ejabberd_hooks:add(webadmin_page_host, Host,
+ ejabberd_hooks:add(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:add(webadmin_user, Host,
+ ejabberd_hooks:add(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- ejabberd_hooks:add(webadmin_user_parse_query, Host,
+ ejabberd_hooks:add(webadmin_user_parse_query, HostB,
?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),
@@ -99,31 +106,28 @@ loop(Host, AccessMaxOfflineMsgs) ->
fun(M) ->
Username =
ejabberd_odbc:escape(
- (M#offline_msg.to)#jid.luser),
+ exmpp_jid:prep_node_as_list(M#offline_msg.to)),
From = M#offline_msg.from,
To = M#offline_msg.to,
- {xmlelement, Name, Attrs, Els} =
- M#offline_msg.packet,
- Attrs2 = jlib:replace_from_to_attrs(
- jlib:jid_to_string(From),
- jlib:jid_to_string(To),
- Attrs),
- Packet = {xmlelement, Name, Attrs2,
- Els ++
- [jlib:timestamp_to_xml(
- calendar:now_to_universal_time(
- M#offline_msg.timestamp),
- utc,
- jlib:make_jid("", Host, ""),
- "Offline Storage"),
- %% TODO: Delete the next three lines once XEP-0091 is Obsolete
- jlib:timestamp_to_xml(
- calendar:now_to_universal_time(
- M#offline_msg.timestamp))]},
+ Packet0 = exmpp_stanza:set_jids(
+ M#offline_msg.packet,
+ From,
+ To),
+ Packet1 = exmpp_xml:append_children(
+ Packet0,
+ [jlib:timestamp_to_xml(
+ calendar:now_to_universal_time(
+ M#offline_msg.timestamp),
+ utc,
+ jlib:make_jid("", Host, ""),
+ "Offline Storage"),
+ %% TODO: Delete the next three lines once XEP-0091 is Obsolete
+ jlib:timestamp_to_xml(
+ calendar:now_to_universal_time(
+ M#offline_msg.timestamp))]),
XML =
ejabberd_odbc:escape(
- lists:flatten(
- xml:element_to_string(Packet))),
+ exmpp_xml:document_to_list(Packet1)),
odbc_queries:add_spool_sql(Username, XML)
end, Msgs),
case catch odbc_queries:add_spool(Host, Query) of
@@ -143,7 +147,7 @@ loop(Host, AccessMaxOfflineMsgs) ->
%% 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
+ Host, AccessRule, exmpp_jid:make(LUser, Host, "")) of
Max when is_integer(Max) -> Max;
infinity -> infinity;
_ -> ?MAX_USER_MESSAGES
@@ -159,21 +163,22 @@ receive_all(Username, Msgs) ->
stop(Host) ->
- ejabberd_hooks:delete(offline_message_hook, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(offline_message_hook, HostB,
?MODULE, store_packet, 50),
- ejabberd_hooks:delete(resend_offline_messages_hook, Host,
+ ejabberd_hooks:delete(resend_offline_messages_hook, HostB,
?MODULE, pop_offline_messages, 50),
- ejabberd_hooks:delete(remove_user, Host,
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(anonymous_purge_hook, Host,
+ ejabberd_hooks:delete(anonymous_purge_hook, HostB,
?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,
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:delete(disco_local_features, HostB, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:delete(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:delete(webadmin_user, Host,
+ ejabberd_hooks:delete(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- ejabberd_hooks:delete(webadmin_user_parse_query, Host,
+ ejabberd_hooks:delete(webadmin_user_parse_query, HostB,
?MODULE, webadmin_user_parse_query, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
exit(whereis(Proc), stop),
@@ -184,9 +189,9 @@ get_sm_features(Acc, _From, _To, "", _Lang) ->
{result, I} -> I;
_ -> []
end,
- {result, Feats ++ [?NS_FEATURE_MSGOFFLINE]};
+ {result, Feats ++ [?NS_MSGOFFLINE]};
-get_sm_features(_Acc, _From, _To, ?NS_FEATURE_MSGOFFLINE, _Lang) ->
+get_sm_features(_Acc, _From, _To, ?NS_MSGOFFLINE, _Lang) ->
%% override all lesser features...
{result, []};
@@ -195,17 +200,16 @@ get_sm_features(Acc, _From, _To, _Node, _Lang) ->
store_packet(From, To, Packet) ->
- Type = xml:get_tag_attr_s("type", Packet),
+ Type = exmpp_stanza:get_type(Packet),
if
- (Type /= "error") and (Type /= "groupchat") and
- (Type /= "headline") ->
+ (Type /= <<"error">>) and (Type /= <<"groupchat">>) and
+ (Type /= <<"headline">>) ->
case check_event_chatstates(From, To, Packet) of
true ->
- #jid{luser = LUser} = To,
+ LUser = exmpp_jid:prep_node_as_list(To),
TimeStamp = now(),
- {xmlelement, _Name, _Attrs, Els} = Packet,
- Expire = find_x_expire(TimeStamp, Els),
- gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME) !
+ Expire = find_x_expire(TimeStamp, Packet#xmlel.children),
+ gen_mod:get_module_proc(exmpp_jid:prep_domain_as_list(To), ?PROCNAME) !
#offline_msg{user = LUser,
timestamp = TimeStamp,
expire = Expire,
@@ -222,40 +226,37 @@ store_packet(From, To, Packet) ->
%% 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
+ case find_x_event_chatstates(Packet#xmlel.children, {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;
+ 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 ->
+ {El, _, _} when El /= false->
+ case exmpp_xml:get_element(El, 'id') of
+ undefined ->
+ case exmpp_xml:get_element(El, 'offline') of
+ undefined ->
true;
_ ->
- ID = case xml:get_tag_attr_s("id", Packet) of
- "" ->
- {xmlelement, "id", [], []};
+ ID = case exmpp_stanza:get_id(Packet) of
+ undefined ->
+ #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'id'};
S ->
- {xmlelement, "id", [],
- [{xmlcdata, S}]}
+ #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'id',
+ children = [#xmlcdata{cdata =
+ S}]}
end,
+ X = #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'x', children =
+ [ID, #xmlel{ns = ?NS_MESSAGE_EVENT, name = 'offline'}]},
ejabberd_router:route(
- To, From, {xmlelement, Name, Attrs,
- [{xmlelement, "x",
- [{"xmlns", ?NS_EVENT}],
- [ID,
- {xmlelement, "offline", [], []}]}]
- }),
+ To, From, exmpp_xml:set_children(Packet, [X])),
true
end;
_ ->
@@ -266,80 +267,81 @@ check_event_chatstates(From, To, Packet) ->
%% 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_event_chatstates([#xmlel{ns = ?NS_MESSAGE_EVENT} = El | Els], {_, B, C}) ->
+ find_x_event_chatstates(Els, {El, B, C});
+find_x_event_chatstates([#xmlel{ns = ?NS_CHATSTATES} = El | Els], {A, _, C}) ->
+ find_x_event_chatstates(Els, {A, El, C});
+find_x_event_chatstates([#xmlcdata{} = _ | Els], {A, B, C}) ->
+ find_x_event_chatstates(Els, {A, B, C});
+find_x_event_chatstates([_ | Els], {A, B, _}) ->
+ find_x_event_chatstates(Els, {A, B, true}).
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, [#xmlel{ns = ?NS_MESSAGE_EXPIRE} = El | _Els]) ->
+ Val = exmpp_xml:get_attribute_as_list(El, 'seconds', ""),
+ 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};
_ ->
- find_x_expire(TimeStamp, Els)
+ never
+ end;
+find_x_expire(TimeStamp, [_ | Els]) ->
+ find_x_expire(TimeStamp, Els).
+
+
+pop_offline_messages(Ls, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(User),
+ LServer = binary_to_list(Server),
+ EUser = ejabberd_odbc:escape(LUser),
+ case odbc_queries:get_and_del_spool_msg_t(LServer, EUser) of
+ {atomic, {selected, ["username","xml"], Rs}} ->
+ Ls ++ lists:flatmap(
+ fun({_, XML}) ->
+ try
+ [El] = exmpp_xml:parse_document(XML,
+ [names_as_atom, {check_elems, xmpp},
+ {check_nss,xmpp}, {check_attrs,xmpp}]),
+ To = exmpp_jid:parse(
+ exmpp_stanza:get_recipient(El)),
+ From = exmpp_jid:parse(
+ exmpp_stanza:get_sender(El)),
+ [{route, From, To, El}]
+ catch
+ _ ->
+ []
+ end
+ end, Rs);
+ _ ->
+ Ls
+ end
+ catch
+ _ ->
+ []
end.
-pop_offline_messages(Ls, User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- EUser = ejabberd_odbc:escape(LUser),
- case odbc_queries:get_and_del_spool_msg_t(LServer, EUser) of
- {atomic, {selected, ["username","xml"], Rs}} ->
- Ls ++ lists:flatmap(
- fun({_, XML}) ->
- case xml_stream:parse_element(XML) of
- {error, _Reason} ->
- [];
- El ->
- To = jlib:string_to_jid(
- xml:get_tag_attr_s("to", El)),
- From = jlib:string_to_jid(
- xml:get_tag_attr_s("from", El)),
- if
- (To /= error) and
- (From /= error) ->
- [{route, From, To, El}];
- true ->
- []
- end
- end
- end, Rs);
+remove_user(User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(exmpp_stringprep:nodeprep(User)),
+ LServer = binary_to_list(exmpp_stringprep:nameprep(Server)),
+ Username = ejabberd_odbc:escape(LUser),
+ odbc_queries:del_spool_msg(LServer, Username)
+ catch
_ ->
- Ls
+ ok
end.
-remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- Username = ejabberd_odbc:escape(LUser),
- odbc_queries:del_spool_msg(LServer, Username).
-
-
%% Helper functions:
%% TODO: Warning - This function is a duplicate from mod_offline.erl
@@ -350,9 +352,9 @@ 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)),
+ Error = exmpp_stanza:error('resource-constraint',
+ {"en", ErrText}),
+ Err = exmpp_stanza:reply_with_error(Packet, Error),
ejabberd_router:route(
To,
From, Err)
@@ -370,38 +372,49 @@ webadmin_page(_, Host,
webadmin_page(Acc, _, _) -> Acc.
user_queue(User, Server, Query, Lang) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- Username = ejabberd_odbc:escape(LUser),
- US = {LUser, LServer},
- Res = user_queue_parse_query(Username, LServer, Query),
- Msgs = case catch ejabberd_odbc:sql_query(
- LServer,
- ["select username, xml from spool"
- " where username='", Username, "'"
- " order by seq;"]) of
- {selected, ["username", "xml"], Rs} ->
- lists:flatmap(
- fun({_, XML}) ->
- case xml_stream:parse_element(XML) of
- {error, _Reason} ->
- [];
- El ->
- [El]
- end
- end, Rs);
- _ ->
- []
- end,
+ {US, Msgs, Res} = try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ Username = ejabberd_odbc:escape(LUser),
+ US0 = {LUser, LServer},
+ R = user_queue_parse_query(Username, LServer, Query),
+ M = case catch ejabberd_odbc:sql_query(
+ LServer,
+ ["select username, xml from spool"
+ " where username='", Username, "'"
+ " order by seq;"]) of
+ {selected, ["username", "xml"], Rs} ->
+ lists:flatmap(
+ fun({_, XML}) ->
+ try exmpp_xml:parse_document(XML,
+ [names_as_atom, {check_elems, xmpp},
+ {check_nss,xmpp}, {check_attrs,xmpp}]) of
+ [El] ->
+ [El]
+ catch
+ _ ->
+ []
+ end
+ end, Rs);
+ _ ->
+ []
+ end,
+ {US0, M, R}
+ catch
+ _ ->
+ {{"invalid", "invalid"}, [], nothing}
+ end,
FMsgs =
lists:map(
- fun({xmlelement, _Name, _Attrs, _Els} = Msg) ->
+ fun(#xmlel{} = Msg) ->
ID = jlib:encode_base64(binary_to_list(term_to_binary(Msg))),
Packet = Msg,
- FPacket = ejabberd_web_admin:pretty_print_xml(Packet),
+ FPacket = exmpp_xml:node_to_list(
+ exmpp_xml:indent_document(Packet, <<" ">>),
+ [?DEFAULT_NS], ?PREFIXED_NS),
?XE("tr",
- [?XAE("td", [{"class", "valign"}], [?INPUT("checkbox", "selected", ID)]),
- ?XAE("td", [{"class", "valign"}], [?XC("pre", FPacket)])]
+ [?XAE("td", [?XMLATTR('class', <<"valign">>)], [?INPUT("checkbox", "selected", ID)]),
+ ?XAE("td", [?XMLATTR('class', <<"valign">>)], [?XC("pre", FPacket)])]
)
end, Msgs),
[?XC("h1", io_lib:format(?T("~s's Offline Messages Queue"),
@@ -410,7 +423,7 @@ user_queue(User, Server, Query, Lang) ->
ok -> [?XREST("Submitted")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
[?XE("table",
[?XE("thead",
[?XE("tr",
@@ -421,7 +434,7 @@ user_queue(User, Server, Query, Lang) ->
if
FMsgs == [] ->
[?XE("tr",
- [?XAC("td", [{"colspan", "4"}], " ")]
+ [?XAC("td", [?XMLATTR('colspan', <<"4">>)], " ")]
)];
true ->
FMsgs
@@ -442,11 +455,14 @@ user_queue_parse_query(Username, LServer, Query) ->
{selected, ["xml", "seq"], Rs} ->
lists:flatmap(
fun({XML, Seq}) ->
- case xml_stream:parse_element(XML) of
- {error, _Reason} ->
- [];
- El ->
+ try exmpp_xml:parse_document(XML,
+ [names_as_atom, {check_elems, xmpp},
+ {check_nss,xmpp}, {check_attrs,xmpp}]) of
+ [El] ->
[{El, Seq}]
+ catch
+ _ ->
+ []
end
end, Rs);
_ ->
@@ -477,22 +493,27 @@ user_queue_parse_query(Username, LServer, Query) ->
end.
us_to_list({User, Server}) ->
- jlib:jid_to_string({User, Server, ""}).
+ exmpp_jid:to_list(User, Server).
webadmin_user(Acc, User, Server, Lang) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- Username = ejabberd_odbc:escape(LUser),
- QueueLen = case catch ejabberd_odbc:sql_query(
- LServer,
- ["select count(*) from spool"
- " where username='", Username, "';"]) of
- {selected, [_], [{SCount}]} ->
- SCount;
- _ ->
- 0
- end,
- FQueueLen = [?AC("queue/", QueueLen)],
+ FQueueLen = try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ Username = ejabberd_odbc:escape(LUser),
+ QueueLen = case catch ejabberd_odbc:sql_query(
+ LServer,
+ ["select count(*) from spool"
+ " where username='", Username, "';"]) of
+ {selected, [_], [{SCount}]} ->
+ SCount;
+ _ ->
+ 0
+ end,
+ [?AC("queue/", QueueLen)]
+ catch
+ _ ->
+ [?C("?")]
+ end,
Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen ++ [?C(" "), ?INPUTT("submit", "removealloffline", "Remove All Offline Messages")].
webadmin_user_parse_query(_, "removealloffline", User, Server, _Query) ->
diff --git a/src/mod_ping.erl b/src/mod_ping.erl
index 7fbdb7bb8..e22894333 100644
--- a/src/mod_ping.erl
+++ b/src/mod_ping.erl
@@ -31,10 +31,9 @@
-behavior(gen_server).
-include("ejabberd.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-define(SUPERVISOR, ejabberd_sup).
--define(NS_PING, "urn:xmpp:ping").
-define(DEFAULT_SEND_PINGS, false). % bool()
-define(DEFAULT_PING_INTERVAL, 60). % seconds
@@ -92,22 +91,23 @@ stop(Host) ->
%% gen_server callbacks
%%====================================================================
init([Host, Opts]) ->
+ HostB = list_to_binary(Host),
SendPings = gen_mod:get_opt(send_pings, Opts, ?DEFAULT_SEND_PINGS),
PingInterval = gen_mod:get_opt(ping_interval, Opts, ?DEFAULT_PING_INTERVAL),
TimeoutAction = gen_mod:get_opt(timeout_action, Opts, none),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
mod_disco:register_feature(Host, ?NS_PING),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PING,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_PING,
?MODULE, iq_ping, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_PING,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_PING,
?MODULE, iq_ping, IQDisc),
case SendPings of
true ->
- ejabberd_hooks:add(sm_register_connection_hook, Host,
+ ejabberd_hooks:add(sm_register_connection_hook, HostB,
?MODULE, user_online, 100),
- ejabberd_hooks:add(sm_remove_connection_hook, Host,
+ ejabberd_hooks:add(sm_remove_connection_hook, HostB,
?MODULE, user_offline, 100),
- ejabberd_hooks:add(user_send_packet, Host,
+ ejabberd_hooks:add(user_send_packet, HostB,
?MODULE, user_send, 100);
_ ->
ok
@@ -119,14 +119,15 @@ init([Host, Opts]) ->
timers = ?DICT:new()}}.
terminate(_Reason, #state{host = Host}) ->
- ejabberd_hooks:delete(sm_remove_connection_hook, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(sm_remove_connection_hook, HostB,
?MODULE, user_offline, 100),
- ejabberd_hooks:delete(sm_register_connection_hook, Host,
+ ejabberd_hooks:delete(sm_register_connection_hook, HostB,
?MODULE, user_online, 100),
- ejabberd_hooks:delete(user_send_packet, Host,
+ ejabberd_hooks:delete(user_send_packet, HostB,
?MODULE, user_send, 100),
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_PING),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_PING),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_PING),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_PING),
mod_disco:unregister_feature(Host, ?NS_PING).
handle_call(stop, _From, State) ->
@@ -142,11 +143,10 @@ handle_cast({stop_ping, JID}, State) ->
{noreply, State#state{timers = Timers}};
handle_cast({iq_pong, JID, timeout}, State) ->
Timers = del_timer(JID, State#state.timers),
- ejabberd_hooks:run(user_ping_timeout, State#state.host, [JID]),
+ ejabberd_hooks:run(user_ping_timeout, list_to_binary(State#state.host), [JID]),
case State#state.timeout_action of
kill ->
- #jid{user = User, server = Server, resource = Resource} = JID,
- case ejabberd_sm:get_session_pid(User, Server, Resource) of
+ case ejabberd_sm:get_session_pid(JID) of
Pid when is_pid(Pid) ->
ejabberd_c2s:stop(Pid);
_ ->
@@ -160,13 +160,18 @@ handle_cast(_Msg, State) ->
{noreply, State}.
handle_info({timeout, _TRef, {ping, JID}}, State) ->
- IQ = #iq{type = get,
- sub_el = [{xmlelement, "ping", [{"xmlns", ?NS_PING}], []}]},
+ %%IQ = #iq{type = get,
+ %% sub_el = [{xmlelement, "ping", [{"xmlns", ?NS_PING}], []}]},
+
+ %% Build an iq:query request
+ %%IQ = exmpp_iq:get(?NS_PING, #xmlel{ns = ?NS_PING, name = 'ping'}),
+ IQ = #iq{type = get, payload = #xmlel{name = 'ping', ns = ?NS_PING}},
+
Pid = self(),
F = fun(Response) ->
gen_server:cast(Pid, {iq_pong, JID, Response})
end,
- From = jlib:make_jid("", State#state.host, ""),
+ From = exmpp_jid:make(State#state.host),
ejabberd_local:route_iq(From, JID, IQ, F),
Timers = add_timer(JID, State#state.ping_interval, State#state.timers),
{noreply, State#state{timers = Timers}};
@@ -179,28 +184,31 @@ code_change(_OldVsn, State, _Extra) ->
%%====================================================================
%% Hook callbacks
%%====================================================================
-iq_ping(_From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
+iq_ping(_From, _To, #iq{type = Type, payload = SubEl} = IQ) ->
case {Type, SubEl} of
- {get, {xmlelement, "ping", _, _}} ->
- IQ#iq{type = result, sub_el = []};
+ {get, #xmlel{name = ping, ns = ?NS_PING}} ->
+ exmpp_iq:result(IQ);
_ ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_FEATURE_NOT_IMPLEMENTED]}
+ exmpp_iq:error(IQ, 'feature-not-implemented')
end.
user_online(_SID, JID, _Info) ->
- start_ping(JID#jid.lserver, JID).
+ Host = exmpp_jid:prep_domain_as_list(JID),
+ start_ping(Host, JID).
user_offline(_SID, JID, _Info) ->
- stop_ping(JID#jid.lserver, JID).
+ Host = exmpp_jid:prep_domain_as_list(JID),
+ start_ping(Host, JID).
user_send(JID, _From, _Packet) ->
- start_ping(JID#jid.lserver, JID).
+ Host = exmpp_jid:prep_domain_as_list(JID),
+ start_ping(Host, JID).
%%====================================================================
%% Internal functions
%%====================================================================
add_timer(JID, Interval, Timers) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = exmpp_jid:prep_to_binary(JID),
NewTimers = case ?DICT:find(LJID, Timers) of
{ok, OldTRef} ->
cancel_timer(OldTRef),
@@ -212,7 +220,7 @@ add_timer(JID, Interval, Timers) ->
?DICT:store(LJID, TRef, NewTimers).
del_timer(JID, Timers) ->
- LJID = jlib:jid_tolower(JID),
+ LJID = exmpp_jid:prep_to_binary(JID),
case ?DICT:find(LJID, Timers) of
{ok, TRef} ->
cancel_timer(TRef),
diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl
index 623763bad..d88303c61 100644
--- a/src/mod_privacy.erl
+++ b/src/mod_privacy.erl
@@ -38,142 +38,137 @@
remove_user/2,
updated_list/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_privacy.hrl").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
mnesia:create_table(privacy, [{disc_copies, [node()]},
{attributes, record_info(fields, privacy)}]),
update_table(),
- ejabberd_hooks:add(privacy_iq_get, Host,
+ ejabberd_hooks:add(privacy_iq_get, HostB,
?MODULE, process_iq_get, 50),
- ejabberd_hooks:add(privacy_iq_set, Host,
+ ejabberd_hooks:add(privacy_iq_set, HostB,
?MODULE, process_iq_set, 50),
- ejabberd_hooks:add(privacy_get_user_list, Host,
+ ejabberd_hooks:add(privacy_get_user_list, HostB,
?MODULE, get_user_list, 50),
- ejabberd_hooks:add(privacy_check_packet, Host,
+ ejabberd_hooks:add(privacy_check_packet, HostB,
?MODULE, check_packet, 50),
- ejabberd_hooks:add(privacy_updated_list, Host,
+ ejabberd_hooks:add(privacy_updated_list, HostB,
?MODULE, updated_list, 50),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVACY,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_PRIVACY,
?MODULE, process_iq, IQDisc).
stop(Host) ->
- ejabberd_hooks:delete(privacy_iq_get, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(privacy_iq_get, HostB,
?MODULE, process_iq_get, 50),
- ejabberd_hooks:delete(privacy_iq_set, Host,
+ ejabberd_hooks:delete(privacy_iq_set, HostB,
?MODULE, process_iq_set, 50),
- ejabberd_hooks:delete(privacy_get_user_list, Host,
+ ejabberd_hooks:delete(privacy_get_user_list, HostB,
?MODULE, get_user_list, 50),
- ejabberd_hooks:delete(privacy_check_packet, Host,
+ ejabberd_hooks:delete(privacy_check_packet, HostB,
?MODULE, check_packet, 50),
- ejabberd_hooks:delete(privacy_updated_list, Host,
+ ejabberd_hooks:delete(privacy_updated_list, HostB,
?MODULE, updated_list, 50),
- ejabberd_hooks:delete(remove_user, Host,
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_PRIVACY).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_PRIVACY).
-process_iq(_From, _To, IQ) ->
- SubEl = IQ#iq.sub_el,
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}.
+process_iq(_From, _To, IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
-process_iq_get(_, From, _To, #iq{sub_el = SubEl},
+process_iq_get(_, From, _To, #iq{payload = SubEl},
#userlist{name = Active}) ->
- #jid{luser = LUser, lserver = LServer} = From,
- {xmlelement, _, _, Els} = SubEl,
- case xml:remove_cdata(Els) of
+ LUser = exmpp_jid:prep_node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case exmpp_xml:get_child_elements(SubEl) of
[] ->
process_lists_get(LUser, LServer, Active);
- [{xmlelement, Name, Attrs, _SubEls}] ->
+ [#xmlel{name = Name} = Child] ->
case Name of
- "list" ->
- ListName = xml:get_attr("name", Attrs),
+ list ->
+ ListName = exmpp_xml:get_attribute_as_list(Child, name, false),
process_list_get(LUser, LServer, ListName);
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
process_lists_get(LUser, LServer, Active) ->
case catch mnesia:dirty_read(privacy, {LUser, LServer}) of
{'EXIT', _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
[] ->
- {result, [{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}], []}]};
+ {result, #xmlel{ns = ?NS_PRIVACY, name = 'query'}};
[#privacy{default = Default, lists = Lists}] ->
case Lists of
[] ->
- {result, [{xmlelement, "query",
- [{"xmlns", ?NS_PRIVACY}], []}]};
+ {result, #xmlel{ns = ?NS_PRIVACY, name = 'query'}};
_ ->
LItems = lists:map(
fun({N, _}) ->
- {xmlelement, "list",
- [{"name", N}], []}
+ exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list}, name, N)
end, Lists),
DItems =
case Default of
none ->
LItems;
_ ->
- [{xmlelement, "default",
- [{"name", Default}], []} | LItems]
+ [exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = default}, name, Default) | LItems]
end,
ADItems =
case Active of
none ->
DItems;
_ ->
- [{xmlelement, "active",
- [{"name", Active}], []} | DItems]
+ [exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = active}, name, Active) | DItems]
end,
- {result,
- [{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}],
- ADItems}]}
+ {result, #xmlel{ns = ?NS_PRIVACY, name = 'query', children = ADItems}}
end
end.
-process_list_get(LUser, LServer, {value, Name}) ->
+process_list_get(_LUser, _LServer, false) ->
+ {error, 'bad-request'};
+
+process_list_get(LUser, LServer, Name) ->
case catch mnesia:dirty_read(privacy, {LUser, LServer}) of
{'EXIT', _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
[] ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
%{result, [{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}], []}]};
[#privacy{lists = Lists}] ->
case lists:keysearch(Name, 1, Lists) of
{value, {_, List}} ->
LItems = lists:map(fun item_to_xml/1, List),
- {result,
- [{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}],
- [{xmlelement, "list",
- [{"name", Name}], LItems}]}]};
+ ListEl = exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list, children = LItems}, name, Name),
+ {result,#xmlel{ns = ?NS_PRIVACY, name = 'query', children = [ListEl]}};
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end
- end;
+ 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)}],
+ Attrs1 = [?XMLATTR('action', action_to_binary(Item#listitem.action)),
+ ?XMLATTR('order', order_to_binary(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)} |
+ [?XMLATTR('type', type_to_binary(Item#listitem.type)),
+ ?XMLATTR('value', value_to_binary(Type, Item#listitem.value)) |
Attrs1]
end,
SubEls = case Item#listitem.match_all of
@@ -182,59 +177,61 @@ item_to_xml(Item) ->
false ->
SE1 = case Item#listitem.match_iq of
true ->
- [{xmlelement, "iq", [], []}];
+ [#xmlel{ns = ?NS_PRIVACY, name = iq}];
false ->
[]
end,
SE2 = case Item#listitem.match_message of
true ->
- [{xmlelement, "message", [], []} | SE1];
+ [#xmlel{ns = ?NS_PRIVACY, name = message} | SE1];
false ->
SE1
end,
SE3 = case Item#listitem.match_presence_in of
true ->
- [{xmlelement, "presence-in", [], []} | SE2];
+ [#xmlel{ns = ?NS_PRIVACY, name = 'presence-in'} | SE2];
false ->
SE2
end,
SE4 = case Item#listitem.match_presence_out of
true ->
- [{xmlelement, "presence-out", [], []} | SE3];
+ [#xmlel{ns = ?NS_PRIVACY, name = 'presence-out'} | SE3];
false ->
SE3
end,
SE4
end,
- {xmlelement, "item", Attrs2, SubEls}.
+ exmpp_xml:set_attributes(#xmlel{ns = ?NS_PRIVACY, name = item, children = SubEls}, Attrs2).
-action_to_list(Action) ->
+action_to_binary(Action) ->
case Action of
- allow -> "allow";
- deny -> "deny"
+ allow -> <<"allow">>;
+ deny -> <<"deny">>
end.
-order_to_list(Order) ->
- integer_to_list(Order).
+order_to_binary(Order) ->
+ list_to_binary(integer_to_list(Order)).
-type_to_list(Type) ->
+type_to_binary(Type) ->
case Type of
- jid -> "jid";
- group -> "group";
- subscription -> "subscription"
+ jid -> <<"jid">>;
+ group -> <<"group">>;
+ subscription -> <<"subscription">>
end.
-value_to_list(Type, Val) ->
+value_to_binary(Type, Val) ->
case Type of
- jid -> jlib:jid_to_string(Val);
+ jid ->
+ {N, D, R} = Val,
+ exmpp_jid:to_binary(N, D, R);
group -> Val;
subscription ->
case Val of
- both -> "both";
- to -> "to";
- from -> "from";
- none -> "none"
+ both -> <<"both">>;
+ to -> <<"to">>;
+ from -> <<"from">>;
+ none -> <<"none">>
end
end.
@@ -248,53 +245,28 @@ list_to_action(S) ->
-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),
+process_iq_set(_, From, _To, #iq{payload = SubEl}) ->
+ LUser = exmpp_jid:prep_node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case exmpp_xml:get_child_elements(SubEl) of
+ [#xmlel{name = Name} = Child] ->
+ ListName = exmpp_xml:get_attribute_as_list(Child, 'name', false),
case Name of
- "list" ->
+ list ->
process_list_set(LUser, LServer, ListName,
- xml:remove_cdata(SubEls));
- "active" ->
+ exmpp_xml:get_child_elements(Child));
+ active ->
process_active_set(LUser, LServer, ListName);
- "default" ->
+ default ->
process_default_set(LUser, LServer, ListName);
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
-process_default_set(LUser, LServer, {value, Name}) ->
- F = fun() ->
- case mnesia:read({privacy, {LUser, LServer}}) of
- [] ->
- {error, ?ERR_ITEM_NOT_FOUND};
- [#privacy{lists = Lists} = P] ->
- case lists:keymember(Name, 1, Lists) of
- true ->
- mnesia:write(P#privacy{default = Name,
- lists = Lists}),
- {result, []};
- false ->
- {error, ?ERR_ITEM_NOT_FOUND}
- end
- end
- end,
- case mnesia:transaction(F) of
- {atomic, {error, _} = Error} ->
- Error;
- {atomic, {result, _} = Res} ->
- Res;
- _ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
- end;
-
process_default_set(LUser, LServer, false) ->
F = fun() ->
case mnesia:read({privacy, {LUser, LServer}}) of
@@ -311,32 +283,61 @@ process_default_set(LUser, LServer, false) ->
{atomic, {result, _} = Res} ->
Res;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
+ end;
+
+process_default_set(LUser, LServer, Name) ->
+ F = fun() ->
+ case mnesia:read({privacy, {LUser, LServer}}) of
+ [] ->
+ {error, 'item-not-found'};
+ [#privacy{lists = Lists} = P] ->
+ case lists:keymember(Name, 1, Lists) of
+ true ->
+ mnesia:write(P#privacy{default = Name,
+ lists = Lists}),
+ {result, []};
+ false ->
+ {error, 'item-not-found'}
+ end
+ end
+ end,
+ case mnesia:transaction(F) of
+ {atomic, {error, _} = Error} ->
+ Error;
+ {atomic, {result, _} = Res} ->
+ Res;
+ _ ->
+ {error, 'internal-server-error'}
end.
-process_active_set(LUser, LServer, {value, Name}) ->
+process_active_set(_LUser, _LServer, false) ->
+ {result, [], #userlist{}};
+
+process_active_set(LUser, LServer, Name) ->
case catch mnesia:dirty_read(privacy, {LUser, LServer}) of
[] ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
[#privacy{lists = Lists}] ->
case lists:keysearch(Name, 1, Lists) of
{value, {_, List}} ->
NeedDb = is_list_needdb(List),
{result, [], #userlist{name = Name, list = List, needdb = NeedDb}};
false ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end
- end;
-
-process_active_set(_LUser, _LServer, false) ->
- {result, [], #userlist{}}.
+ end.
-process_list_set(LUser, LServer, {value, Name}, Els) ->
+
+process_list_set(_LUser, _LServer, false, _Els) ->
+ {error, 'bad-request'};
+
+process_list_set(LUser, LServer, Name, Els) ->
case parse_items(Els) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
remove ->
F =
fun() ->
@@ -347,7 +348,7 @@ process_list_set(LUser, LServer, {value, Name}, Els) ->
% TODO: check active
if
Name == Default ->
- {error, ?ERR_CONFLICT};
+ {error, 'conflict'};
true ->
NewLists =
lists:keydelete(Name, 1, Lists),
@@ -362,15 +363,15 @@ process_list_set(LUser, LServer, {value, Name}, Els) ->
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}]}),
+ exmpp_jid:make(LUser, LServer),
+ exmpp_jid:make(LUser, LServer),
+ #xmlel{name = 'broadcast',
+ children=[{privacy_list,
+ #userlist{name = Name, list = []},
+ Name}]}),
Res;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end;
List ->
F =
@@ -393,20 +394,18 @@ process_list_set(LUser, LServer, {value, Name}, Els) ->
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 = List},
- Name}]}),
+ exmpp_jid:make(LUser, LServer),
+ exmpp_jid:make(LUser, LServer),
+ #xmlel{name = 'broadcast',
+ children=[{privacy_list,
+ #userlist{name = Name, list = List},
+ Name}]}),
Res;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal_server_error'}
end
- end;
+ end.
-process_list_set(_LUser, _LServer, false, _Els) ->
- {error, ?ERR_BAD_REQUEST}.
parse_items([]) ->
@@ -417,16 +416,16 @@ 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
+parse_items([El = #xmlel{name = item} | Els], Res) ->
+ Type = exmpp_xml:get_attribute_as_list(El, type, false),
+ Value = exmpp_xml:get_attribute_as_list(El, value, false),
+ SAction =exmpp_xml:get_attribute_as_list(El, action, false),
+ SOrder = exmpp_xml:get_attribute_as_list(El, order, false),
+ Action = case catch list_to_action(SAction) of
{'EXIT', _} -> false;
Val -> Val
end,
- Order = case catch list_to_integer(element(2, SOrder)) of
+ Order = case catch list_to_integer(SOrder) of
{'EXIT', _} ->
false;
IntVal ->
@@ -441,16 +440,17 @@ parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) ->
(Action /= false) and (Order /= false) ->
I1 = #listitem{action = Action, order = Order},
I2 = case {Type, Value} of
- {{value, T}, {value, V}} ->
+ {T, V} when is_list(T), is_list(V) ->
case T of
"jid" ->
- case jlib:string_to_jid(V) of
- error ->
- false;
- JID ->
- I1#listitem{
- type = jid,
- value = jlib:jid_tolower(JID)}
+ try
+ JID = exmpp_jid:parse(V),
+ I1#listitem{
+ type = jid,
+ value = jlib:short_prepd_jid(JID)}
+ catch
+ _ ->
+ false
end;
"group" ->
I1#listitem{type = group,
@@ -473,7 +473,7 @@ parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) ->
false
end
end;
- {{value, _}, false} ->
+ {T, false} when is_list(T) ->
false;
_ ->
I1
@@ -482,7 +482,7 @@ parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) ->
false ->
false;
_ ->
- case parse_matches(I2, xml:remove_cdata(SubEls)) of
+ case parse_matches(I2, exmpp_xml:get_child_elements(El)) of
false ->
false;
I3 ->
@@ -504,15 +504,15 @@ parse_matches(Item, Els) ->
parse_matches1(Item, []) ->
Item;
-parse_matches1(Item, [{xmlelement, "message", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = message} | Els]) ->
parse_matches1(Item#listitem{match_message = true}, Els);
-parse_matches1(Item, [{xmlelement, "iq", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = iq} | Els]) ->
parse_matches1(Item#listitem{match_iq = true}, Els);
-parse_matches1(Item, [{xmlelement, "presence-in", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = 'presence-in'} | Els]) ->
parse_matches1(Item#listitem{match_presence_in = true}, Els);
-parse_matches1(Item, [{xmlelement, "presence-out", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = 'presence-out'} | Els]) ->
parse_matches1(Item#listitem{match_presence_out = true}, Els);
-parse_matches1(_Item, [{xmlelement, _, _, _} | _Els]) ->
+parse_matches1(_Item, [#xmlel{} | _Els]) ->
false.
@@ -531,25 +531,31 @@ is_list_needdb(Items) ->
end
end, Items).
-get_user_list(_, User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- case catch mnesia:dirty_read(privacy, {LUser, LServer}) of
- [] ->
- #userlist{};
- [#privacy{default = Default, lists = Lists}] ->
- case Default of
- none ->
- #userlist{};
- _ ->
- case lists:keysearch(Default, 1, Lists) of
- {value, {_, List}} ->
- NeedDb = is_list_needdb(List),
- #userlist{name = Default, list = List, needdb = NeedDb};
- _ ->
- #userlist{}
- end
- end;
+get_user_list(_, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(User),
+ LServer = binary_to_list(Server),
+ case catch mnesia:dirty_read(privacy, {LUser, LServer}) of
+ [] ->
+ #userlist{};
+ [#privacy{default = Default, lists = Lists}] ->
+ case Default of
+ none ->
+ #userlist{};
+ _ ->
+ case lists:keysearch(Default, 1, Lists) of
+ {value, {_, List}} ->
+ SortedList = lists:keysort(#listitem.order, List),
+ #userlist{name = Default, list = SortedList};
+ _ ->
+ #userlist{}
+ end
+ end;
+ _ ->
+ #userlist{}
+ end
+ catch
_ ->
#userlist{}
end.
@@ -560,20 +566,23 @@ get_user_list(_, User, Server) ->
%% If Dir = in, User@Server is the destination account (To).
check_packet(_, User, Server,
#userlist{list = List, needdb = NeedDb},
- {From, To, {xmlelement, PName, Attrs, _}},
- Dir) ->
+ {From, To, #xmlel{name = PName} = El},
+ Dir) when
+ PName =:= message ;
+ PName =:= iq ;
+ PName =:= presence ->
case List of
[] ->
allow;
_ ->
PType = case PName of
- "message" -> message;
- "iq" -> iq;
- "presence" ->
- case xml:get_attr_s("type", Attrs) of
+ 'message' -> message;
+ 'iq' -> iq;
+ 'presence' ->
+ case exmpp_xml:get_attribute(El, type, '') of
%% notification
- "" -> presence;
- "unavailable" -> presence;
+ '' -> presence;
+ 'unavailable' -> presence;
%% subscribe, subscribed, unsubscribe,
%% unsubscribed, error, probe, or other
_ -> other
@@ -587,13 +596,13 @@ check_packet(_, User, Server,
{_, _} -> other
end,
LJID = case Dir of
- in -> jlib:jid_tolower(From);
- out -> jlib:jid_tolower(To)
+ in -> From;
+ out -> To
end,
{Subscription, Groups} =
case NeedDb of
true -> ejabberd_hooks:run_fold(roster_get_jid_info,
- jlib:nameprep(Server),
+ exmpp_stringprep:nameprep(Server),
{none, []},
[User, Server, LJID]);
false -> {[], []}
@@ -646,27 +655,14 @@ is_ptype_match(Item, PType) ->
end.
+%% TODO: Investigate this: sometimes Value has binaries, other times has strings
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;
+ {User, Server, Resource} = Value,
+ ((User == undefined) orelse (User == []) orelse (User == exmpp_jid:prep_node(JID)))
+ andalso ((Server == undefined) orelse (Server == []) orelse (Server == exmpp_jid:prep_domain(JID)))
+ andalso ((Resource == undefined) orelse (Resource == []) orelse (Resource == exmpp_jid:prep_resource(JID)));
subscription ->
Value == Subscription;
group ->
@@ -675,8 +671,8 @@ is_type_match(Type, Value, JID, Subscription, Groups) ->
remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
F = fun() ->
mnesia:delete({privacy,
{LUser, LServer}})
@@ -699,7 +695,7 @@ update_table() ->
Fields = record_info(fields, privacy),
case mnesia:table_info(privacy, attributes) of
Fields ->
- ok;
+ convert_to_exmpp();
[user, default, lists] ->
?INFO_MSG("Converting privacy table from "
"{user, default, lists} format", []),
@@ -715,10 +711,12 @@ update_table() ->
F1 = fun() ->
mnesia:write_lock_table(mod_privacy_tmp_table),
mnesia:foldl(
- fun(#privacy{us = U} = R, _) ->
+ fun(#privacy{us = U, lists = L} = R, _) ->
+ U1 = convert_jid_to_exmpp(U),
+ L1 = convert_lists_to_exmpp(L),
mnesia:dirty_write(
mod_privacy_tmp_table,
- R#privacy{us = {U, Host}})
+ R#privacy{us = {U1, Host}, lists = L1})
end, ok, privacy)
end,
mnesia:transaction(F1),
@@ -738,3 +736,42 @@ update_table() ->
end.
+convert_to_exmpp() ->
+ Fun = fun() ->
+ mnesia:foldl(fun convert_to_exmpp2/2, done, privacy, write)
+ end,
+ mnesia:transaction(Fun).
+
+convert_to_exmpp2(#privacy{us = {U, S} = Key, lists = L} = P, Acc) ->
+ U1 = convert_jid_to_exmpp(U),
+ L1 = convert_lists_to_exmpp(L),
+ New_P = P#privacy{
+ us = {U1, S},
+ lists = L1
+ },
+ if
+ New_P /= P -> mnesia:delete({privacy, Key}), mnesia:write(New_P);
+ true -> ok
+ end,
+ Acc.
+
+convert_jid_to_exmpp("") -> undefined;
+convert_jid_to_exmpp(V) -> V.
+
+convert_lists_to_exmpp(L) ->
+ convert_lists_to_exmpp2(L, []).
+
+convert_lists_to_exmpp2([{Name, List} | Rest], Result) ->
+ convert_lists_to_exmpp2(Rest,
+ [{Name, convert_list_to_exmpp(List, [])} | Result]);
+convert_lists_to_exmpp2([], Result) ->
+ lists:reverse(Result).
+
+convert_list_to_exmpp([#listitem{type = jid, value = {U, S, R}} = I | Rest],
+ Result) ->
+ U1 = convert_jid_to_exmpp(U),
+ R1 = convert_jid_to_exmpp(R),
+ New_I = I#listitem{value = {U1, S, R1}},
+ convert_list_to_exmpp(Rest, [New_I | Result]);
+convert_list_to_exmpp([], Result) ->
+ lists:reverse(Result).
diff --git a/src/mod_privacy_odbc.erl b/src/mod_privacy_odbc.erl
index 60cbb97d5..e38b4734b 100644
--- a/src/mod_privacy_odbc.erl
+++ b/src/mod_privacy_odbc.erl
@@ -38,64 +38,66 @@
remove_user/2,
updated_list/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_privacy.hrl").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- ejabberd_hooks:add(privacy_iq_get, Host,
+ ejabberd_hooks:add(privacy_iq_get, HostB,
?MODULE, process_iq_get, 50),
- ejabberd_hooks:add(privacy_iq_set, Host,
+ ejabberd_hooks:add(privacy_iq_set, HostB,
?MODULE, process_iq_set, 50),
- ejabberd_hooks:add(privacy_get_user_list, Host,
+ ejabberd_hooks:add(privacy_get_user_list, HostB,
?MODULE, get_user_list, 50),
- ejabberd_hooks:add(privacy_check_packet, Host,
+ ejabberd_hooks:add(privacy_check_packet, HostB,
?MODULE, check_packet, 50),
- ejabberd_hooks:add(privacy_updated_list, Host,
+ ejabberd_hooks:add(privacy_updated_list, HostB,
?MODULE, updated_list, 50),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVACY,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_PRIVACY,
?MODULE, process_iq, IQDisc).
stop(Host) ->
- ejabberd_hooks:delete(privacy_iq_get, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(privacy_iq_get, HostB,
?MODULE, process_iq_get, 50),
- ejabberd_hooks:delete(privacy_iq_set, Host,
+ ejabberd_hooks:delete(privacy_iq_set, HostB,
?MODULE, process_iq_set, 50),
- ejabberd_hooks:delete(privacy_get_user_list, Host,
+ ejabberd_hooks:delete(privacy_get_user_list, HostB,
?MODULE, get_user_list, 50),
- ejabberd_hooks:delete(privacy_check_packet, Host,
+ ejabberd_hooks:delete(privacy_check_packet, HostB,
?MODULE, check_packet, 50),
- ejabberd_hooks:delete(privacy_updated_list, Host,
+ ejabberd_hooks:delete(privacy_updated_list, HostB,
?MODULE, updated_list, 50),
- ejabberd_hooks:delete(remove_user, Host,
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_PRIVACY).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_PRIVACY).
-process_iq(_From, _To, IQ) ->
- SubEl = IQ#iq.sub_el,
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}.
+process_iq(_From, _To, IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
-process_iq_get(_, From, _To, #iq{sub_el = SubEl},
+process_iq_get(_, From, _To, #iq{payload = SubEl},
#userlist{name = Active}) ->
- #jid{luser = LUser, lserver = LServer} = From,
- {xmlelement, _, _, Els} = SubEl,
- case xml:remove_cdata(Els) of
+ LUser = exmpp_jid:prep_node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case exmpp_xml:get_child_elements(SubEl) of
[] ->
process_lists_get(LUser, LServer, Active);
- [{xmlelement, Name, Attrs, _SubEls}] ->
+ [#xmlel{name = Name} = Child] ->
case Name of
- "list" ->
- ListName = xml:get_attr("name", Attrs),
+ list ->
+ ListName = exmpp_xml:get_attribute_as_list(Child, name, false),
process_list_get(LUser, LServer, ListName);
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
@@ -110,40 +112,38 @@ process_lists_get(LUser, LServer, Active) ->
end,
case catch sql_get_privacy_list_names(LUser, LServer) of
{selected, ["name"], []} ->
- {result, [{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}], []}]};
+ {result, #xmlel{ns = ?NS_PRIVACY, name = 'query'}};
{selected, ["name"], Names} ->
LItems = lists:map(
fun({N}) ->
- {xmlelement, "list",
- [{"name", N}], []}
+ exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list}, name, N)
end, Names),
DItems =
case Default of
none ->
LItems;
_ ->
- [{xmlelement, "default",
- [{"name", Default}], []} | LItems]
+ [exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = default}, name, Default) | LItems]
end,
ADItems =
case Active of
none ->
DItems;
_ ->
- [{xmlelement, "active",
- [{"name", Active}], []} | DItems]
+ [exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = active}, name, Active) | DItems]
end,
- {result,
- [{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}],
- ADItems}]};
+ {result, #xmlel{ns = ?NS_PRIVACY, name = 'query', children = ADItems}};
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end.
-process_list_get(LUser, LServer, {value, Name}) ->
+process_list_get(_LUser, _LServer, false) ->
+ {error, 'bad-request'};
+
+process_list_get(LUser, LServer, Name) ->
case catch sql_get_privacy_list_id(LUser, LServer, Name) of
{selected, ["id"], []} ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, '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",
@@ -152,29 +152,29 @@ process_list_get(LUser, LServer, {value, Name}) ->
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}
+ ListEl = exmpp_xml:set_attribute(#xmlel{name = list,
+ ns = ?NS_PRIVACY,
+ children = LItems},
+ name,
+ Name),
+ {result, #xmlel{ns = ?NS_PRIVACY, name = 'query', children = [ListEl]}};
+ _ ->
+ {error, 'internal-server-error'}
end;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
- end;
+ {error, '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)}],
+ Attrs1 = [?XMLATTR('action', action_to_binary(Item#listitem.action)),
+ ?XMLATTR('order', order_to_binary(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)} |
+ [?XMLATTR('type', type_to_binary(Item#listitem.type)),
+ ?XMLATTR('value', value_to_binary(Type, Item#listitem.value)) |
Attrs1]
end,
SubEls = case Item#listitem.match_all of
@@ -183,59 +183,61 @@ item_to_xml(Item) ->
false ->
SE1 = case Item#listitem.match_iq of
true ->
- [{xmlelement, "iq", [], []}];
+ [#xmlel{ns = ?NS_PRIVACY, name = iq}];
false ->
[]
end,
SE2 = case Item#listitem.match_message of
true ->
- [{xmlelement, "message", [], []} | SE1];
+ [#xmlel{ns = ?NS_PRIVACY, name = message} | SE1];
false ->
SE1
end,
SE3 = case Item#listitem.match_presence_in of
true ->
- [{xmlelement, "presence-in", [], []} | SE2];
+ [#xmlel{ns = ?NS_PRIVACY, name = 'presence-in'} | SE2];
false ->
SE2
end,
SE4 = case Item#listitem.match_presence_out of
true ->
- [{xmlelement, "presence-out", [], []} | SE3];
+ [#xmlel{ns = ?NS_PRIVACY, name = 'presence-out'} | SE3];
false ->
SE3
end,
SE4
end,
- {xmlelement, "item", Attrs2, SubEls}.
+ exmpp_xml:set_attributes(#xmlel{ns = ?NS_PRIVACY, name = item, children = SubEls}, Attrs2).
-action_to_list(Action) ->
+action_to_binary(Action) ->
case Action of
- allow -> "allow";
- deny -> "deny"
+ allow -> <<"allow">>;
+ deny -> <<"deny">>
end.
-order_to_list(Order) ->
- integer_to_list(Order).
+order_to_binary(Order) ->
+ list_to_binary(integer_to_list(Order)).
-type_to_list(Type) ->
+type_to_binary(Type) ->
case Type of
- jid -> "jid";
- group -> "group";
- subscription -> "subscription"
+ jid -> <<"jid">>;
+ group -> <<"group">>;
+ subscription -> <<"subscription">>
end.
-value_to_list(Type, Val) ->
+value_to_binary(Type, Val) ->
case Type of
- jid -> jlib:jid_to_string(Val);
+ jid ->
+ {N, D, R} = Val,
+ exmpp_jid:to_binary(N, D, R);
group -> Val;
subscription ->
case Val of
- both -> "both";
- to -> "to";
- from -> "from";
- none -> "none"
+ both -> <<"both">>;
+ to -> <<"to">>;
+ from -> <<"from">>;
+ none -> <<"none">>
end
end.
@@ -249,40 +251,50 @@ list_to_action(S) ->
-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),
+process_iq_set(_, From, _To, #iq{payload = SubEl}) ->
+ LUser = exmpp_jid:prep_node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case exmpp_xml:get_child_elements(SubEl) of
+ [#xmlel{name = Name} = Child] ->
+ ListName = exmpp_xml:get_attribute_as_list(Child, 'name', false),
case Name of
- "list" ->
+ list ->
process_list_set(LUser, LServer, ListName,
- xml:remove_cdata(SubEls));
- "active" ->
+ exmpp_xml:get_child_elements(Child));
+ active ->
process_active_set(LUser, LServer, ListName);
- "default" ->
+ default ->
process_default_set(LUser, LServer, ListName);
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
-process_default_set(LUser, LServer, {value, Name}) ->
+process_default_set(LUser, LServer, false) ->
+ case catch sql_unset_default_privacy_list(LUser, LServer) of
+ {'EXIT', _Reason} ->
+ {error, 'internal_server_error'};
+ {error, _Reason} ->
+ {error, 'internal_server_error'};
+ _ ->
+ {result, []}
+ end;
+
+process_default_set(LUser, LServer, Name) ->
F = fun() ->
case sql_get_privacy_list_names_t(LUser) of
{selected, ["name"], []} ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
{selected, ["name"], Names} ->
- case lists:member({Name}, Names) of
+ case lists:member({Name}, Names) of
true ->
sql_set_default_privacy_list(LUser, Name),
{result, []};
false ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end
end
end,
@@ -292,24 +304,17 @@ process_default_set(LUser, LServer, {value, Name}) ->
{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, []}
+ {error, 'internal-server-error'}
end.
-process_active_set(LUser, LServer, {value, Name}) ->
+process_active_set(_LUser, _LServer, false) ->
+ {result, [], #userlist{}};
+
+process_active_set(LUser, LServer, Name) ->
case catch sql_get_privacy_list_id(LUser, LServer, Name) of
{selected, ["id"], []} ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, '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",
@@ -320,24 +325,21 @@ process_active_set(LUser, LServer, {value, Name}) ->
NeedDb = is_list_needdb(Items),
{result, [], #userlist{name = Name, list = Items, needdb = NeedDb}};
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
- end;
-
-process_active_set(_LUser, _LServer, false) ->
- {result, [], #userlist{}}.
+ {error, 'internal_server_error'}
+ end.
+process_list_set(_LUser, _LServer, false, _Els) ->
+ {error, 'bad-request'};
-
-
-process_list_set(LUser, LServer, {value, Name}, Els) ->
+process_list_set(LUser, LServer, Name, Els) ->
case parse_items(Els) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
remove ->
F =
fun() ->
@@ -346,10 +348,10 @@ process_list_set(LUser, LServer, {value, Name}, Els) ->
sql_remove_privacy_list(LUser, Name),
{result, []};
{selected, ["name"], [{Default}]} ->
- %% TODO: check active
+ % TODO: check active
if
Name == Default ->
- {error, ?ERR_CONFLICT};
+ {error, 'conflict'};
true ->
sql_remove_privacy_list(LUser, Name),
{result, []}
@@ -361,15 +363,15 @@ process_list_set(LUser, LServer, {value, Name}, Els) ->
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}]}),
+ exmpp_jid:make(LUser, LServer),
+ exmpp_jid:make(LUser, LServer),
+ #xmlel{name = 'broadcast',
+ children=[{privacy_list,
+ #userlist{name = Name, list = []},
+ Name}]}),
Res;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end;
List ->
RItems = lists:map(fun item_to_raw/1, List),
@@ -393,20 +395,18 @@ process_list_set(LUser, LServer, {value, Name}, Els) ->
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 = List},
- Name}]}),
+ exmpp_jid:make(LUser, LServer),
+ exmpp_jid:make(LUser, LServer),
+ #xmlel{name = 'broadcast',
+ children=[{privacy_list,
+ #userlist{name = Name, list = List},
+ Name}]}),
Res;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal_server_error'}
end
- end;
+ end.
-process_list_set(_LUser, _LServer, false, _Els) ->
- {error, ?ERR_BAD_REQUEST}.
parse_items([]) ->
@@ -417,16 +417,16 @@ 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
+parse_items([El = #xmlel{name = item} | Els], Res) ->
+ Type = exmpp_xml:get_attribute_as_list(El, type, false),
+ Value = exmpp_xml:get_attribute_as_list(El, value, false),
+ SAction =exmpp_xml:get_attribute_as_list(El, action, false),
+ SOrder = exmpp_xml:get_attribute_as_list(El, order, false),
+ Action = case catch list_to_action(SAction) of
{'EXIT', _} -> false;
Val -> Val
end,
- Order = case catch list_to_integer(element(2, SOrder)) of
+ Order = case catch list_to_integer(SOrder) of
{'EXIT', _} ->
false;
IntVal ->
@@ -441,16 +441,17 @@ parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) ->
(Action /= false) and (Order /= false) ->
I1 = #listitem{action = Action, order = Order},
I2 = case {Type, Value} of
- {{value, T}, {value, V}} ->
+ {T, V} when is_list(T), is_list(V) ->
case T of
"jid" ->
- case jlib:string_to_jid(V) of
- error ->
- false;
- JID ->
- I1#listitem{
- type = jid,
- value = jlib:jid_tolower(JID)}
+ try
+ JID = exmpp_jid:parse(V),
+ I1#listitem{
+ type = jid,
+ value = jlib:short_prepd_jid(JID)}
+ catch
+ _ ->
+ false
end;
"group" ->
I1#listitem{type = group,
@@ -473,7 +474,7 @@ parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) ->
false
end
end;
- {{value, _}, false} ->
+ {T, false} when is_list(T) ->
false;
_ ->
I1
@@ -482,7 +483,7 @@ parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) ->
false ->
false;
_ ->
- case parse_matches(I2, xml:remove_cdata(SubEls)) of
+ case parse_matches(I2, exmpp_xml:get_child_elements(El)) of
false ->
false;
I3 ->
@@ -504,15 +505,15 @@ parse_matches(Item, Els) ->
parse_matches1(Item, []) ->
Item;
-parse_matches1(Item, [{xmlelement, "message", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = message} | Els]) ->
parse_matches1(Item#listitem{match_message = true}, Els);
-parse_matches1(Item, [{xmlelement, "iq", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = iq} | Els]) ->
parse_matches1(Item#listitem{match_iq = true}, Els);
-parse_matches1(Item, [{xmlelement, "presence-in", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = 'presence-in'} | Els]) ->
parse_matches1(Item#listitem{match_presence_in = true}, Els);
-parse_matches1(Item, [{xmlelement, "presence-out", _, _} | Els]) ->
+parse_matches1(Item, [#xmlel{name = 'presence-out'} | Els]) ->
parse_matches1(Item#listitem{match_presence_out = true}, Els);
-parse_matches1(_Item, [{xmlelement, _, _, _} | _Els]) ->
+parse_matches1(_Item, [#xmlel{} | _Els]) ->
false.
@@ -529,25 +530,30 @@ is_list_needdb(Items) ->
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;
+get_user_list(_, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(User),
+ LServer = binary_to_list(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
+ catch
_ ->
#userlist{}
end.
@@ -555,47 +561,45 @@ get_user_list(_, User, Server) ->
check_packet(_, User, Server,
#userlist{list = List, needdb = NeedDb},
- {From, To, {xmlelement, PName, _, _}},
- Dir) ->
+ {From, To, #xmlel{name = PName}},
+ Dir) when
+ PName =:= message ;
+ PName =:= iq ;
+ PName =:= presence ->
case List of
[] ->
allow;
_ ->
- PType = case PName of
- "message" -> message;
- "iq" -> iq;
- "presence" -> presence
- end,
- case {PType, Dir} of
+ case {PName, Dir} of
{message, in} ->
- LJID = jlib:jid_tolower(From),
+ LJID = jlib:short_prepd_jid(From),
{Subscription, Groups} =
case NeedDb of
- true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
+ true -> ejabberd_hooks:run_fold(roster_get_jid_info, Server, {none, []}, [User, Server, LJID]);
false -> {[], []}
end,
check_packet_aux(List, message,
LJID, Subscription, Groups);
{iq, in} ->
- LJID = jlib:jid_tolower(From),
+ LJID = jlib:short_prepd_jid(From),
{Subscription, Groups} =
case NeedDb of
- true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
+ true -> ejabberd_hooks:run_fold(roster_get_jid_info, Server, {none, []}, [User, Server, LJID]);
false -> {[], []}
end,
check_packet_aux(List, iq,
LJID, Subscription, Groups);
{presence, in} ->
- LJID = jlib:jid_tolower(From),
+ LJID = jlib:short_prepd_jid(From),
{Subscription, Groups} =
case NeedDb of
- true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
+ true -> ejabberd_hooks:run_fold(roster_get_jid_info, Server, {none, []}, [User, Server, LJID]);
false -> {[], []}
end,
check_packet_aux(List, presence_in,
LJID, Subscription, Groups);
{presence, out} ->
- LJID = jlib:jid_tolower(To),
+ LJID = jlib:short_prepd_jid(To),
{Subscription, Groups} =
case NeedDb of
true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
@@ -650,27 +654,14 @@ is_ptype_match(Item, PType) ->
end.
+%% TODO: Investigate this: sometimes Value has binaries, other times has strings
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;
+ {User, Server, Resource} = Value,
+ ((User == undefined) orelse (User == []) orelse (User == exmpp_jid:prep_node(JID)))
+ andalso ((Server == undefined) orelse (Server == []) orelse (Server == exmpp_jid:prep_domain(JID)))
+ andalso ((Resource == undefined) orelse (Resource == []) orelse (Resource == exmpp_jid:prep_resource(JID)));
subscription ->
Value == Subscription;
group ->
@@ -679,9 +670,9 @@ is_type_match(Type, Value, JID, Subscription, Groups) ->
remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- sql_del_privacy_lists(LUser, LServer).
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ sql_del_privacy_lists(binary_to_list(LUser), binary_to_list(LServer)).
updated_list(_,
@@ -702,10 +693,8 @@ raw_to_item({SType, SValue, SAction, SOrder, SMatchAll, SMatchIQ,
"n" ->
{none, none};
"j" ->
- case jlib:string_to_jid(SValue) of
- #jid{} = JID ->
- {jid, jlib:jid_tolower(JID)}
- end;
+ JID = exmpp_jid:parse(SValue),
+ {jid, jlib:short_prepd_jid(JID)};
"g" ->
{group, SValue};
"s" ->
@@ -757,7 +746,8 @@ item_to_raw(#listitem{type = Type,
none ->
{"n", ""};
jid ->
- {"j", jlib:jid_to_string(Value)};
+ {N0, D0, R0} = Value,
+ {"j", exmpp_jid:to_list(N0, D0, R0)};
group ->
{"g", Value};
subscription ->
diff --git a/src/mod_private.erl b/src/mod_private.erl
index ab4015fa6..2e62669e3 100644
--- a/src/mod_private.erl
+++ b/src/mod_private.erl
@@ -34,74 +34,118 @@
process_sm_iq/3,
remove_user/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-record(private_storage, {usns, xml}).
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
mnesia:create_table(private_storage,
[{disc_only_copies, [node()]},
{attributes, record_info(fields, private_storage)}]),
update_table(),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVATE,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_PRIVATE,
?MODULE, process_sm_iq, IQDisc).
stop(Host) ->
- ejabberd_hooks:delete(remove_user, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_PRIVATE).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_PRIVATE).
-process_sm_iq(From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
- #jid{luser = LUser, lserver = LServer} = From,
- case lists:member(LServer, ?MYHOSTS) of
- true ->
- {xmlelement, Name, Attrs, Els} = SubEl,
+process_sm_iq(From, To, #iq{type = Type} = IQ_Rec) ->
+ case check_packet(From, To, IQ_Rec) of
+ ok ->
case Type of
set ->
- F = fun() ->
- lists:foreach(
- fun(El) ->
- set_data(LUser, LServer, El)
- end, Els)
- end,
- mnesia:transaction(F),
- IQ#iq{type = result,
- sub_el = [{xmlelement, Name, Attrs, []}]};
+ process_iq_set(From, To, IQ_Rec);
get ->
- case catch get_data(LUser, LServer, Els) of
- {'EXIT', _Reason} ->
- IQ#iq{type = error,
- sub_el = [SubEl,
- ?ERR_INTERNAL_SERVER_ERROR]};
- Res ->
- IQ#iq{type = result,
- sub_el = [{xmlelement, Name, Attrs, Res}]}
- end
+ process_iq_get(From, To, IQ_Rec)
end;
- false ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
+ {error, Error} ->
+ exmpp_iq:error(IQ_Rec, Error)
+ end.
+
+process_iq_get(From, _To, #iq{payload = SubEl} = IQ_Rec) ->
+ LUser = exmpp_jid:prep_node(From),
+ LServer = exmpp_jid:prep_domain(From),
+ case catch get_data(LUser,
+ LServer,
+ exmpp_xml:get_child_elements(SubEl)) of
+ {'EXIT', _Reason} ->
+ {error, 'internal-server-error'};
+ Res ->
+ exmpp_iq:result(IQ_Rec, #xmlel{ns = ?NS_PRIVATE,
+ name = 'query',
+ children = Res})
+ end.
+
+
+process_iq_set(From, _To, #iq{payload = SubEl} = IQ_Rec) ->
+ LUser = exmpp_jid:prep_node(From),
+ LServer = exmpp_jid:prep_domain(From),
+ F = fun() ->
+ lists:foreach(
+ fun(El) ->
+ set_data(LUser, LServer, El)
+ end, exmpp_xml:get_child_elements(SubEl))
+ end,
+ mnesia:transaction(F),
+ exmpp_iq:result(IQ_Rec).
+
+
+check_packet(From, To, IQ_Rec) ->
+ check_packet(From, To, IQ_Rec, [ fun check_domain/3,
+ fun check_user/3,
+ fun check_ns/3]).
+check_packet(_From, _To, _IQ_Rec, []) ->
+ ok;
+check_packet(From, To, IQ_Rec, [F | R]) ->
+ case F(From, To, IQ_Rec) of
+ {error, _} = Error -> Error;
+ ok -> check_packet(From, To, IQ_Rec, R)
+ end.
+
+check_domain(From, _To, _IQ_Rec) ->
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case lists:member(LServer, ?MYHOSTS) of
+ true -> ok;
+ false -> {error, 'not-allowed'}
+ end.
+
+% the iq can't be directed to another jid
+check_user(From, To, _IQ_Rec) ->
+ case exmpp_jid:bare_compare(From, To) of
+ true -> ok;
+ false -> {error, 'forbidden'}
+ end.
+
+%there must be at least one child, and every child should have
+%a namespace specified (reject if the namespace is jabber:iq:private,
+%the same than the parent element).
+check_ns(_From, _To, #iq{payload = SubEl}) ->
+ case exmpp_xml:get_child_elements(SubEl) of
+ [] ->
+ {error, 'not-acceptable'};
+ Children ->
+ case lists:any(fun(Child) ->
+ exmpp_xml:get_ns_as_atom(Child) =:= ?NS_PRIVATE
+ end, Children) of
+ true -> {error, 'not-acceptable'};
+ false -> ok
+ end
end.
set_data(LUser, LServer, El) ->
- case El of
- {xmlelement, _Name, Attrs, _Els} ->
- XMLNS = xml:get_attr_s("xmlns", Attrs),
- case XMLNS of
- "" ->
- ignore;
- _ ->
- mnesia:write(
- #private_storage{usns = {LUser, LServer, XMLNS},
- xml = El})
- end;
- _ ->
- ignore
- end.
+ XMLNS = exmpp_xml:get_ns_as_atom(El),
+ mnesia:write(#private_storage{usns = {LUser, LServer, XMLNS},
+ xml = El}).
get_data(LUser, LServer, Els) ->
get_data(LUser, LServer, Els, []).
@@ -109,45 +153,46 @@ get_data(LUser, LServer, Els) ->
get_data(_LUser, _LServer, [], Res) ->
lists:reverse(Res);
get_data(LUser, LServer, [El | Els], Res) ->
- case El of
- {xmlelement, _Name, Attrs, _} ->
- XMLNS = xml:get_attr_s("xmlns", Attrs),
- case mnesia:dirty_read(private_storage, {LUser, LServer, XMLNS}) of
- [R] ->
- get_data(LUser, LServer, Els,
- [R#private_storage.xml | Res]);
- [] ->
- get_data(LUser, LServer, Els,
- [El | Res])
- end;
- _ ->
- get_data(LUser, LServer, Els, Res)
+ XMLNS = exmpp_xml:get_ns_as_atom(El),
+ case mnesia:dirty_read(private_storage, {LUser, LServer, XMLNS}) of
+ [R] ->
+ get_data(LUser, LServer, Els,
+ [R#private_storage.xml | Res]);
+ [] ->
+ get_data(LUser, LServer, Els,
+ [El | Res])
end.
-remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- F = fun() ->
- Namespaces = mnesia:select(
- private_storage,
- [{#private_storage{usns={LUser, LServer, '$1'},
- _ = '_'},
- [],
- ['$$']}]),
- lists:foreach(
- fun([Namespace]) ->
- mnesia:delete({private_storage,
- {LUser, LServer, Namespace}})
- end, Namespaces)
- end,
- mnesia:transaction(F).
+remove_user(User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ F = fun() ->
+ Namespaces = mnesia:select(
+ private_storage,
+ [{#private_storage{usns = {LUser, LServer, '$1'},
+ _ = '_'},
+ [],
+ ['$$']}]),
+ lists:foreach(
+ fun([Namespace]) ->
+ mnesia:delete({private_storage,
+ {LUser, LServer, Namespace}})
+ end, Namespaces)
+ end,
+ mnesia:transaction(F)
+ catch
+ _ ->
+ ok
+ end.
update_table() ->
Fields = record_info(fields, private_storage),
case mnesia:table_info(private_storage, attributes) of
Fields ->
- ok;
+ convert_to_exmpp();
[userns, xml] ->
?INFO_MSG("Converting private_storage table from "
"{user, default, lists} format", []),
@@ -163,10 +208,14 @@ update_table() ->
F1 = fun() ->
mnesia:write_lock_table(mod_private_tmp_table),
mnesia:foldl(
- fun(#private_storage{usns = {U, NS}} = R, _) ->
+ fun(#private_storage{usns = {U, NS}, xml = El} = R, _) ->
+ NS1 = list_to_atom(NS),
+ El0 = exmpp_xml:xmlelement_to_xmlel(El,
+ [?NS_PRIVATE], [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ El1 = exmpp_xml:remove_whitespaces_deeply(El0),
mnesia:dirty_write(
mod_private_tmp_table,
- R#private_storage{usns = {U, Host, NS}})
+ R#private_storage{usns = {U, Host, NS1}, xml = El1})
end, ok, private_storage)
end,
mnesia:transaction(F1),
@@ -186,3 +235,30 @@ update_table() ->
end.
+convert_to_exmpp() ->
+ Fun = fun() ->
+ case mnesia:first(private_storage) of
+ '$end_of_table' ->
+ none;
+ {U, _S, _NS} when is_binary(U) ->
+ none;
+ {U, _S, _NS} when is_list(U) ->
+ mnesia:foldl(fun convert_to_exmpp2/2,
+ done, private_storage, write)
+ end
+ end,
+ mnesia:transaction(Fun).
+
+convert_to_exmpp2(#private_storage{usns = {U, S, NS} = Key, xml = El} = R,
+ Acc) ->
+ mnesia:delete({private_storage, Key}),
+ U1 = list_to_binary(U),
+ S1 = list_to_binary(S),
+ NS1 = list_to_atom(NS),
+ El1 = exmpp_xml:xmlelement_to_xmlel(El,
+ [?NS_PRIVATE], [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ New_R = R#private_storage{
+ usns = {U1, S1, NS1},
+ xml = El1},
+ mnesia:write(New_R),
+ Acc.
diff --git a/src/mod_private_odbc.erl b/src/mod_private_odbc.erl
index 613ea5821..ecd2a4050 100644
--- a/src/mod_private_odbc.erl
+++ b/src/mod_private_odbc.erl
@@ -34,103 +34,148 @@
process_sm_iq/3,
remove_user/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVATE,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_PRIVATE,
?MODULE, process_sm_iq, IQDisc).
stop(Host) ->
- ejabberd_hooks:delete(remove_user, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_PRIVATE).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_PRIVATE).
-process_sm_iq(From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
- #jid{luser = LUser, lserver = LServer} = From,
- case lists:member(LServer, ?MYHOSTS) of
- true ->
- {xmlelement, Name, Attrs, Els} = SubEl,
+process_sm_iq(From, To, #iq{type = Type} = IQ_Rec) ->
+ case check_packet(From, To, IQ_Rec) of
+ ok ->
case Type of
set ->
- F = fun() ->
- lists:foreach(
- fun(El) ->
- set_data(LUser, LServer, El)
- end, Els)
- end,
- odbc_queries:sql_transaction(LServer, F),
- IQ#iq{type = result,
- sub_el = [{xmlelement, Name, Attrs, []}]};
+ process_iq_set(From, To, IQ_Rec);
get ->
- case catch get_data(LUser, LServer, Els) of
- {'EXIT', _Reason} ->
- IQ#iq{type = error,
- sub_el = [SubEl,
- ?ERR_INTERNAL_SERVER_ERROR]};
- Res ->
- IQ#iq{type = result,
- sub_el = [{xmlelement, Name, Attrs, Res}]}
- end
+ process_iq_get(From, To, IQ_Rec)
end;
- false ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
+ {error, Error} ->
+ exmpp_iq:error(IQ_Rec, Error)
end.
-set_data(LUser, LServer, El) ->
- case El of
- {xmlelement, _Name, Attrs, _Els} ->
- XMLNS = xml:get_attr_s("xmlns", Attrs),
- case XMLNS of
- "" ->
- ignore;
- _ ->
- Username = ejabberd_odbc:escape(LUser),
- LXMLNS = ejabberd_odbc:escape(XMLNS),
- SData = ejabberd_odbc:escape(
- lists:flatten(xml:element_to_string(El))),
- odbc_queries:set_private_data(LServer, Username, LXMLNS, SData)
- end;
- _ ->
- ignore
+process_iq_get(From, _To, #iq{payload = SubEl} = IQ_Rec) ->
+ LUser = exmpp_jid:prep_node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case catch get_data(LUser,
+ LServer,
+ exmpp_xml:get_child_elements(SubEl)) of
+ {'EXIT', _Reason} ->
+ {error, 'internal-server-error'};
+ Res ->
+ exmpp_iq:result(IQ_Rec, #xmlel{ns = ?NS_PRIVATE,
+ name = 'query',
+ children = Res})
end.
+
+process_iq_set(From, _To, #iq{payload = SubEl} = IQ_Rec) ->
+ LUser = exmpp_jid:prep_node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ F = fun() ->
+ lists:foreach(
+ fun(El) ->
+ set_data(LUser, LServer, El)
+ end, exmpp_xml:get_child_elements(SubEl))
+ end,
+ odbc_queries:sql_transaction(LServer, F),
+ exmpp_iq:result(IQ_Rec).
+
+
+check_packet(From, To, IQ_Rec) ->
+ check_packet(From, To, IQ_Rec, [ fun check_domain/3,
+ fun check_user/3,
+ fun check_ns/3]).
+check_packet(_From, _To, _IQ_Rec, []) ->
+ ok;
+check_packet(From, To, IQ_Rec, [F | R]) ->
+ case F(From, To, IQ_Rec) of
+ {error, _} = Error -> Error;
+ ok -> check_packet(From, To, IQ_Rec, R)
+ end.
+
+check_domain(From, _To, _IQ_Rec) ->
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case lists:member(LServer, ?MYHOSTS) of
+ true -> ok;
+ false -> {error, 'not-allowed'}
+ end.
+
+% the iq can't be directed to another jid
+check_user(From, To, _IQ_Rec) ->
+ case exmpp_jid:bare_compare(From, To) of
+ true -> ok;
+ false -> {error, 'forbidden'}
+ end.
+
+%there must be at least one child, and every child should have
+%a namespace specified (reject if the namespace is jabber:iq:private,
+%the same than the parent element).
+check_ns(_From, _To, #iq{payload = SubEl}) ->
+ case exmpp_xml:get_child_elements(SubEl) of
+ [] ->
+ {error, 'not-acceptable'};
+ Children ->
+ case lists:any(fun(Child) ->
+ exmpp_xml:get_ns_as_atom(Child) =:= ?NS_PRIVATE
+ end, Children) of
+ true -> {error, 'not-acceptable'};
+ false -> ok
+ end
+ end.
+
+
+
+set_data(LUser, LServer, El) ->
+ XMLNS = exmpp_xml:get_ns_as_list(El),
+ Username = ejabberd_odbc:escape(LUser),
+ LXMLNS = ejabberd_odbc:escape(XMLNS),
+ SData = ejabberd_odbc:escape(exmpp_xml:document_to_list(El)),
+ odbc_queries:set_private_data(LServer, Username, LXMLNS, SData).
+
get_data(LUser, LServer, Els) ->
get_data(LUser, LServer, Els, []).
get_data(_LUser, _LServer, [], Res) ->
lists:reverse(Res);
get_data(LUser, LServer, [El | Els], Res) ->
- case El of
- {xmlelement, _Name, Attrs, _} ->
- XMLNS = xml:get_attr_s("xmlns", Attrs),
- Username = ejabberd_odbc:escape(LUser),
- LXMLNS = ejabberd_odbc:escape(XMLNS),
- case catch odbc_queries:get_private_data(LServer, Username, LXMLNS) of
- {selected, ["data"], [{SData}]} ->
- case xml_stream:parse_element(SData) of
- Data when element(1, Data) == xmlelement ->
- get_data(LUser, LServer, Els,
- [Data | Res])
- end;
- %% MREMOND: I wonder when the query could return a vcard ?
- {selected, ["vcard"], []} ->
- get_data(LUser, LServer, Els,
- [El | Res]);
- _ ->
- get_data(LUser, LServer, Els,[El | Res])
- end;
- _ ->
- get_data(LUser, LServer, Els, Res)
- end.
-
-
-remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ XMLNS = exmpp_xml:get_ns_as_list(El),
Username = ejabberd_odbc:escape(LUser),
- odbc_queries:del_user_private_storage(LServer, Username).
+ LXMLNS = ejabberd_odbc:escape(XMLNS),
+ case catch odbc_queries:get_private_data(LServer, Username, LXMLNS) of
+ {selected, ["data"], [{SData}]} ->
+ [Data] = exmpp_xml:parse_document(SData,
+ [names_as_atom, {check_elems, xmpp},
+ {check_nss,xmpp}, {check_attrs,xmpp}]),
+ get_data(LUser, LServer, Els, [Data | Res]);
+ %% MREMOND: I wonder when the query could return a vcard ?
+ {selected, ["vcard"], []} ->
+ get_data(LUser, LServer, Els,
+ [El | Res]);
+ _ ->
+ get_data(LUser, LServer, Els, [El | Res])
+end.
+
+
+remove_user(User, Server) when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(exmpp_stringprep:nodeprep(User)),
+ LServer = binary_to_list(exmpp_stringprep:nameprep(Server)),
+ Username = ejabberd_odbc:escape(LUser),
+ odbc_queries:del_user_private_storage(LServer, Username)
+ catch
+ _ ->
+ ok
+ end.
diff --git a/src/mod_proxy65/mod_proxy65_service.erl b/src/mod_proxy65/mod_proxy65_service.erl
index d88670f65..58a30f980 100644
--- a/src/mod_proxy65/mod_proxy65_service.erl
+++ b/src/mod_proxy65/mod_proxy65_service.erl
@@ -41,8 +41,9 @@
%% API.
-export([start_link/2, add_listener/2, delete_listener/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-define(PROCNAME, ejabberd_mod_proxy65_service).
@@ -74,14 +75,15 @@ terminate(_Reason, #state{myhost=MyHost}) ->
ejabberd_router:unregister_route(MyHost),
ok.
-handle_info({route, From, To, {xmlelement, "iq", _, _} = Packet}, State) ->
- IQ = jlib:iq_query_info(Packet),
- case catch process_iq(From, IQ, State) of
- Result when is_record(Result, iq) ->
- ejabberd_router:route(To, From, jlib:iq_to_xml(Result));
+handle_info({route, From, To, Packet}, State) when ?IS_IQ(Packet) ->
+ IQ_Rec = exmpp_iq:xmlel_to_iq(Packet),
+ case catch process_iq(From, IQ_Rec, State) of
+ Result when ?IS_IQ_RECORD(Result) ->
+ ejabberd_router:route(To, From,
+ exmpp_iq:iq_to_xmlel(Result, To, From));
{'EXIT', Reason} ->
?ERROR_MSG("Error when processing IQ stanza: ~p", [Reason]),
- Err = jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR),
+ Err = exmpp_iq:error(Packet, 'internal-server-error'),
ejabberd_router:route(To, From, Err);
_ ->
ok
@@ -120,71 +122,76 @@ delete_listener(Host) ->
%%%------------------------
%% disco#info request
-process_iq(_, #iq{type = get, xmlns = ?NS_DISCO_INFO, lang = Lang} = IQ,
- #state{name=Name, serverhost=ServerHost}) ->
+process_iq(_, #iq{type = get, ns = ?NS_DISCO_INFO, lang = Lang} = IQ_Rec,
+ #state{name=Name, serverhost = ServerHost}) ->
+ ServerHostB = list_to_binary(ServerHost),
Info = ejabberd_hooks:run_fold(
- disco_info, ServerHost, [], [ServerHost, ?MODULE, "", ""]),
- IQ#iq{type = result, sub_el =
- [{xmlelement, "query", [{"xmlns", ?NS_DISCO_INFO}],
- iq_disco_info(Lang, Name) ++ Info}]};
+ disco_info, ServerHostB, [], [ServerHost, ?MODULE, <<>>, ""]),
+ Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
+ children = iq_disco_info(Lang, Name)++Info},
+ exmpp_iq:result(IQ_Rec, Result);
%% disco#items request
-process_iq(_, #iq{type = get, xmlns = ?NS_DISCO_ITEMS} = IQ, _) ->
- IQ#iq{type = result, sub_el =
- [{xmlelement, "query", [{"xmlns", ?NS_DISCO_ITEMS}], []}]};
+process_iq(_, #iq{type = get, ns = ?NS_DISCO_ITEMS} = IQ_Rec, _) ->
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS, name = 'query',
+ children = []},
+ exmpp_iq:result(IQ_Rec, Result);
%% vCard request
-process_iq(_, #iq{type = get, xmlns = ?NS_VCARD, lang = Lang} = IQ, _) ->
- IQ#iq{type = result, sub_el =
- [{xmlelement, "vCard", [{"xmlns", ?NS_VCARD}], iq_vcard(Lang)}]};
+process_iq(_, #iq{type = get, ns = ?NS_VCARD, lang = Lang} = IQ_Rec, _) ->
+ Result = #xmlel{ns = ?NS_VCARD, name = 'vCard',
+ children = iq_vcard(Lang)},
+ exmpp_iq:result(IQ_Rec, Result);
%% bytestreams info request
-process_iq(JID, #iq{type = get, sub_el = SubEl, xmlns = ?NS_BYTESTREAMS} = IQ,
+process_iq(JID, #iq{type = get, ns = ?NS_BYTESTREAMS} = IQ_Rec,
#state{acl = ACL, stream_addr = StreamAddr, serverhost = ServerHost}) ->
case acl:match_rule(ServerHost, ACL, JID) of
allow ->
- StreamHostEl = [{xmlelement, "streamhost", StreamAddr, []}],
- IQ#iq{type = result, sub_el =
- [{xmlelement, "query", [{"xmlns", ?NS_BYTESTREAMS}], StreamHostEl}]};
+ StreamHostEl = [#xmlel{ns = ?NS_BYTESTREAMS, name = 'streamhost',
+ attrs = StreamAddr}],
+ Result = #xmlel{ns = ?NS_BYTESTREAMS, name = 'query',
+ children = StreamHostEl},
+ exmpp_iq:result(IQ_Rec, Result);
deny ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_FORBIDDEN]}
+ exmpp_iq:error(IQ_Rec, 'forbidden')
end;
%% bytestream activation request
-process_iq(InitiatorJID, #iq{type = set, sub_el = SubEl, xmlns = ?NS_BYTESTREAMS} = IQ,
+process_iq(InitiatorJID, #iq{type = set, payload = SubEl, ns = ?NS_BYTESTREAMS} = IQ_Rec,
#state{acl = ACL, serverhost = ServerHost}) ->
case acl:match_rule(ServerHost, ACL, InitiatorJID) of
allow ->
- ActivateEl = xml:get_path_s(SubEl, [{elem, "activate"}]),
- SID = xml:get_tag_attr_s("sid", SubEl),
- case catch jlib:string_to_jid(xml:get_tag_cdata(ActivateEl)) of
- TargetJID when is_record(TargetJID, jid), SID /= "",
+ ActivateEl = exmpp_xml:get_path(SubEl, [{element, 'activate'}]),
+ SID = exmpp_xml:get_attribute_as_list(SubEl, 'sid', ""),
+ case catch exmpp_jid:parse(exmpp_xml:get_cdata_as_string(ActivateEl)) of
+ TargetJID when ?IS_JID(TargetJID), SID /= "",
length(SID) =< 128, TargetJID /= InitiatorJID ->
- Target = jlib:jid_to_string(jlib:jid_tolower(TargetJID)),
- Initiator = jlib:jid_to_string(jlib:jid_tolower(InitiatorJID)),
+ Target = exmpp_jid:prep_to_list(TargetJID),
+ Initiator = exmpp_jid:prep_to_list(InitiatorJID),
SHA1 = sha:sha(SID ++ Initiator ++ Target),
case mod_proxy65_sm:activate_stream(SHA1, InitiatorJID, TargetJID, ServerHost) of
ok ->
- IQ#iq{type = result, sub_el = []};
+ exmpp_iq:result(IQ_Rec);
false ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]};
+ exmpp_iq:error(IQ_Rec, 'item-not-found');
limit ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_RESOURCE_CONSTRAINT]};
+ exmpp_iq:error(IQ_Rec, 'resource-constraint');
conflict ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_CONFLICT]};
+ exmpp_iq:error(IQ_Rec, 'conflict');
_ ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
+ exmpp_iq:error(IQ_Rec, 'internal-server-error')
end;
_ ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_BAD_REQUEST]}
+ exmpp_iq:error(IQ_Rec, 'bad-request')
end;
deny ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_FORBIDDEN]}
+ exmpp_iq:error(IQ_Rec, 'forbidden')
end;
%% Unknown "set" or "get" request
-process_iq(_, #iq{type=Type, sub_el=SubEl} = IQ, _) when Type==get; Type==set ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_SERVICE_UNAVAILABLE]};
+process_iq(_, #iq{kind=request} = IQ_Rec, _) ->
+ exmpp_iq:error(IQ_Rec, 'service-unavailable');
%% IQ "result" or "error".
process_iq(_, _, _) ->
@@ -193,25 +200,26 @@ process_iq(_, _, _) ->
%%%-------------------------
%%% Auxiliary functions.
%%%-------------------------
--define(FEATURE(Feat), {xmlelement,"feature",[{"var", Feat}],[]}).
+-define(FEATURE(Feat), #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [?XMLATTR('var', Feat)]}).
iq_disco_info(Lang, Name) ->
- [{xmlelement, "identity",
- [{"category", "proxy"},
- {"type", "bytestreams"},
- {"name", translate:translate(Lang, Name)}], []},
- ?FEATURE(?NS_DISCO_INFO),
- ?FEATURE(?NS_VCARD),
- ?FEATURE(?NS_BYTESTREAMS)].
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', <<"proxy">>),
+ ?XMLATTR('type', <<"bytestreams">>),
+ ?XMLATTR('name', translate:translate(Lang, Name))]},
+ ?FEATURE(?NS_DISCO_INFO_s),
+ ?FEATURE(?NS_VCARD_s),
+ ?FEATURE(?NS_BYTESTREAMS_s)].
iq_vcard(Lang) ->
- [{xmlelement, "FN", [],
- [{xmlcdata, "ejabberd/mod_proxy65"}]},
- {xmlelement, "URL", [],
- [{xmlcdata, ?EJABBERD_URI}]},
- {xmlelement, "DESC", [],
- [{xmlcdata, translate:translate(Lang, "ejabberd SOCKS5 Bytestreams module") ++
- "\nCopyright (c) 2003-2009 Alexey Shchepin"}]}].
+ [#xmlel{ns = ?NS_VCARD, name = 'FN', children =
+ [#xmlcdata{cdata = <<"ejabberd/mod_proxy65">>}]},
+ #xmlel{ns = ?NS_VCARD, name = 'URL', children =
+ [#xmlcdata{cdata = list_to_binary(?EJABBERD_URI)}]},
+ #xmlel{ns = ?NS_VCARD, name = 'DESC', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "ejabberd SOCKS5 Bytestreams module") ++
+ "\nCopyright (c) 2003-2009 Alexey Shchepin")}]}].
parse_options(ServerHost, Opts) ->
MyHost = gen_mod:get_opt_host(ServerHost, Opts, "proxy.@HOST@"),
@@ -223,7 +231,7 @@ parse_options(ServerHost, Opts) ->
Addr -> Addr
end,
StrIP = inet_parse:ntoa(IP),
- StreamAddr = [{"jid", MyHost}, {"host", StrIP}, {"port", integer_to_list(Port)}],
+ StreamAddr = [?XMLATTR('jid', MyHost), ?XMLATTR('host', StrIP), ?XMLATTR('port', Port)],
#state{myhost = MyHost,
serverhost = ServerHost,
name = Name,
diff --git a/src/mod_proxy65/mod_proxy65_stream.erl b/src/mod_proxy65/mod_proxy65_stream.erl
index e1bc8ebe8..f8b421bbf 100644
--- a/src/mod_proxy65/mod_proxy65_stream.erl
+++ b/src/mod_proxy65/mod_proxy65_stream.erl
@@ -123,8 +123,8 @@ activate({P1, J1}, {P2, J2}) ->
{S1, S2} when is_port(S1), is_port(S2) ->
P1 ! {activate, P2, S2, J1, J2},
P2 ! {activate, P1, S1, J1, J2},
- JID1 = jlib:jid_to_string(J1),
- JID2 = jlib:jid_to_string(J2),
+ JID1 = exmpp_jid:to_list(J1),
+ JID2 = exmpp_jid:to_list(J2),
?INFO_MSG("(~w:~w) Activated bytestream for ~s -> ~s", [P1, P2, JID1, JID2]),
ok;
_ ->
diff --git a/src/mod_pubsub/gen_pubsub_nodetree.erl b/src/mod_pubsub/gen_pubsub_nodetree.erl
index 84cf8f61b..480b7e60b 100644
--- a/src/mod_pubsub/gen_pubsub_nodetree.erl
+++ b/src/mod_pubsub/gen_pubsub_nodetree.erl
@@ -47,8 +47,6 @@ behaviour_info(callbacks) ->
{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},
diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl
index d7d1fffe3..cce677b29 100644
--- a/src/mod_pubsub/mod_pubsub.erl
+++ b/src/mod_pubsub/mod_pubsub.erl
@@ -49,9 +49,10 @@
-behaviour(gen_server).
-behaviour(gen_mod).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-include("adhoc.hrl").
--include("jlib.hrl").
-include("pubsub.hrl").
-define(STDTREE, "tree").
@@ -136,6 +137,12 @@
plugins = [?STDNODE],
send_loop}).
+
+%%------------------- Ad hoc commands nodes --------------------------
+-define(NS_PUBSUB_GET_PENDING, "http://jabber.org/protocol/pubsub#get-pending").
+%%--------------------------------------------------------------------
+
+
%%====================================================================
%% API
%%====================================================================
@@ -165,9 +172,9 @@ stop(Host) ->
%%--------------------------------------------------------------------
%% Function: init(Args) -> {ok, State} |
-%% {ok, State, Timeout} |
-%% ignore |
-%% {stop, Reason}
+%% {ok, State, Timeout} |
+%% ignore |
+%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([ServerHost, Opts]) ->
@@ -178,39 +185,41 @@ init([ServerHost, Opts]) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
LastItemCache = gen_mod:get_opt(last_item_cache, Opts, false),
MaxItemsNode = gen_mod:get_opt(max_items_node, Opts, ?MAXITEMS),
+ ServerHostB = list_to_binary(ServerHost),
pubsub_index:init(Host, ServerHost, Opts),
ets:new(gen_mod:get_module_proc(Host, config), [set, named_table]),
ets:new(gen_mod:get_module_proc(ServerHost, config), [set, named_table]),
ets:new(gen_mod:get_module_proc(Host, last_items), [set, named_table]),
ets:new(gen_mod:get_module_proc(ServerHost, last_items), [set, named_table]),
{Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts),
- mod_disco:register_feature(ServerHost, ?NS_PUBSUB),
+ mod_disco:register_feature(ServerHost, ?NS_PUBSUB_s),
ets:insert(gen_mod:get_module_proc(Host, config), {nodetree, NodeTree}),
ets:insert(gen_mod:get_module_proc(Host, config), {plugins, Plugins}),
ets:insert(gen_mod:get_module_proc(Host, config), {last_item_cache, LastItemCache}),
ets:insert(gen_mod:get_module_proc(Host, config), {max_items_node, MaxItemsNode}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {nodetree, NodeTree}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {plugins, Plugins}),
- ets:insert(gen_mod:get_module_proc(ServerHost, config), {last_item_cache, Plugins}),
- ets:insert(gen_mod:get_module_proc(ServerHost, config), {max_items_node, LastItemCache}),
+ ets:insert(gen_mod:get_module_proc(ServerHost, config), {last_item_cache, LastItemCache}),
+ ets:insert(gen_mod:get_module_proc(ServerHost, config), {max_items_node, MaxItemsNode}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {pep_mapping, PepMapping}),
- ejabberd_hooks:add(disco_sm_identity, ServerHost, ?MODULE, disco_sm_identity, 75),
- ejabberd_hooks:add(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75),
- ejabberd_hooks:add(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75),
- ejabberd_hooks:add(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 80),
- ejabberd_hooks:add(roster_in_subscription, ServerHost, ?MODULE, in_subscription, 50),
- ejabberd_hooks:add(roster_out_subscription, ServerHost, ?MODULE, out_subscription, 50),
- ejabberd_hooks:add(remove_user, ServerHost, ?MODULE, remove_user, 50),
- ejabberd_hooks:add(anonymous_purge_hook, ServerHost, ?MODULE, remove_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER, ?MODULE, iq_sm, IQDisc),
+ ejabberd_hooks:add(disco_sm_identity, ServerHostB, ?MODULE, disco_sm_identity, 75),
+ ejabberd_hooks:add(disco_sm_features, ServerHostB, ?MODULE, disco_sm_features, 75),
+ ejabberd_hooks:add(disco_sm_items, ServerHostB, ?MODULE, disco_sm_items, 75),
+ ejabberd_hooks:add(presence_probe_hook, ServerHostB, ?MODULE, presence_probe, 80),
+ ejabberd_hooks:add(roster_in_subscription, ServerHostB, ?MODULE, in_subscription, 50),
+ ejabberd_hooks:add(roster_out_subscription, ServerHostB, ?MODULE, out_subscription, 50),
+ ejabberd_hooks:add(remove_user, ServerHostB, ?MODULE, remove_user, 50),
+ ejabberd_hooks:add(anonymous_purge_hook, ServerHostB, ?MODULE, remove_user, 50),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB_OWNER, ?MODULE, iq_sm, IQDisc),
+ ejabberd_router:register_route(Host),
case lists:member(?PEPNODE, Plugins) of
true ->
- ejabberd_hooks:add(disco_local_identity, ServerHost, ?MODULE, disco_local_identity, 75),
- ejabberd_hooks:add(disco_local_features, ServerHost, ?MODULE, disco_local_features, 75),
- ejabberd_hooks:add(disco_local_items, ServerHost, ?MODULE, disco_local_items, 75),
- gen_iq_handler:add_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB, ?MODULE, iq_local, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB_OWNER, ?MODULE, iq_local, IQDisc);
+ ejabberd_hooks:add(disco_local_identity, ServerHostB, ?MODULE, disco_local_identity, 75),
+ ejabberd_hooks:add(disco_local_features, ServerHostB, ?MODULE, disco_local_features, 75),
+ ejabberd_hooks:add(disco_local_items, ServerHostB, ?MODULE, disco_local_items, 75),
+ gen_iq_handler:add_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB, ?MODULE, iq_local, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB_OWNER, ?MODULE, iq_local, IQDisc);
false ->
ok
end,
@@ -272,7 +281,7 @@ init_nodes(Host, ServerHost, _NodeTree, Plugins) ->
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");
+ create_node(Host, ServerHost, string_to_node("/home" ++ ServerHost), service_jid(Host), "hometree");
false ->
ok
end.
@@ -405,26 +414,26 @@ update_node_database(Host, ServerHost) ->
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).
+ 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) ->
@@ -487,8 +496,8 @@ send_loop(State) ->
{presence, JID, Pid} ->
Host = State#state.host,
ServerHost = State#state.server_host,
- LJID = jlib:jid_tolower(JID),
- BJID = jlib:jid_remove_resource(LJID),
+ LJID = jlib:short_prepd_jid(JID),
+ BJID = jlib:short_prepd_bare_jid(JID),
%% 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) ->
@@ -517,7 +526,7 @@ send_loop(State) ->
%% 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),
+ {User, Server, Resource} = LJID,
case mod_caps:get_caps({User, Server, Resource}) of
nothing ->
%% we don't have caps, no need to handle PEP items
@@ -528,18 +537,18 @@ send_loop(State) ->
lists:foreach(
fun({U, S, R}) ->
case S of
- ServerHost -> %% local contacts
- case ejabberd_sm:get_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
+ ServerHost -> %% local contacts
+ case ejabberd_sm:get_user_resources(U, S) of
+ [] -> %% offline
+ PeerJID = exmpp_jid:make(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);
_ ->
@@ -563,7 +572,7 @@ send_loop(State) ->
true ->
Host = State#state.host,
ServerHost = State#state.server_host,
- Owner = jlib:jid_remove_resource(jlib:jid_tolower(JID)),
+ Owner = jlib:short_prepd_bare_jid(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 ->
@@ -613,37 +622,37 @@ send_loop(State) ->
identity(Host) ->
Identity = case lists:member(?PEPNODE, plugins(Host)) of
- true -> [{"category", "pubsub"}, {"type", "pep"}];
- false -> [{"category", "pubsub"}, {"type", "service"}]
+ true -> [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)];
+ false -> [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"service">>)]
end,
- {xmlelement, "identity", Identity, []}.
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = Identity}.
-disco_local_identity(Acc, _From, To, [], _Lang) ->
- Acc ++ [identity(To#jid.lserver)];
+disco_local_identity(Acc, _From, To, <<>>, _Lang) ->
+ Acc ++ [identity(exmpp_jid:prep_domain_as_list(To))];
disco_local_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
-disco_local_features(Acc, _From, To, [], _Lang) ->
- Host = To#jid.lserver,
+disco_local_features(Acc, _From, To, <<>>, _Lang) ->
+ Host = exmpp_jid:prep_domain_as_list(To),
Feats = case Acc of
{result, I} -> I;
_ -> []
end,
{result, Feats ++ lists:map(fun(Feature) ->
- ?NS_PUBSUB++"#"++Feature
+ ?NS_PUBSUB_s++"#"++Feature
end, features(Host, []))};
disco_local_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
-disco_local_items(Acc, _From, _To, [], _Lang) ->
+disco_local_items(Acc, _From, _To, <<>>, _Lang) ->
Acc;
disco_local_items(Acc, _From, _To, _Node, _Lang) ->
Acc.
-disco_sm_identity(Acc, _From, To, [], _Lang) ->
- Acc ++ [identity(To#jid.lserver)];
+disco_sm_identity(Acc, _From, To, <<>>, _Lang) ->
+ Acc ++ [identity(exmpp_jid:prep_domain_as_list(To))];
disco_sm_identity(Acc, From, To, Node, _Lang) ->
- LOwner = jlib:jid_tolower(jlib:jid_remove_resource(To)),
+ LOwner = jlib:short_prepd_bare_jid(To),
Acc ++ case node_disco_identity(LOwner, From, Node) of
{result, I} -> I;
_ -> []
@@ -652,7 +661,7 @@ disco_sm_identity(Acc, From, To, Node, _Lang) ->
disco_sm_features(Acc, _From, _To, [], _Lang) ->
Acc;
disco_sm_features(Acc, From, To, Node, _Lang) ->
- LOwner = jlib:jid_tolower(jlib:jid_remove_resource(To)),
+ LOwner = jlib:short_prepd_bare_jid(To),
Features = node_disco_features(LOwner, From, Node),
case {Acc, Features} of
{{result, AccFeatures}, {result, AddFeatures}} ->
@@ -663,36 +672,37 @@ disco_sm_features(Acc, From, To, Node, _Lang) ->
Acc
end.
-disco_sm_items(Acc, From, To, [], _Lang) ->
- Host = To#jid.lserver,
+disco_sm_items(Acc, From, To, <<>>, _Lang) ->
+ Host = exmpp_jid:prep_domain_as_list(To),
case tree_action(Host, get_subnodes, [Host, <<>>, From]) of
[] ->
Acc;
Nodes ->
- SBJID = jlib:jid_to_string(jlib:jid_remove_resource(To)),
+ SBJID = jlib:short_prepd_bare_jid(To),
Items = case Acc of
{result, I} -> I;
_ -> []
end,
NodeItems = lists:map(
fun(#pubsub_node{nodeid = {_, Node}}) ->
- {xmlelement, "item",
- [{"jid", SBJID}|nodeAttr(Node)],
- []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(SBJID)) | nodeAttr(Node)]}
end, Nodes),
{result, NodeItems ++ Items}
end;
-disco_sm_items(Acc, From, To, SNode, _Lang) ->
- Host = To#jid.lserver,
+disco_sm_items(Acc, From, To, NodeB, _Lang) ->
+ SNode = binary_to_list(NodeB),
Node = string_to_node(SNode),
+ %% TODO, use iq_disco_items(Host, Node, From)
+ Host = exmpp_jid:prep_domain_as_list(To),
+ LJID = jlib:short_prepd_bare_jid(To),
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
% TODO call get_items/6 instead for access control (EJAB-1033)
case node_call(Type, get_items, [NodeId, From]) of
{result, []} ->
none;
{result, AllItems} ->
- SBJID = jlib:jid_to_string(jlib:jid_remove_resource(To)),
Items = case Acc of
{result, I} -> I;
_ -> []
@@ -700,7 +710,9 @@ disco_sm_items(Acc, From, To, SNode, _Lang) ->
NodeItems = lists:map(
fun(#pubsub_item{itemid = {Id, _}}) ->
{result, Name} = node_call(Type, get_item_name, [Host, Node, Id]),
- {xmlelement, "item", [{"jid", SBJID}, {"name", Name}], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(LJID)),
+ ?XMLATTR('name', Name)]}
end, AllItems),
{result, NodeItems ++ Items};
_ ->
@@ -716,11 +728,15 @@ disco_sm_items(Acc, From, To, SNode, _Lang) ->
%% presence hooks handling functions
%%
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID, JID, Pid) ->
- Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
+presence_probe(JID, JID, Pid) ->
+ {User, Server, Resource} = jlib:short_prepd_jid(JID),
+ Host = exmpp_jid:prep_domain_as_list(JID),
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:cast(Proc, {presence, JID, Pid}),
gen_server:cast(Proc, {presence, User, Server, [Resource], JID});
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{lserver = Host} = JID, _Pid) ->
+presence_probe(Peer, JID, _Pid) ->
+ {User, Server, Resource} = jlib:short_prepd_jid(Peer),
+ Host = exmpp_jid:prep_domain_as_list(JID),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:cast(Proc, {presence, User, Server, [Resource], JID}).
@@ -729,18 +745,18 @@ presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{
%%
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]
+ Owner = exmpp_jid:make(User, Server, ""),
+ {U, S, R} = jlib:short_prepd_jid(JID),
+ Rs = case R of
+ [] -> user_resources(U, S);
+ _ -> [R]
end,
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
- gen_server:cast(Proc, {presence, PUser, PServer, PResources, Owner});
-out_subscription(_,_,_,_) ->
+ gen_server:cast(Proc, {presence, U, S, Rs, Owner});
+out_subscription(_, _, _, _) ->
ok.
in_subscription(_, User, Server, Owner, unsubscribed, _) ->
- Subscriber = jlib:make_jid(User, Server, ""),
+ Subscriber = exmpp_jid:make(User, Server, ""),
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
gen_server:cast(Proc, {unsubscribe, Subscriber, Owner});
in_subscription(_, _, _, _, _, _) ->
@@ -751,19 +767,19 @@ in_subscription(_, _, _, _, _, _) ->
%%
remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
gen_server:cast(Proc, {remove_user, LUser, LServer}).
%%--------------------------------------------------------------------
%% 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}
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} |
+%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
%% @private
@@ -780,8 +796,8 @@ handle_call(stop, _From, State) ->
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State}
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
%% @private
@@ -796,7 +812,7 @@ handle_cast({presence, User, Server, Resources, JID}, State) ->
handle_cast({remove_user, LUser, LServer}, State) ->
spawn(fun() ->
Host = State#state.host,
- Owner = jlib:make_jid(LUser, LServer, ""),
+ Owner = exmpp_jid:make(LUser, LServer),
%% remove user's subscriptions
lists:foreach(fun(PType) ->
{result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Owner]),
@@ -815,12 +831,12 @@ handle_cast({remove_user, LUser, LServer}, State) ->
end, Affiliations)
end, State#state.plugins)
end),
- {noreply, State};
+ {noreply, State};
handle_cast({unsubscribe, Subscriber, Owner}, State) ->
spawn(fun() ->
Host = State#state.host,
- BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
+ BJID = jlib:short_prepd_bare_jid(Owner),
lists:foreach(fun(PType) ->
{result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Subscriber]),
lists:foreach(fun
@@ -849,8 +865,8 @@ handle_cast(_Msg, State) ->
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State}
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
%% @private
@@ -858,7 +874,7 @@ 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
+ case catch do_route(ServerHost, Access, Plugins, exmpp_jid:prep_domain_as_list(To), From, To, Packet) of
{'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]);
_ -> ok
end,
@@ -880,27 +896,31 @@ terminate(_Reason, #state{host = Host,
plugins = Plugins,
send_loop = SendLoop}) ->
ejabberd_router:unregister_route(Host),
+ ServerHostB = list_to_binary(ServerHost),
case lists:member(?PEPNODE, Plugins) of
- true ->
- 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),
- gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB),
- gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB_OWNER);
- false ->
- ok
+ true ->
+ ejabberd_hooks:delete(disco_local_identity, ServerHostB, ?MODULE, disco_local_identity, 75),
+ ejabberd_hooks:delete(disco_local_features, ServerHostB, ?MODULE, disco_local_features, 75),
+ ejabberd_hooks:delete(disco_local_items, ServerHostB, ?MODULE, disco_local_items, 75),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB_OWNER);
+ false ->
+ ok
end,
- 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),
- 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),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER),
- mod_disco:unregister_feature(ServerHost, ?NS_PUBSUB),
+ ejabberd_hooks:delete(disco_local_identity, ServerHostB, ?MODULE, disco_local_identity, 75),
+ ejabberd_hooks:delete(disco_local_features, ServerHostB, ?MODULE, disco_local_features, 75),
+ ejabberd_hooks:delete(disco_local_items, ServerHostB, ?MODULE, disco_local_items, 75),
+ ejabberd_hooks:delete(disco_sm_identity, ServerHostB, ?MODULE, disco_sm_identity, 75),
+ ejabberd_hooks:delete(disco_sm_features, ServerHostB, ?MODULE, disco_sm_features, 75),
+ ejabberd_hooks:delete(disco_sm_items, ServerHostB, ?MODULE, disco_sm_items, 75),
+ ejabberd_hooks:delete(presence_probe_hook, ServerHostB, ?MODULE, presence_probe, 80),
+ ejabberd_hooks:delete(roster_in_subscription, ServerHostB, ?MODULE, in_subscription, 50),
+ ejabberd_hooks:delete(roster_out_subscription, ServerHostB, ?MODULE, out_subscription, 50),
+ ejabberd_hooks:delete(remove_user, ServerHostB, ?MODULE, remove_user, 50),
+ ejabberd_hooks:delete(anonymous_purge_hook, ServerHostB, ?MODULE, remove_user, 50),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB_OWNER),
+ mod_disco:unregister_feature(ServerHost, ?NS_PUBSUB_s),
SendLoop ! stop,
terminate_plugins(Host, ServerHost, Plugins, TreePlugin).
@@ -916,101 +936,102 @@ code_change(_OldVsn, State, _Extra) ->
%%% Internal functions
%%--------------------------------------------------------------------
do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
- {xmlelement, Name, Attrs, _Els} = Packet,
- case To of
- #jid{luser = "", lresource = ""} ->
+ #xmlel{name = Name} = Packet,
+ LNode = exmpp_jid:prep_node(To),
+ LRes = exmpp_jid:prep_resource(To),
+ case {LNode, LRes} of
+ {undefined, undefined} ->
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),
+ 'iq' ->
+ case exmpp_iq:xmlel_to_iq(Packet) of
+ #iq{type = get, ns = ?NS_DISCO_INFO,
+ payload = SubEl, lang = Lang} ->
+ QAttrs = SubEl#xmlel.attrs,
+ Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs, 'node', ""),
+ ServerHostB = list_to_binary(ServerHost),
Info = ejabberd_hooks:run_fold(
- disco_info, ServerHost, [],
- [ServerHost, ?MODULE, "", ""]),
+ disco_info, ServerHostB, [],
+ [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}]});
+ Result = #xmlel{ns = ?NS_DISCO_INFO,
+ name = 'query', attrs = QAttrs,
+ children = IQRes++Info},
+ exmpp_iq:result(Packet, Result);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(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),
+ #iq{type = get, ns = ?NS_DISCO_ITEMS,
+ payload = SubEl} ->
+ QAttrs = SubEl#xmlel.attrs,
+ Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs,
+ 'node', ""),
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}]});
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS,
+ name = 'query', attrs = QAttrs,
+ children = IQRes},
+ exmpp_iq:result(Packet, Result);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(Packet, Error)
end,
ejabberd_router:route(To, From, Res);
- #iq{type = IQType, xmlns = ?NS_PUBSUB,
- lang = Lang, sub_el = SubEl} = IQ ->
+ #iq{type = IQType, ns = ?NS_PUBSUB,
+ lang = Lang, payload = SubEl} ->
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});
+ exmpp_iq:result(Packet, IQRes);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(Packet, Error)
end,
ejabberd_router:route(To, From, Res);
- #iq{type = IQType, xmlns = ?NS_PUBSUB_OWNER,
- lang = Lang, sub_el = SubEl} = IQ ->
+ #iq{type = IQType, ns = ?NS_PUBSUB_OWNER,
+ lang = Lang, payload = SubEl} ->
Res =
case iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) of
+ {result, []} ->
+ exmpp_iq:result(Packet);
{result, IQRes} ->
- jlib:iq_to_xml(
- IQ#iq{type = result,
- sub_el = IQRes});
+ exmpp_iq:result(Packet, IQRes);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(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,
+ #iq{type = get, ns = ?NS_VCARD = XMLNS,
+ lang = Lang} ->
+ VCard = #xmlel{ns = XMLNS, name = 'vCard',
+ children = iq_get_vcard(Lang)},
+ Res = exmpp_iq:result(Packet, VCard),
ejabberd_router:route(To, From, Res);
+ #iq{type = set, ns = ?NS_ADHOC} = IQ ->
+ Res = case iq_command(Host, ServerHost, From, IQ, Access, Plugins) of
+ {error, Error} ->
+ exmpp_iq:error(Packet, Error);
+ {result, IQRes} ->
+ exmpp_iq:result(Packet, IQRes)
+ end,
+ ejabberd_router:route(To, From, Res);
+
#iq{} ->
- Err = jlib:make_error_reply(
- Packet,
- ?ERR_FEATURE_NOT_IMPLEMENTED),
+ Err = exmpp_iq:error(Packet,
+ 'feature-not-implemented'),
ejabberd_router:route(To, From, Err);
_ ->
ok
end;
- "message" ->
- case xml:get_attr_s("type", Attrs) of
- "error" ->
+ 'message' ->
+ case exmpp_stanza:is_stanza_error(Packet) of
+ true ->
ok;
- _ ->
+ false ->
case find_authorization_response(Packet) of
none ->
ok;
invalid ->
ejabberd_router:route(To, From,
- jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST));
+ exmpp_message:error(Packet, 'bad-request'));
XFields ->
handle_authorization_response(Host, From, To, Packet, XFields)
end
@@ -1019,13 +1040,14 @@ do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
ok
end;
_ ->
- case xml:get_attr_s("type", Attrs) of
- "error" ->
+ case exmpp_stanza:get_type(Packet) of
+ <<"error">> ->
ok;
- "result" ->
+ <<"result">> ->
ok;
_ ->
- Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ 'item-not-found'),
ejabberd_router:route(To, From, Err)
end
end.
@@ -1055,17 +1077,17 @@ node_disco_info(Host, Node, From, Identity, Features) ->
end
end,
lists:map(fun(T) ->
- {xmlelement, "identity", [{"category", "pubsub"},
- {"type", T}], []}
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = [?XMLATTR('category', <<"pubsub">>),
+ ?XMLATTR('type', T)]}
end, Types)
end,
F = case Features of
false ->
[];
true ->
- [{xmlelement, "feature", [{"var", ?NS_PUBSUB}], []} |
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]} |
lists:map(fun(T) ->
- {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []}
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++T)]}
end, features(Type))]
end,
%% TODO: add meta-data info (spec section 5.4)
@@ -1085,16 +1107,16 @@ iq_disco_info(Host, SNode, From, Lang) ->
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_VCARD}], []}] ++
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', "pubsub"),
+ ?XMLATTR('type', "service"),
+ ?XMLATTR('name', translate:translate(Lang, "Publish-Subscribe"))]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_DISCO_INFO_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_DISCO_ITEMS_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_VCARD_s)]}] ++
lists:map(fun(Feature) ->
- {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++Feature}], []}
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++Feature)]}
end, features(Host, Node))};
_ ->
node_disco_info(Host, Node, From)
@@ -1103,10 +1125,11 @@ iq_disco_info(Host, SNode, From, Lang) ->
iq_disco_items(Host, [], From) ->
{result, lists:map(
fun(#pubsub_node{nodeid = {_, SubNode}, type = Type}) ->
- {result, Path} = node_call(Type, node_to_path, [SubNode]),
- [Name|_] = lists:reverse(Path),
- {xmlelement, "item", [{"jid", Host}, {"name", Name}|nodeAttr(SubNode)], []}
- end, tree_action(Host, get_subnodes, [Host, <<>>, From]))};
+ {result, Path} = node_call(Type, node_to_path, [SubNode]),
+ [Name | _] = lists:reverse(Path),
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host),
+ ?XMLATTR('name', Name) | nodeAttr(SubNode)]}
+ end, tree_action(Host, get_subnodes, [Host, [], From]))};
iq_disco_items(Host, Item, From) ->
case string:tokens(Item, "!") of
[_SNode, _ItemID] ->
@@ -1122,12 +1145,12 @@ iq_disco_items(Host, Item, From) ->
end,
Nodes = lists:map(
fun(#pubsub_node{nodeid = {_, SubNode}}) ->
- {xmlelement, "item", [{"jid", Host}|nodeAttr(SubNode)], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host) | nodeAttr(SubNode)]}
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}], []}
+ {result, Name} = node_call(Type, get_item_name, [Host, Node, RN]),
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host), ?XMLATTR('name', Name)]}
end, NodeItems),
{result, Nodes ++ Items}
end,
@@ -1137,61 +1160,63 @@ iq_disco_items(Host, Item, From) ->
end
end.
-iq_local(From, To, #iq{type = Type, sub_el = SubEl, xmlns = XMLNS, lang = Lang} = IQ) ->
- ServerHost = To#jid.lserver,
+iq_local(From, To, #iq{type = Type, payload = SubEl, ns = XMLNS, lang = Lang} = IQ_Rec) ->
+ ServerHost = exmpp_jid:prep_domain_as_list(To),
+ FromHost = exmpp_jid:prep_domain_as_list(To),
%% Accept IQs to server only from our own users.
if
- From#jid.lserver /= ServerHost ->
- IQ#iq{type = error, sub_el = [?ERR_FORBIDDEN, SubEl]};
+ FromHost /= ServerHost ->
+ exmpp_iq:error(IQ_Rec, 'forbidden');
true ->
- LOwner = jlib:jid_tolower(jlib:jid_remove_resource(From)),
+ LOwner = jlib:short_prepd_bare_jid(From),
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]}
+ {result, []} -> exmpp_iq:result(IQ_Rec);
+ {result, [IQRes]} -> exmpp_iq:result(IQ_Rec, IQRes);
+ {error, Error} -> exmpp_iq:error(IQ_Rec, Error)
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)),
+iq_sm(From, To, #iq{type = Type, payload = SubEl, ns = XMLNS, lang = Lang} = IQ_Rec) ->
+ ServerHost = exmpp_jid:prep_domain_as_list(To),
+ LOwner = jlib:short_prepd_bare_jid(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]}
+ {result, []} -> exmpp_iq:result(IQ_Rec);
+ {result, [IQRes]} -> exmpp_iq:result(IQ_Rec, IQRes);
+ {error, Error} -> exmpp_iq:error(IQ_Rec, Error)
end.
iq_get_vcard(Lang) ->
- [{xmlelement, "FN", [], [{xmlcdata, "ejabberd/mod_pubsub"}]},
- {xmlelement, "URL", [], [{xmlcdata, ?EJABBERD_URI}]},
- {xmlelement, "DESC", [],
- [{xmlcdata,
+ [#xmlel{ns = ?NS_VCARD, name = 'FN', children = [#xmlcdata{cdata = <<"ejabberd/mod_pubsub">>}]},
+ #xmlel{ns = ?NS_VCARD, name = 'URL', children = [#xmlcdata{cdata = list_to_binary(?EJABBERD_URI)}]},
+ #xmlel{ns = ?NS_VCARD, name = 'DESC', children =
+ [#xmlcdata{cdata = list_to_binary(
translate:translate(Lang,
"ejabberd Publish-Subscribe module") ++
- "\nCopyright (c) 2004-2009 Process-One"}]}].
+ "\nCopyright (c) 2004-2009 Process-One")}]}].
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 exmpp_xml:remove_cdata_from_list(SubEl#xmlel.children) of
+ [#xmlel{name = Name, attrs = Attrs, children = Els} | Rest] ->
+ Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(attrs, 'node', false)),
case {IQType, Name} of
- {set, "create"} ->
+ {set, 'create'} ->
Config = case Rest of
- [{xmlelement, "configure", _, C}] -> C;
+ [#xmlel{name = 'configure', children = C}] -> C;
_ -> []
end,
%% Get the type of the node
- Type = case xml:get_attr_s("type", Attrs) of
+ Type = case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'type', "") of
[] -> hd(Plugins);
T -> T
end,
@@ -1200,116 +1225,116 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
case lists:member(Type, Plugins) of
false ->
{error, extended_error(
- ?ERR_FEATURE_NOT_IMPLEMENTED,
+ '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),
+ {set, 'publish'} ->
+ case exmpp_xml:remove_cdata_from_list(Els) of
+ [#xmlel{name = 'item', attrs = ItemAttrs, children = Payload}] ->
+ ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', ""),
publish_item(Host, ServerHost, Node, From, ItemId, Payload);
[] ->
%% Publisher attempts to publish to persistent node with no item
- {error, extended_error(?ERR_BAD_REQUEST,
+ {error, extended_error('bad-request',
"item-required")};
_ ->
%% Entity attempts to publish item with multiple payload elements or namespace does not match
- {error, extended_error(?ERR_BAD_REQUEST,
+ {error, extended_error('bad-request',
"invalid-payload")}
end;
- {set, "retract"} ->
- ForceNotify = case xml:get_attr_s("notify", Attrs) of
+ {set, 'retract'} ->
+ ForceNotify = case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'notify', "") of
"1" -> true;
"true" -> true;
_ -> false
end,
- case xml:remove_cdata(Els) of
- [{xmlelement, "item", ItemAttrs, _}] ->
- ItemId = xml:get_attr_s("id", ItemAttrs),
+ case exmpp_xml:remove_cdata_from_list(Els) of
+ [#xmlel{name = 'item', attrs = ItemAttrs}] ->
+ ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', ""),
delete_item(Host, Node, From, ItemId, ForceNotify);
_ ->
%% Request does not specify an item
- {error, extended_error(?ERR_BAD_REQUEST,
+ {error, extended_error('bad-request',
"item-required")}
end;
- {set, "subscribe"} ->
+ {set, 'subscribe'} ->
Config = case Rest of
- [{xmlelement, "options", _, C}] -> C;
+ [#xmlel{name = 'configure', children = C}] -> C;
_ -> []
end,
- JID = xml:get_attr_s("jid", Attrs),
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
subscribe_node(Host, Node, From, JID, Config);
- {set, "unsubscribe"} ->
- JID = xml:get_attr_s("jid", Attrs),
- SubId = xml:get_attr_s("subid", Attrs),
+ {set, 'unsubscribe'} ->
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
+ SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
unsubscribe_node(Host, Node, From, JID, SubId);
- {get, "items"} ->
- MaxItems = xml:get_attr_s("max_items", Attrs),
- SubId = xml:get_attr_s("subid", Attrs),
+ {get, 'items'} ->
+ MaxItems = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'max_items', ""),
+ SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
ItemIDs = lists:foldl(fun
- ({xmlelement, "item", ItemAttrs, _}, Acc) ->
- case xml:get_attr_s("id", ItemAttrs) of
+ (#xmlel{name = 'item', attrs = ItemAttrs}, Acc) ->
+ case exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', "") of
"" -> Acc;
ItemID -> [ItemID|Acc]
end;
(_, Acc) ->
Acc
- end, [], xml:remove_cdata(Els)),
+ end, [], exmpp_xml:remove_cdata_from_list(Els)),
get_items(Host, Node, From, SubId, MaxItems, ItemIDs);
- {get, "subscriptions"} ->
+ {get, 'subscriptions'} ->
get_subscriptions(Host, Node, From, Plugins);
- {get, "affiliations"} ->
+ {get, 'affiliations'} ->
get_affiliations(Host, From, Plugins);
{get, "options"} ->
- SubID = xml:get_attr_s("subid", Attrs),
- JID = xml:get_attr_s("jid", Attrs),
+ SubID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
get_options(Host, Node, JID, SubID, Lang);
{set, "options"} ->
- SubID = xml:get_attr_s("subid", Attrs),
- JID = xml:get_attr_s("jid", Attrs),
+ SubID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
set_options(Host, Node, JID, SubID, Els);
_ ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}
+ {error, 'feature-not-implemented'}
end;
Other ->
?INFO_MSG("Too many actions: ~p", [Other]),
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) ->
- {xmlelement, _, _, SubEls} = SubEl,
- Action = xml:remove_cdata(SubEls),
+ SubEls = SubEl#xmlel.children,
+ Action = exmpp_xml:remove_cdata_from_list(SubEls),
case Action of
- [{xmlelement, Name, Attrs, Els}] ->
- Node = string_to_node(xml:get_attr_s("node", Attrs)),
+ [#xmlel{name = Name, attrs = Attrs, children = Els}] ->
+ Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', "")),
case {IQType, Name} of
- {get, "configure"} ->
+ {get, 'configure'} ->
get_configure(Host, ServerHost, Node, From, Lang);
- {set, "configure"} ->
+ {set, 'configure'} ->
set_configure(Host, Node, From, Els, Lang);
- {get, "default"} ->
+ {get, 'default'} ->
get_default(Host, Node, From, Lang);
- {set, "delete"} ->
+ {set, 'delete'} ->
delete_node(Host, Node, From);
- {set, "purge"} ->
+ {set, 'purge'} ->
purge_node(Host, Node, From);
- {get, "subscriptions"} ->
+ {get, 'subscriptions'} ->
get_subscriptions(Host, Node, From);
- {set, "subscriptions"} ->
- set_subscriptions(Host, Node, From, xml:remove_cdata(Els));
- {get, "affiliations"} ->
+ {set, 'subscriptions'} ->
+ set_subscriptions(Host, Node, From, exmpp_xml:remove_cdata_from_list(Els));
+ {get, 'affiliations'} ->
get_affiliations(Host, Node, From);
- {set, "affiliations"} ->
- set_affiliations(Host, Node, From, xml:remove_cdata(Els));
+ {set, 'affiliations'} ->
+ set_affiliations(Host, Node, From, exmpp_xml:remove_cdata_from_list(Els));
_ ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}
+ {error, 'feature-not-implemented'}
end;
_ ->
?INFO_MSG("Too many actions: ~p", [Action]),
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
iq_command(Host, ServerHost, From, IQ, Access, Plugins) ->
@@ -1339,10 +1364,10 @@ adhoc_request(Host, _ServerHost, Owner,
xdata = XData},
_Access, _Plugins) ->
ParseOptions = case XData of
- {xmlelement, "x", _Attrs, _SubEls} = XEl ->
+ #xmlel{name = 'x'} = XEl ->
case jlib:parse_xdata_submit(XEl) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'bad-request')};
XData2 ->
case set_xoption(Host, XData2, []) of
NewOpts when is_list(NewOpts) ->
@@ -1353,7 +1378,7 @@ adhoc_request(Host, _ServerHost, Owner,
end;
_ ->
?INFO_MSG("Bad XForm: ~p", [XData]),
- {error, ?ERR_BAD_REQUEST}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'bad-request')}
end,
case ParseOptions of
{result, XForm} ->
@@ -1361,14 +1386,14 @@ adhoc_request(Host, _ServerHost, Owner,
{value, {_, Node}} ->
send_pending_auth_events(Host, Node, Owner);
false ->
- {error, extended_error(?ERR_BAD_REQUEST, "bad-payload")}
+ {error, extended_error('bad-request', "bad-payload")}
end;
Error ->
Error
end;
adhoc_request(_Host, _ServerHost, _Owner, Other, _Access, _Plugins) ->
?DEBUG("Couldn't process ad hoc command:~n~p", [Other]),
- {error, ?ERR_ITEM_NOT_FOUND}.
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item-not-found')}.
%% @spec (Host, Owner, Lang, Plugins) -> iqRes()
%% @doc Sends the process pending subscriptions XForm for Host to
@@ -1380,17 +1405,21 @@ send_pending_node_form(Host, Owner, _Lang, Plugins) ->
end,
case lists:filter(Filter, Plugins) of
[] ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED};
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'feature-not-implemented')};
Ps ->
XOpts = lists:map(fun (Node) ->
- {xmlelement, "option", [],
- [{xmlelement, "value", [],
- [{xmlcdata, node_to_string(Node)}]}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name='option',
+ children = [
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'value',
+ children = [
+ exmpp_xml:cdata(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)}]},
+ XForm = #xmlel{ns = ?NS_DATA_FORMS, name ='x', attrs = [?XMLATTR('type', <<"form">>)],
+ children = [
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field',
+ attrs = [?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('var', <<"pubsub#node">>)],
+ children = lists:usort(XOpts)}]},
#adhoc_response{status = executing,
defaultaction = "execute",
elements = [XForm]}
@@ -1415,24 +1444,29 @@ get_pending_nodes(Host, Owner, Plugins) ->
%% 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)]),
+ [exmpp_jid:jid_to_string(Owner), Host, node_to_string(Node)]),
Action =
- fun (#pubsub_node{id = NodeID, type = Type} = N) ->
+ 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} ->
{result, Subscriptions} = node_call(Type, get_node_subscriptions, [NodeID]),
- 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),
+ lists:foreach(fun({J, pending, _SubID}) ->
+ {U, S, R} = J,
+ send_authorization_request(Node, exmpp_jid:make(U,S,R));
+ ({J, pending}) ->
+ {U, S, R} = J,
+ send_authorization_request(Node, exmpp_jid:make(U,S,R));
+ (_) ->
+ ok
+ end, Subscriptions),
{result, ok};
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'forbidden')}
end;
false ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'feature-not-implemented')}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -1446,60 +1480,55 @@ send_pending_auth_events(Host, Node, Owner) ->
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"}]}]}]}]},
+ {U, S, R} = Subscriber,
+ Stanza = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "PubSub subscriber request"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Choose whether to approve this entity's subscription."))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(?NS_PUBSUB_SUBSCRIBE_AUTH_s)}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"pubsub#node">>), ?XMLATTR('type', <<"text-single">>),
+ ?XMLATTR('label', translate:translate(Lang, "Node ID"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = node_to_string(Node)}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"pubsub#subscriber_jid">>),
+ ?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', translate:translate(Lang, "Subscriber Address"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = exmpp_jid:to_binary(U, S, R)}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"pubsub#allow">>),
+ ?XMLATTR('type', <<"boolean">>),
+ ?XMLATTR('label', translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"false">>}]}]}]}]},
lists:foreach(fun(Owner) ->
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(Owner), Stanza}
+ {U, S, R} = Owner,
+ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(U, S, R), 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;
+ Els = Packet#xmlel.children,
+ XData1 = lists:map(fun(#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = XAttrs} = XEl) ->
+ case exmpp_xml:get_attribute_from_list_as_list(XAttrs, 'type', "") of
+ "cancel" ->
+ none;
_ ->
- none
+ jlib:parse_xdata_submit(XEl)
end;
(_) ->
none
- end, xml:remove_cdata(Els)),
+ end, exmpp_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]}} ->
+ {value, {_, [?NS_PUBSUB_SUBSCRIBE_AUTH_s]}} ->
XFields;
_ ->
invalid
@@ -1507,23 +1536,24 @@ find_authorization_response(Packet) ->
end.
%% @spec (Host, JID, Node, Subscription) -> void
-%% Host = mod_pubsub:host()
-%% JID = jlib:jid()
-%% SNode = string()
-%% Subscription = atom() | {atom(), mod_pubsub:subid()}
+%% Host = mod_pubsub:host()
+%% JID = jlib:jid()
+%% SNode = string()
+%% Subscription = atom() | {atom(), mod_pubsub:subid()}
+%% Plugins = [Plugin::string()]
%% @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)}]
+ {S, SID} -> [?XMLATTR('subscription', subscription_to_string(S)),
+ ?XMLATTR('subid', SID)];
+ S -> [?XMLATTR('subscription', subscription_to_string(S))]
end,
Stanza = event_stanza(
- [{xmlelement, "subscription",
- [{"jid", jlib:jid_to_string(JID)}|nodeAttr(SNode)] ++ SubAttrs,
- []}]),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'subscription', attrs =
+ [ ?XMLATTR('jid', exmpp_jid:to_binary(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),
@@ -1531,41 +1561,41 @@ handle_authorization_response(Host, From, To, Packet, XFields) ->
{{value, {_, [SNode]}}, {value, {_, [SSubscriber]}},
{value, {_, [SAllow]}}} ->
Node = string_to_node(SNode),
- Subscriber = jlib:string_to_jid(SSubscriber),
+ Subscriber = exmpp_jid:parse(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),
+ IsApprover = lists:member(jlib:short_prepd_bare_jid(From), Owners),
{result, Subscriptions} = node_call(Type, get_subscriptions, [NodeId, Subscriber]),
if
not IsApprover ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
true ->
update_auth(Host, SNode, Type, NodeId,
- Subscriber, Allow,
- Subscriptions)
+ 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}} ->
+ exmpp_stanza:reply_with_error(Packet, Error));
+ {result, _} ->
%% XXX: notify about subscription state change, section 12.11
ok;
_ ->
ejabberd_router:route(
To, From,
- jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR))
+ exmpp_stanza:reply_with_error(Packet, 'internal-server-error'))
end;
_ ->
ejabberd_router:route(
To, From,
- jlib:make_error_reply(Packet, ?ERR_NOT_ACCEPTABLE))
+ exmpp_stanza:reply_with_error(Packet, 'not-acceptable'))
end.
update_auth(Host, Node, Type, NodeId, Subscriber,
@@ -1585,14 +1615,14 @@ update_auth(Host, Node, Type, NodeId, Subscriber,
NewSubscription),
{result, ok};
_ ->
- {error, ?ERR_UNEXPECTED_REQUEST}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'unexpected-request')}
end.
-define(XFIELD(Type, Label, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Val)}]}]}).
-define(BOOLXFIELD(Label, Var, Val),
?XFIELD("boolean", Label, Var,
@@ -1605,38 +1635,43 @@ update_auth(Host, Node, Type, NodeId, Subscriber,
?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]}).
+ #xmlel{ns = ?NS_DATA_FORMS,
+ name = 'field',
+ attrs = [?XMLATTR('type', <<"text-multi">>),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)
+ ],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value',
+ children = [?XMLCDATA(V)]} || V <- Vals]}).
-define(XFIELDOPT(Type, Label, Var, Val, Opts),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)], children =
lists:map(fun(Opt) ->
- {xmlelement, "option", [],
- [{xmlelement, "value", [],
- [{xmlcdata, Opt}]}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = list_to_binary(Opt)}]}]}
end, Opts) ++
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(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}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"list-multi">>),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)], children =
lists:map(fun(Opt) ->
- {xmlelement, "option", [],
- [{xmlelement, "value", [],
- [{xmlcdata, Opt}]}]}
- end, Opts) ++
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = list_to_binary(Opt)}]}]}
+ end, Opts) ++
lists:map(fun(Val) ->
- {xmlelement, "value", [],
- [{xmlcdata, Val}]}
- end, Vals)}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = list_to_binary(Val)}]}
+ end, Vals)
+ }).
%% @spec (Host::host(), ServerHost::host(), Node::pubsubNode(), Owner::jid(), NodeType::nodeType()) ->
%% {error, Reason::stanzaError()} |
@@ -1668,25 +1703,25 @@ create_node(Host, ServerHost, <<>>, Owner, Type, Access, Configuration) ->
NewNode, Owner, Type, Access, Configuration) of
{result, []} ->
{result,
- [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "create", nodeAttr(NewNode), []}]}]};
- Error ->
- Error
+ [#xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'create', attrs = nodeAttr(NewNode)}]}]};
+ Error ->
+ Error
end;
false ->
%% Service does not support instant nodes
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "nodeid-required")}
+ {error, extended_error('not-acceptable', "nodeid-required")}
end;
create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
Type = select_type(ServerHost, Host, Node, GivenType),
%% TODO, check/set node_type = Type
- ParseOptions = case xml:remove_cdata(Configuration) of
+ ParseOptions = case exmpp_xml:remove_cdata_from_list(Configuration) of
[] ->
{result, node_options(Type)};
- [{xmlelement, "x", _Attrs, _SubEls} = XEl] ->
+ [#xmlel{name = 'x'} = XEl] ->
case jlib:parse_xdata_submit(XEl) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
XData ->
case set_xoption(Host, XData, node_options(Type)) of
NewOpts when is_list(NewOpts) ->
@@ -1697,7 +1732,7 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
end;
_ ->
?INFO_MSG("Node ~p; bad configuration: ~p", [Node, Configuration]),
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end,
case ParseOptions of
{result, NodeOptions} ->
@@ -1723,18 +1758,17 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
Error
end;
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
- Reply = [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "create", nodeAttr(Node),
- []}]}],
+ Reply = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'create', attrs = nodeAttr(Node)}]},
case transaction(CreateNode, transaction) of
{result, {Result, broadcast}} ->
%%Lang = "en", %% TODO: fix
%%OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
%%broadcast_publish_item(Host, Node, uniqid(), Owner,
- %% [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
+ %% [{xmlelement, "x", [{"xmlns", ?NS_DATA_FORMS}, {"type", "result"}],
%% [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NMI),
%% ?XFIELD("jid-single", "Node Creator", "creator", jlib:jid_to_string(OwnerKey))]}]),
case Result of
@@ -1770,7 +1804,7 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
%%
delete_node(_Host, [], _Owner) ->
%% Node is the root
- {error, ?ERR_NOT_ALLOWED};
+ {error, 'not-allowed'};
delete_node(Host, Node, Owner) ->
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
case node_call(Type, get_affiliation, [NodeId, Owner]) of
@@ -1784,7 +1818,7 @@ delete_node(Host, Node, Owner) ->
end;
_ ->
%% Entity is not an owner
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
Reply = [],
@@ -1795,7 +1829,8 @@ delete_node(Host, Node, Owner) ->
NodeId = RNode#pubsub_node.id,
Type = RNode#pubsub_node.type,
Options = RNode#pubsub_node.options,
- broadcast_removed_node(RH, RN, NodeId, Type, Options, SubsByDepth)
+ broadcast_removed_node(RH, RN, NodeId, Type, Options, SubsByDepth),
+ unset_cached_item(RH, NodeId)
end, Removed),
case Result of
default -> {result, Reply};
@@ -1841,10 +1876,13 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
{result, GoodSubOpts} -> GoodSubOpts;
_ -> invalid
end,
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
- end,
+ Subscriber = try
+ jlib:short_prepd_jid(exmpp_jid:parse(JID))
+ catch
+ _:_ ->
+ {undefined, undefined, undefined}
+ end,
+ SubId = uniqid(),
Action = fun(#pubsub_node{options = Options, owners = [Owner|_], type = Type, id = NodeId}) ->
Features = features(Type),
SubscribeFeature = lists:member("subscribe", Features),
@@ -1872,16 +1910,16 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
if
not SubscribeFeature ->
%% Node does not support subscriptions
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscribe")};
+ {error, extended_error('feature-not-implemented', unsupported, "subscribe")};
not SubscribeConfig ->
%% Node does not support subscriptions
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscribe")};
+ {error, extended_error('feature-not-implemented', unsupported, "subscribe")};
HasOptions andalso not OptionsFeature ->
%% Node does not support subscription options
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscription-options")};
+ {error, extended_error('feature-not-implemented', unsupported, "subscription-options")};
SubOpts == invalid ->
%% Passed invalit options submit form
- {error, extended_error(?ERR_BAD_REQUEST, "invalid-options")};
+ {error, extended_error('bad-request', "invalid-options")};
true ->
node_call(Type, subscribe_node,
[NodeId, From, Subscriber,
@@ -1900,9 +1938,9 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
[{"subscription", subscription_to_string(Other)}]
end,
Fields =
- [{"jid", jlib:jid_to_string(Subscriber)} | SubAttrs],
- [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "subscription", Fields, []}]}]
+ [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)) | SubAttrs],
+ #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs = Fields}]}
end,
case transaction(Host, Node, Action, sync_dirty) of
{result, {TNode, {Result, subscribed, SubId, send_last}}} ->
@@ -1947,10 +1985,11 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
%%The request specifies a subscription ID that is not valid or current.
%%
unsubscribe_node(Host, Node, From, JID, SubId) when is_list(JID) ->
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
- end,
+ Subscriber = try jlib:short_prepd_jid(exmpp_jid:parse(JID))
+ catch
+ _:_ ->
+ {undefined, undefined, undefined}
+ end,
unsubscribe_node(Host, Node, From, Subscriber, SubId);
unsubscribe_node(Host, Node, From, Subscriber, SubId) ->
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
@@ -1998,30 +2037,31 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
if
not PublishFeature ->
%% Node does not support item publication
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "publish")};
+ {error, extended_error('feature-not-implemented', unsupported, "publish")};
PayloadSize > PayloadMaxSize ->
%% Entity attempts to publish very large payload
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "payload-too-big")};
+ {error, extended_error('not-acceptable', "payload-too-big")};
(PayloadCount == 0) and (Payload == []) ->
%% Publisher attempts to publish to payload node with no payload
- {error, extended_error(?ERR_BAD_REQUEST, "payload-required")};
+ {error, extended_error('bad-request', "payload-required")};
(PayloadCount > 1) or (PayloadCount == 0) ->
%% Entity attempts to publish item with multiple payload elements
- {error, extended_error(?ERR_BAD_REQUEST, "invalid-payload")};
+ {error, extended_error('bad-request', "invalid-payload")};
(DeliverPayloads == 0) and (PersistItems == 0) and (PayloadSize > 0) ->
%% Publisher attempts to publish to transient notification node with item
- {error, extended_error(?ERR_BAD_REQUEST, "item-forbidden")};
+ {error, extended_error('bad-request', "item-forbidden")};
((DeliverPayloads == 1) or (PersistItems == 1)) and (PayloadSize == 0) ->
%% Publisher attempts to publish to persistent node with no item
- {error, extended_error(?ERR_BAD_REQUEST, "item-required")};
+ {error, extended_error('bad-request', "item-required")};
true ->
node_call(Type, publish_item, [NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload])
end
end,
- ejabberd_hooks:run(pubsub_publish_item, ServerHost, [ServerHost, Node, Publisher, service_jid(Host), ItemId, Payload]),
- Reply = [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "publish", nodeAttr(Node),
- [{xmlelement, "item", itemAttr(ItemId), []}]}]}],
+ ServerHostB = list_to_binary(ServerHost),
+ ejabberd_hooks:run(pubsub_publish_item, ServerHostB, [ServerHost, Node, Publisher, service_jid(Host), ItemId, Payload]),
+ Reply = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'publish', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'item', attrs = itemAttr(ItemId)}]}]},
case transaction(Host, Node, Action, sync_dirty) of
{result, {TNode, {Result, Broadcast, Removed}}} ->
NodeId = TNode#pubsub_node.id,
@@ -2032,7 +2072,7 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
broadcast -> Payload;
PluginPayload -> PluginPayload
end,
- broadcast_publish_item(Host, Node, NodeId, Type, Options, Removed, ItemId, jlib:jid_tolower(Publisher), BroadcastPayload),
+ broadcast_publish_item(Host, Node, NodeId, Type, Options, Removed, ItemId, jlib:short_prepd_jid(Publisher), BroadcastPayload),
set_cached_item(Host, NodeId, ItemId, Payload),
case Result of
default -> {result, Reply};
@@ -2056,7 +2096,7 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
{result, Reply};
{result, {_, Result}} ->
{result, Result};
- {error, ?ERR_ITEM_NOT_FOUND} ->
+ {error, 'item-not-found'} ->
%% handles auto-create feature
%% for automatic node creation. we'll take the default node type:
%% first listed into the plugins configuration option, or pep
@@ -2067,10 +2107,10 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
{result, _} ->
publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload);
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end;
false ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end;
Error ->
Error
@@ -2094,7 +2134,7 @@ delete_item(Host, Node, Publisher, ItemId) ->
delete_item(Host, Node, Publisher, ItemId, false).
delete_item(_, "", _, _, _) ->
%% Request does not specify a node
- {error, extended_error(?ERR_BAD_REQUEST, "node-required")};
+ {error, extended_error('bad-request', "node-required")};
delete_item(Host, Node, Publisher, ItemId, ForceNotify) ->
Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId}) ->
Features = features(Type),
@@ -2104,13 +2144,13 @@ delete_item(Host, Node, Publisher, ItemId, ForceNotify) ->
if
%%-> iq_pubsub just does that matchs
%% %% Request does not specify an item
- %% {error, extended_error(?ERR_BAD_REQUEST, "item-required")};
+ %% {error, extended_error('bad-request', "item-required")};
not PersistentFeature ->
%% Node does not support persistent items
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
not DeleteFeature ->
%% Service does not support item deletion
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "delete-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "delete-items")};
true ->
node_call(Type, delete_item, [NodeId, Publisher, PublishModel, ItemId])
end
@@ -2161,13 +2201,13 @@ purge_node(Host, Node, Owner) ->
if
not PurgeFeature ->
%% Service does not support node purging
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "purge-nodes")};
+ {error, extended_error('feature-not-implemented', unsupported, "purge-nodes")};
not PersistentFeature ->
%% Node does not support persistent items
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
not PersistentConfig ->
%% Node is not configured for persistent items
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
true ->
node_call(Type, purge_node, [NodeId, Owner])
end
@@ -2203,7 +2243,7 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) ->
SMaxItems == "" -> get_max_items_node(Host);
true ->
case catch list_to_integer(SMaxItems) of
- {'EXIT', _} -> {error, ?ERR_BAD_REQUEST};
+ {'EXIT', _} -> {error, 'bad-request'};
Val -> Val
end
end,
@@ -2221,17 +2261,17 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) ->
case Host of
{OUser, OServer, _} ->
get_roster_info(OUser, OServer,
- jlib:jid_tolower(From), AllowedGroups);
+ jlib:short_prepd_jid(From), AllowedGroups);
_ ->
{true, true}
end,
if
not RetreiveFeature ->
%% Item Retrieval Not Supported
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "retrieve-items")};
not PersistentFeature ->
%% Persistent Items Not Supported
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
true ->
node_call(Type, get_items,
[NodeId, From,
@@ -2251,9 +2291,9 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) ->
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))}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'items', attrs = nodeAttr(Node), children =
+ itemsEls(lists:sublist(SendItems, MaxItems))}]}};
Error ->
Error
end
@@ -2291,11 +2331,12 @@ send_items(Host, Node, NodeId, Type, LJID, last) ->
LastItem ->
{ModifNow, ModifLjid} = LastItem#pubsub_item.modification,
Stanza = event_stanza_with_delay(
- [{xmlelement, "items", nodeAttr(Node),
- itemsEls([LastItem])}], ModifNow, ModifLjid),
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(LJID), Stanza}
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node),
+ children = itemsEls(LastItem)}], ModifNow, ModifLjid),
+ {U, S, R} = LJID,
+ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(U, S, R), Stanza}
end;
-send_items(Host, Node, NodeId, Type, LJID, Number) ->
+send_items(Host, Node, NodeId, Type, {LU, LS, LR} = LJID, Number) ->
ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of
{result, []} ->
[];
@@ -2311,14 +2352,14 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
[LastItem] ->
{ModifNow, ModifLjid} = LastItem#pubsub_item.modification,
event_stanza_with_delay(
- [{xmlelement, "items", nodeAttr(Node),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
itemsEls(ToSend)}], ModifNow, ModifLjid);
_ ->
event_stanza(
- [{xmlelement, "items", nodeAttr(Node),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
itemsEls(ToSend)}])
end,
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(LJID), Stanza}.
+ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(LU, LS, LR), Stanza}.
%% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response}
%% Host = host()
@@ -2335,7 +2376,7 @@ get_affiliations(Host, JID, Plugins) when is_list(Plugins) ->
if
not RetrieveFeature ->
%% Service does not support retreive affiliatons
- {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-affiliations")}, Acc};
+ {{error, extended_error('feature-not-implemented', unsupported, "retrieve-affiliations")}, Acc};
true ->
{result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, JID]),
{Status, [Affiliations|Acc]}
@@ -2346,53 +2387,52 @@ get_affiliations(Host, JID, Plugins) when is_list(Plugins) ->
Entities = lists:flatmap(
fun({_, none}) -> [];
({#pubsub_node{nodeid = {_, Node}}, Affiliation}) ->
- [{xmlelement, "affiliation",
- [{"affiliation", affiliation_to_string(Affiliation)}|nodeAttr(Node)],
- []}]
+ [#xmlel{ns = ?NS_PUBSUB, name = 'affiliation', attrs =
+ [?XMLATTR('node', node_to_string(Node)),
+ ?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
end, lists:usort(lists:flatten(Affiliations))),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "affiliations", [],
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'affiliations', children =
+ 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,
+ 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('feature-not-implemented', unsupported, "modify-affiliations")};
+ Affiliation /= owner ->
+ %% Entity is not an owner
+ {error, '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};
+ {error, '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)}],
- []}]
+ ({{AU, AS, AR}, Affiliation}) ->
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliation', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
+ ?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
end, Affiliations),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "affiliations", nodeAttr(Node),
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliations', attrs = nodeAttr(Node), children =
+ Entities}]}};
Error ->
Error
end.
set_affiliations(Host, Node, From, EntitiesEls) ->
- Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)),
+ Owner = jlib:short_prepd_bare_jid(From),
Entities =
lists:foldl(
fun(El, Acc) ->
@@ -2401,38 +2441,42 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
error;
_ ->
case El of
- {xmlelement, "affiliation", Attrs, _} ->
- JID = jlib:string_to_jid(
- xml:get_attr_s("jid", Attrs)),
+ #xmlel{name = 'affiliation', attrs = Attrs} ->
+ JID = try
+ exmpp_jid:parse(
+ exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
+ catch
+ _:_ -> error
+ end,
Affiliation = string_to_affiliation(
- xml:get_attr_s("affiliation", Attrs)),
+ exmpp_xml:get_attribute_from_list_as_list(Attrs, 'affiliation', false)),
if
(JID == error) or
(Affiliation == false) ->
error;
true ->
- [{jlib:jid_tolower(JID), Affiliation} | Acc]
+ [{JID, Affiliation} | Acc]
end
end
end
end, [], EntitiesEls),
case Entities of
error ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
_ ->
Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}=N) ->
case lists:member(Owner, Owners) of
true ->
lists:foreach(
fun({JID, Affiliation}) ->
- node_call(Type, set_affiliation, [NodeId, JID, Affiliation]),
+ {result, _} = node_call(Type, set_affiliation, [NodeId, JID, Affiliation]),
case Affiliation of
owner ->
- NewOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
+ NewOwner = jlib:short_prepd_bare_jid(JID),
NewOwners = [NewOwner|Owners],
tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]);
none ->
- OldOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
+ OldOwner = jlib:short_prepd_bare_jid(JID),
case lists:member(OldOwner, Owners) of
true ->
NewOwners = Owners--[OldOwner],
@@ -2444,9 +2488,9 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
ok
end
end, Entities),
- {result, []};
- _ ->
- {error, ?ERR_FORBIDDEN}
+ {result, []};
+ _ ->
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -2462,7 +2506,7 @@ get_options(Host, Node, JID, SubID, Lang) ->
get_options_helper(JID, Lang, Node, NodeID, SubID, Type);
false ->
{error, extended_error(
- ?ERR_FEATURE_NOT_IMPLEMENTED,
+ 'feature-not-implemented',
unsupported, "subscription-options")}
end
end,
@@ -2472,9 +2516,11 @@ get_options(Host, Node, JID, SubID, Lang) ->
end.
get_options_helper(JID, Lang, Node, NodeID, SubID, Type) ->
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
+ Subscriber = try exmpp_jid:parse(JID) of
+ J -> jlib:short_jid(J)
+ catch
+ _ ->
+ {"", "", ""} %%pablo TODO: "" or <<>> ?. short_jid uses exmpp_jid:node/1, etc. that returns binaries
end,
{result, Subs} = node_call(Type, get_subscriptions,
[NodeID, Subscriber]),
@@ -2485,11 +2531,11 @@ get_options_helper(JID, Lang, Node, NodeID, SubID, Type) ->
end, [], Subs),
case {SubID, SubIDs} of
{_, []} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")};
+ {error, extended_error('not-acceptable', "not-subscribed")};
{[], [SID]} ->
read_sub(Subscriber, Node, NodeID, SID, Lang);
{[], _} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")};
+ {error, extended_error('not-acceptable', "subid-required")};
{_, _} ->
read_sub(Subscriber, Node, NodeID, SubID, Lang)
end.
@@ -2497,13 +2543,14 @@ get_options_helper(JID, Lang, Node, NodeID, SubID, Type) ->
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")};
+ {error, extended_error('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, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options),
+ OptionsEl = #xmlel{ns = ?NS_PUBSUB, name = 'options',
+ attrs = [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)),
+ ?XMLATTR('Subid', SubID) | nodeAttr(Node)],
+ children = [XdataEl]},
+ PubsubEl = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children = [OptionsEl]},
{result, PubsubEl}
end.
@@ -2515,7 +2562,7 @@ set_options(Host, Node, JID, SubID, Configuration) ->
SubID, Type);
false ->
{error, extended_error(
- ?ERR_FEATURE_NOT_IMPLEMENTED,
+ 'feature-not-implemented',
unsupported, "subscription-options")}
end
end,
@@ -2529,9 +2576,10 @@ set_options_helper(Configuration, JID, NodeID, SubID, Type) ->
{result, GoodSubOpts} -> GoodSubOpts;
_ -> invalid
end,
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
+ Subscriber = try exmpp_jid:parse(JID) of
+ J -> jlib:short_jid(J)
+ catch
+ _ -> {"", "", ""} %%pablo TODO: "" or <<>> ?. short_jid uses exmpp_jid:node/1, etc. that returns binaries
end,
{result, Subs} = node_call(Type, get_subscriptions,
[NodeID, Subscriber]),
@@ -2542,21 +2590,21 @@ set_options_helper(Configuration, JID, NodeID, SubID, Type) ->
end, [], Subs),
case {SubID, SubIDs} of
{_, []} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")};
+ {error, extended_error('not-acceptable', "not-subscribed")};
{[], [SID]} ->
write_sub(Subscriber, NodeID, SID, SubOpts);
{[], _} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")};
+ {error, extended_error('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")};
+ {error, extended_error('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")};
+ {error, extended_error('not-acceptable', "invalid-subid")};
{result, _} ->
{result, []}
end.
@@ -2577,9 +2625,9 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
if
not RetrieveFeature ->
%% Service does not support retreive subscriptions
- {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-subscriptions")}, Acc};
+ {{error, extended_error('feature-not-implemented', unsupported, "retrieve-subscriptions")}, Acc};
true ->
- Subscriber = jlib:jid_remove_resource(JID),
+ Subscriber = exmpp_jid:bare(JID),
{result, Subscriptions} = node_action(Host, Type, get_entity_subscriptions, [Host, Subscriber]),
{Status, [Subscriptions|Acc]}
end
@@ -2592,13 +2640,12 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
({#pubsub_node{nodeid = {_, SubsNode}}, Subscription}) ->
case Node of
<<>> ->
- [{xmlelement, "subscription",
- [{"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('node', node_to_string(SubsNode)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
SubsNode ->
- [{xmlelement, "subscription",
- [{"subscription", subscription_to_string(Subscription)}],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('subscription', subscription_to_string(Subscription))]}];
_ ->
[]
end;
@@ -2607,84 +2654,81 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
({#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)],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name='subscription',
+ attrs = [?XMLATTR('jid', exmpp_jid:jid_to_binary(SubJID)),
+ ?XMLATTR('subid', SubID),
+ ?XMLATTR('subscription', subscription_to_string(Subscription)) | nodeAttr(SubsNode)]}];
SubsNode ->
- [{xmlelement, "subscription",
- [{"jid", jlib:jid_to_string(SubJID)},
- {"subid", SubID},
- {"subscription", subscription_to_string(Subscription)}],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription',
+ attrs = [?XMLATTR('jid', exmpp_jid:jid_to_binary(SubJID)),
+ ?XMLATTR('subid', SubID),
+ ?XMLATTR('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)],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('node', node_to_string(SubsNode)),
+ ?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
SubsNode ->
- [{xmlelement, "subscription",
- [{"jid", jlib:jid_to_string(SubJID)},
- {"subscription", subscription_to_string(Subscription)}],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
_ ->
[]
end
end, lists:usort(lists:flatten(Subscriptions))),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "subscriptions", [],
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscriptions', children =
+ 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,
+ 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('feature-not-implemented', unsupported, "manage-subscriptions")};
+ Affiliation /= owner ->
+ %% Entity is not an owner
+ {error, 'forbidden'};
+ true ->
+ node_call(Type, get_node_subscriptions, [NodeId])
+ end
+ end,
case transaction(Host, Node, Action, sync_dirty) of
+ {result, {_, []}} ->
+ {error, 'item-not-found'};
{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}],
- []}]
+ ({{AU, AS, AR}, Subscription}) ->
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
+ ({{AU, AS, AR}, Subscription, SubId}) ->
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription)),
+ ?XMLATTR('subid', SubId)]}]
end, Subscriptions),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "subscriptions", nodeAttr(Node),
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscriptions', attrs = nodeAttr(Node), children =
+ Entities}]}};
Error ->
Error
end.
set_subscriptions(Host, Node, From, EntitiesEls) ->
- Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)),
+ Owner = jlib:short_prepd_bare_jid(From),
Entities =
lists:foldl(
fun(El, Acc) ->
@@ -2693,34 +2737,43 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
error;
_ ->
case El of
- {xmlelement, "subscription", Attrs, _} ->
- JID = jlib:string_to_jid(
- xml:get_attr_s("jid", Attrs)),
+ #xmlel{name = 'subscription', attrs = Attrs} ->
+ JID = try
+ exmpp_jid:parse(
+ exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
+ catch
+ _:_ ->
+ error
+ end,
Subscription = string_to_subscription(
- xml:get_attr_s("subscription", Attrs)),
- SubId = xml:get_attr_s("subid", Attrs),
+ exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subscription', false)),
+ SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, "subid", false),
if
(JID == error) or
(Subscription == false) ->
error;
true ->
- [{jlib:jid_tolower(JID), Subscription, SubId} | Acc]
+ [{JID, Subscription, SubId} | Acc]
end
end
end
end, [], EntitiesEls),
case Entities of
error ->
- {error, ?ERR_BAD_REQUEST};
+ {error, '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}
+ Stanza = #xmlel{ns = ?NS_JABBER_CLIENT,
+ name = 'message',
+ children =
+ [#xmlel{ns = ?NS_PUBSUB,
+ name = 'pubsub',
+ children =
+ [#xmlel{ns = ?NS_PUBSUB,
+ name = 'subscription',
+ attrs = [?XMLATTR('jid', exmpp_jid:to_binary(JID)),
+ ?XMLATTR('subsription', subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
+ ejabberd_router ! {route, service_jid(Host), JID, Stanza}
end,
Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}) ->
case lists:member(Owner, Owners) of
@@ -2734,10 +2787,10 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
end, [], Entities),
case Result of
[] -> {result, []};
- _ -> {error, ?ERR_NOT_ACCEPTABLE}
+ _ -> {error, 'not-acceptable'}
end;
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -2746,14 +2799,16 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
end
end.
+
%% @spec (OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, SubscriberResource}, AllowedGroups)
%% -> {PresenceSubscription, RosterGroup}
get_roster_info(OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, AllowedGroups) ->
+ OwnerServerB = list_to_binary(OwnerServer),
{Subscription, Groups} =
ejabberd_hooks:run_fold(
- roster_get_jid_info, OwnerServer,
+ roster_get_jid_info, OwnerServerB,
{none, []},
- [OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, ""}]),
+ [OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, undefined}]),
PresenceSubscription = (Subscription == both) orelse (Subscription == from)
orelse ({OwnerUser, OwnerServer} == {SubscriberUser, SubscriberServer}),
RosterGroup = lists:any(fun(Group) ->
@@ -2813,8 +2868,8 @@ string_to_node(SNode) -> list_to_binary(SNode).
%% @doc Generate pubsub service JID.
service_jid(Host) ->
case Host of
- {U,S,_} -> {jid, U, S, "", U, S, ""};
- _ -> {jid, "", Host, "", "", Host, ""}
+ {U,S,_} -> exmpp_jid:make(U, S);
+ _ -> exmpp_jid:make(Host)
end.
%% @spec (LJID, NotifyType, Depth, NodeOptions, SubOptions) -> boolean()
@@ -2861,51 +2916,52 @@ presence_can_deliver({User, Server, _}, true) ->
%% @doc Count 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([#xmlel{}|Tail], Count) -> payload_xmlelements(Tail, Count+1);
payload_xmlelements([_|Tail], Count) -> payload_xmlelements(Tail, Count).
%% @spec (Els) -> stanza()
-%% Els = [xmlelement()]
+%% Els = [xmlelement()]
%% @doc Build pubsub event stanza
event_stanza(Els) ->
event_stanza_withmoreels(Els, []).
+
event_stanza_with_delay(Els, ModifNow, ModifLjid) ->
DateTime = calendar:now_to_datetime(ModifNow),
MoreEls = [jlib:timestamp_to_xml(DateTime, utc, ModifLjid, "")],
event_stanza_withmoreels(Els, MoreEls).
event_stanza_withmoreels(Els, MoreEls) ->
- {xmlelement, "message", [],
- [{xmlelement, "event", [{"xmlns", ?NS_PUBSUB_EVENT}], Els} | MoreEls]}.
+ #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'event', children = Els} | MoreEls]}.
%%%%%% broadcast functions
-broadcast_publish_item(Host, Node, NodeId, Type, NodeOptions, Removed, ItemId, _From, Payload) ->
- %broadcast(Host, Node, NodeId, NodeOptions, none, true, "items", ItemEls)
+broadcast_publish_item(Host, Node, NodeId, Type, Options, Removed, ItemId, _From, Payload) ->
+ %broadcast(Host, Node, NodeId, Options, none, true, 'items', ItemEls)
case get_collection_subscriptions(Host, Node) of
- SubsByDepth when is_list(SubsByDepth) ->
- Content = case get_option(NodeOptions, deliver_payloads) of
+ [] ->
+ {result, false};
+
+ SubsByDepth when is_list(SubsByDepth) ->
+ Content = case get_option(Options, deliver_payloads) of
true -> Payload;
false -> []
end,
Stanza = event_stanza(
- [{xmlelement, "items", nodeAttr(Node),
- [{xmlelement, "item", itemAttr(ItemId), Content}]}]),
- broadcast_stanza(Host, Node, NodeId, Type,
- NodeOptions, SubsByDepth, items, Stanza),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = itemAttr(ItemId), children = Content}]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, Options, SubsByDepth, items, Stanza),
case Removed of
[] ->
ok;
_ ->
- case get_option(NodeOptions, notify_retract) of
+ case get_option(Options, 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);
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'retract', attrs = itemAttr(RId)} || RId <- Removed]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, Options, SubsByDepth, items, RetractStanza);
_ ->
ok
end
@@ -2920,16 +2976,18 @@ broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds) ->
broadcast_retract_items(_Host, _Node, _NodeId, _Type, _NodeOptions, [], _ForceNotify) ->
{result, false};
broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, ForceNotify) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, ForceNotify, "retract", RetractEls)
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, ForceNotify, 'retract', RetractEls)
case (get_option(NodeOptions, notify_retract) or ForceNotify) of
true ->
case get_collection_subscriptions(Host, Node) of
- SubsByDepth when is_list(SubsByDepth) ->
+ [] ->
+ {result, false};
+
+ 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),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'retract', attrs = itemAttr(ItemId)} || ItemId <- ItemIds]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, items, Stanza),
{result, true};
_ ->
{result, false}
@@ -2939,16 +2997,16 @@ broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, ForceNot
end.
broadcast_purge_node(Host, Node, NodeId, Type, NodeOptions) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, false, "purge", [])
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, false, 'purge', [])
case get_option(NodeOptions, notify_retract) of
true ->
case get_collection_subscriptions(Host, Node) of
+ [] ->
+ {result, false};
SubsByDepth when is_list(SubsByDepth) ->
Stanza = event_stanza(
- [{xmlelement, "purge", nodeAttr(Node),
- []}]),
- broadcast_stanza(Host, Node, NodeId, Type,
- NodeOptions, SubsByDepth, nodes, Stanza),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'purge', attrs = nodeAttr(Node)}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza),
{result, true};
_ ->
{result, false}
@@ -2958,7 +3016,7 @@ broadcast_purge_node(Host, Node, NodeId, Type, NodeOptions) ->
end.
broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_delete, false, "delete", [])
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_delete, false, 'delete', [])
case get_option(NodeOptions, notify_delete) of
true ->
case SubsByDepth of
@@ -2966,10 +3024,8 @@ broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) ->
{result, false};
_ ->
Stanza = event_stanza(
- [{xmlelement, "delete", nodeAttr(Node),
- []}]),
- broadcast_stanza(Host, Node, NodeId, Type,
- NodeOptions, SubsByDepth, nodes, Stanza),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'delete', attrs = nodeAttr(Node)}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza),
{result, true}
end;
_ ->
@@ -2977,22 +3033,25 @@ broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) ->
end.
broadcast_config_notification(Host, Node, NodeId, Type, NodeOptions, Lang) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_config, false, "items", ConfigEls)
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_config, false, 'items', ConfigEls)
case get_option(NodeOptions, notify_config) of
true ->
case get_collection_subscriptions(Host, Node) of
+ [] ->
+ {result, false};
SubsByDepth when is_list(SubsByDepth) ->
Content = case get_option(NodeOptions, deliver_payloads) of
true ->
- [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
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),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = [?XMLATTR('id', <<"configuration">>)], children =
+ Content}]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza),
{result, true};
_ ->
{result, false}
@@ -3031,6 +3090,7 @@ get_options_for_subs(NodeID, Subs) ->
end, [], Subs).
% TODO: merge broadcast code that way
+% TODO: pablo: Why is this commented? Seems to be present on trunk.
%broadcast(Host, Node, NodeId, Type, NodeOptions, Feature, Force, ElName, SubEls) ->
% case (get_option(NodeOptions, Feature) or Force) of
% true ->
@@ -3068,14 +3128,15 @@ broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyTyp
end,
SHIMStanza = add_headers(Stanza, collection_shim(Node, Nodes)),
lists:foreach(fun(To) ->
- ejabberd_router ! {route, From, jlib:make_jid(To), SHIMStanza}
+ {TU, TS, TR} = To,
+ ejabberd_router ! {route, From, exmpp_jid:make(TU, TS, TR), SHIMStanza}
end, LJIDs)
end, NodesByJID),
%% Handles implicit presence subscriptions
case Host of
{LUser, LServer, LResource} ->
SenderResource = case LResource of
- [] ->
+ [] ->
case user_resources(LUser, LServer) of
[Resource|_] -> Resource;
_ -> ""
@@ -3088,22 +3149,21 @@ broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyTyp
%% 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
- Sender = jlib:make_jid(LUser, LServer, ""),
+ Sender = exmpp_jid:make(LUser, LServer),
%%ReplyTo = jlib:make_jid(LUser, LServer, SenderResource), % This has to be used
case catch ejabberd_c2s:get_subscribed(C2SPid) of
Contacts when is_list(Contacts) ->
lists:foreach(fun({U, S, _}) ->
spawn(fun() ->
- LJIDs = lists:foldl(fun(R, Acc) ->
- LJID = {U, S, R},
- case is_caps_notify(LServer, Node, LJID) of
- true -> [LJID | Acc];
+ Rs = lists:foldl(fun(R, Acc) ->
+ case is_caps_notify(LServer, Node, {U, S, R}) of
+ true -> [R | Acc];
false -> Acc
end
end, [], user_resources(U, S)),
- lists:foreach(fun(To) ->
- ejabberd_router ! {route, Sender, jlib:make_jid(To), Stanza}
- end, LJIDs)
+ lists:foreach(fun(R) ->
+ ejabberd_router ! {route, Sender, exmpp_jid:make(U, S, R), Stanza}
+ end, Rs)
end)
end, Contacts);
_ ->
@@ -3168,21 +3228,22 @@ is_caps_notify(Host, Node, LJID) ->
%%The service does not support retrieval of default node configuration.
%%
get_configure(Host, ServerHost, Node, From, Lang) ->
+ ServerHostB = list_to_binary(ServerHost),
Action =
fun(#pubsub_node{options = Options, type = Type, id = NodeId}) ->
case node_call(Type, get_affiliation, [NodeId, From]) of
{result, owner} ->
- Groups = ejabberd_hooks:run_fold(roster_groups, ServerHost, [], [ServerHost]),
+ Groups = ejabberd_hooks:run_fold(roster_groups, ServerHostB, [], [ServerHostB]),
{result,
- [{xmlelement, "pubsub",
- [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "configure", nodeAttr(Node),
- [{xmlelement, "x",
- [{"xmlns", ?NS_XDATA}, {"type", "form"}],
+ #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'configure', attrs =
+ nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"form">>)], children =
get_configure_xfields(Type, Options, Lang, Groups)
- }]}]}]};
+ }]}]}};
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -3193,11 +3254,11 @@ get_configure(Host, ServerHost, Node, From, Lang) ->
get_default(Host, Node, _From, Lang) ->
Type = select_type(Host, Host, Node),
Options = node_options(Type),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "default", [],
- [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}],
+ {result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'default', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
get_configure_xfields(Type, Options, Lang, [])
- }]}]}]}.
+ }]}]}}.
%% Get node option
%% The result depend of the node type plugin system.
@@ -3266,8 +3327,8 @@ max_items(Host, Options) ->
-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])).
+ exmpp_jid:to_list(get_option(Options, Var)),
+ [exmpp_jid:to_list(O) || O <- Opts])).
-define(ALIST_CONFIG_FIELD(Label, Var, Opts),
?LISTXFIELD(Label, "pubsub#" ++ atom_to_list(Var),
@@ -3283,7 +3344,7 @@ max_items(Host, Options) ->
[node_to_string(N) || N <- get_option(Options, Var, [])])).
get_configure_xfields(_Type, Options, Lang, Groups) ->
- [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NODE_CONFIG),
+ [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NODE_CONFIG_s),
?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),
@@ -3317,19 +3378,19 @@ get_configure_xfields(_Type, Options, Lang, Groups) ->
%%The specified node does not exist.
%%
set_configure(Host, Node, From, Els, Lang) ->
- case xml:remove_cdata(Els) of
- [{xmlelement, "x", _Attrs1, _Els1} = XEl] ->
- case {xml:get_tag_attr_s("xmlns", XEl), xml:get_tag_attr_s("type", XEl)} of
- {?NS_XDATA, "cancel"} ->
+ case exmpp_xml:remove_cdata_from_list(Els) of
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x'} = XEl] ->
+ case exmpp_xml:get_attribute_as_list(XEl, 'type', undefined) of
+ "cancel" ->
{result, []};
- {?NS_XDATA, "submit"} ->
+ "submit" ->
Action =
fun(#pubsub_node{options = Options, type = Type, id = NodeId} = N) ->
case node_call(Type, get_affiliation, [NodeId, From]) of
{result, owner} ->
case jlib:parse_xdata_submit(XEl) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
XData ->
OldOpts = case Options of
[] -> node_options(Type);
@@ -3346,7 +3407,7 @@ set_configure(Host, Node, From, Els, Lang) ->
end
end;
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, transaction) of
@@ -3360,10 +3421,10 @@ set_configure(Host, Node, From, Els, Lang) ->
Other
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
add_opt(Key, Value, Opts) ->
@@ -3379,7 +3440,7 @@ add_opt(Key, Value, Opts) ->
_ -> error
end,
case BoolVal of
- error -> {error, ?ERR_NOT_ACCEPTABLE};
+ error -> {error, 'not-acceptable'};
_ -> set_xoption(Host, Opts, add_opt(Opt, BoolVal, NewOpts))
end).
@@ -3393,13 +3454,13 @@ add_opt(Key, Value, Opts) ->
IVal =< Max ->
set_xoption(Host, Opts, add_opt(Opt, IVal, NewOpts));
_ ->
- {error, ?ERR_NOT_ACCEPTABLE}
+ {error, 'not-acceptable'}
end).
-define(SET_ALIST_XOPT(Opt, Val, Vals),
case lists:member(Val, [atom_to_list(V) || V <- Vals]) of
true -> set_xoption(Host, Opts, add_opt(Opt, list_to_atom(Val), NewOpts));
- false -> {error, ?ERR_NOT_ACCEPTABLE}
+ false -> {error, 'not-acceptable'}
end).
-define(SET_LIST_XOPT(Opt, Val),
@@ -3506,14 +3567,17 @@ get_cached_item(Host, NodeId) ->
end.
%%%% plugin handling
-
-plugins(Host) ->
+plugins(Host) when is_binary(Host) ->
+ plugins(binary_to_list(Host));
+plugins(Host) when is_list(Host) ->
case catch ets:lookup(gen_mod:get_module_proc(Host, config), plugins) of
[{plugins, []}] -> [?STDNODE];
[{plugins, PL}] -> PL;
_ -> [?STDNODE]
end.
-select_type(ServerHost, Host, Node, Type)->
+select_type(ServerHost, Host, Node, Type) when is_list(ServerHost) ->
+ select_type(list_to_binary(ServerHost), Host, Node, Type);
+select_type(ServerHost, Host, Node, Type) ->
SelectedType = case Host of
{_User, _Server, _Resource} ->
case catch ets:lookup(gen_mod:get_module_proc(ServerHost, config), pep_mapping) of
@@ -3654,28 +3718,27 @@ transaction(Fun, Trans) ->
{atomic, {error, Error}} -> {error, Error};
{aborted, Reason} ->
?ERROR_MSG("transaction return internal error: ~p~n", [{aborted, Reason}]),
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
{'EXIT', Reason} ->
?ERROR_MSG("transaction return internal error: ~p~n", [{'EXIT', Reason}]),
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal-server-error'};
Other ->
?ERROR_MSG("transaction return internal error: ~p~n", [Other]),
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, '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, Ext, []).
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])}.
+ extended_error(Error, unsupported,
+ [?XMLATTR('feature', Feature)]);
+extended_error(Error, Ext, ExtAttrs) ->
+ Pubsub_Err = #xmlel{ns = ?NS_PUBSUB_ERRORS, name = Ext, attrs = ExtAttrs},
+ exmpp_xml:append_child(exmpp_stanza:error(?NS_JABBER_CLIENT, Error),
+ Pubsub_Err).
%% Give a uniq identifier
uniqid() ->
@@ -3684,29 +3747,29 @@ uniqid() ->
% node attributes
nodeAttr(Node) when is_list(Node) ->
- [{"node", Node}];
+ [?XMLATTR('node', Node)];
nodeAttr(Node) ->
- [{"node", node_to_string(Node)}].
+ [?XMLATTR('node', node_to_string(Node))].
% item attributes
itemAttr([]) -> [];
-itemAttr(ItemId) -> [{"id", ItemId}].
+itemAttr(ItemId) -> [?XMLATTR('id', ItemId)].
% build item elements from item list
itemsEls(Items) ->
lists:map(fun(#pubsub_item{itemid = {ItemId, _}, payload = Payload}) ->
- {xmlelement, "item", itemAttr(ItemId), Payload}
+ #xmlel{ns = ?NS_PUBSUB, name = 'item', attrs = itemAttr(ItemId), children = Payload}
end, Items).
-add_message_type({xmlelement, "message", Attrs, Els}, Type) ->
- {xmlelement, "message", [{"type", Type}|Attrs], Els};
-add_message_type(XmlEl, _Type) ->
- XmlEl.
+add_message_type(#xmlel{name='message'} = El, Type) -> exmpp_stanza:set_type(El, Type);
+add_message_type(El, _Type) -> El.
-add_headers({xmlelement, Name, Attrs, Els}, HeaderEls) ->
- HeaderEl = {xmlelement, "headers", [{"xmlns", ?NS_SHIM}], HeaderEls},
- {xmlelement, Name, Attrs, [HeaderEl | Els]}.
+add_headers(#xmlel{} = El, HeaderEls) ->
+ HeaderEl = #xmlel{ns = ?NS_SHIM, name = 'headers', children = HeaderEls},
+ exmpp_xml:prepend_child(El, HeaderEl).
collection_shim(Node, Nodes) ->
- [{xmlelement, "header", [{"name", "Collection"}],
- [{xmlcdata, node_to_string(N)}]} || N <- Nodes -- [Node]].
+ [#xmlel{ns = ?NS_PUBSUB, name ='header',
+ attrs = [?XMLATTR('name', <<"Collection">>)],
+ children = [ ?XMLCDATA(node_to_string(N))]
+ } || N <- Nodes -- [Node]].
diff --git a/src/mod_pubsub/mod_pubsub_odbc.erl b/src/mod_pubsub/mod_pubsub_odbc.erl
index 8b3d38f4a..92e7275ea 100644
--- a/src/mod_pubsub/mod_pubsub_odbc.erl
+++ b/src/mod_pubsub/mod_pubsub_odbc.erl
@@ -49,9 +49,10 @@
-behaviour(gen_server).
-behaviour(gen_mod).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-include("adhoc.hrl").
--include("jlib.hrl").
-include("pubsub.hrl").
-define(STDTREE, "tree_odbc").
@@ -136,6 +137,12 @@
plugins = [?STDNODE],
send_loop}).
+
+%%------------------- Ad hoc commands nodes --------------------------
+-define(NS_PUBSUB_GET_PENDING, "http://jabber.org/protocol/pubsub#get-pending").
+%%--------------------------------------------------------------------
+
+
%%====================================================================
%% API
%%====================================================================
@@ -165,9 +172,9 @@ stop(Host) ->
%%--------------------------------------------------------------------
%% Function: init(Args) -> {ok, State} |
-%% {ok, State, Timeout} |
-%% ignore |
-%% {stop, Reason}
+%% {ok, State, Timeout} |
+%% ignore |
+%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([ServerHost, Opts]) ->
@@ -178,39 +185,41 @@ init([ServerHost, Opts]) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
LastItemCache = gen_mod:get_opt(last_item_cache, Opts, false),
MaxItemsNode = gen_mod:get_opt(max_items_node, Opts, ?MAXITEMS),
+ ServerHostB = list_to_binary(ServerHost),
pubsub_index:init(Host, ServerHost, Opts),
ets:new(gen_mod:get_module_proc(Host, config), [set, named_table]),
ets:new(gen_mod:get_module_proc(ServerHost, config), [set, named_table]),
ets:new(gen_mod:get_module_proc(Host, last_items), [set, named_table]),
ets:new(gen_mod:get_module_proc(ServerHost, last_items), [set, named_table]),
{Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts),
- mod_disco:register_feature(ServerHost, ?NS_PUBSUB),
+ mod_disco:register_feature(ServerHost, ?NS_PUBSUB_s),
ets:insert(gen_mod:get_module_proc(Host, config), {nodetree, NodeTree}),
ets:insert(gen_mod:get_module_proc(Host, config), {plugins, Plugins}),
ets:insert(gen_mod:get_module_proc(Host, config), {last_item_cache, LastItemCache}),
ets:insert(gen_mod:get_module_proc(Host, config), {max_items_node, MaxItemsNode}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {nodetree, NodeTree}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {plugins, Plugins}),
- ets:insert(gen_mod:get_module_proc(ServerHost, config), {last_item_cache, Plugins}),
- ets:insert(gen_mod:get_module_proc(ServerHost, config), {max_items_node, LastItemCache}),
+ ets:insert(gen_mod:get_module_proc(ServerHost, config), {last_item_cache, LastItemCache}),
+ ets:insert(gen_mod:get_module_proc(ServerHost, config), {max_items_node, MaxItemsNode}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {pep_mapping, PepMapping}),
- ejabberd_hooks:add(disco_sm_identity, ServerHost, ?MODULE, disco_sm_identity, 75),
- ejabberd_hooks:add(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75),
- ejabberd_hooks:add(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75),
- ejabberd_hooks:add(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 80),
- ejabberd_hooks:add(roster_in_subscription, ServerHost, ?MODULE, in_subscription, 50),
- ejabberd_hooks:add(roster_out_subscription, ServerHost, ?MODULE, out_subscription, 50),
- ejabberd_hooks:add(remove_user, ServerHost, ?MODULE, remove_user, 50),
- ejabberd_hooks:add(anonymous_purge_hook, ServerHost, ?MODULE, remove_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER, ?MODULE, iq_sm, IQDisc),
+ ejabberd_hooks:add(disco_sm_identity, ServerHostB, ?MODULE, disco_sm_identity, 75),
+ ejabberd_hooks:add(disco_sm_features, ServerHostB, ?MODULE, disco_sm_features, 75),
+ ejabberd_hooks:add(disco_sm_items, ServerHostB, ?MODULE, disco_sm_items, 75),
+ ejabberd_hooks:add(presence_probe_hook, ServerHostB, ?MODULE, presence_probe, 80),
+ ejabberd_hooks:add(roster_in_subscription, ServerHostB, ?MODULE, in_subscription, 50),
+ ejabberd_hooks:add(roster_out_subscription, ServerHostB, ?MODULE, out_subscription, 50),
+ ejabberd_hooks:add(remove_user, ServerHostB, ?MODULE, remove_user, 50),
+ ejabberd_hooks:add(anonymous_purge_hook, ServerHostB, ?MODULE, remove_user, 50),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB_OWNER, ?MODULE, iq_sm, IQDisc),
+ ejabberd_router:register_route(Host),
case lists:member(?PEPNODE, Plugins) of
true ->
- ejabberd_hooks:add(disco_local_identity, ServerHost, ?MODULE, disco_local_identity, 75),
- ejabberd_hooks:add(disco_local_features, ServerHost, ?MODULE, disco_local_features, 75),
- ejabberd_hooks:add(disco_local_items, ServerHost, ?MODULE, disco_local_items, 75),
- gen_iq_handler:add_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB, ?MODULE, iq_local, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB_OWNER, ?MODULE, iq_local, IQDisc);
+ ejabberd_hooks:add(disco_local_identity, ServerHostB, ?MODULE, disco_local_identity, 75),
+ ejabberd_hooks:add(disco_local_features, ServerHostB, ?MODULE, disco_local_features, 75),
+ ejabberd_hooks:add(disco_local_items, ServerHostB, ?MODULE, disco_local_items, 75),
+ gen_iq_handler:add_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB, ?MODULE, iq_local, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB_OWNER, ?MODULE, iq_local, IQDisc);
false ->
ok
end,
@@ -270,11 +279,13 @@ init_nodes(Host, ServerHost, _NodeTree, Plugins) ->
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");
+ create_node(Host, ServerHost, string_to_node("/home/" ++ ServerHost), service_jid(Host), "hometree_odbc");
false ->
ok
end.
+
+
send_queue(State, Msg) ->
Pid = State#state.send_loop,
case is_process_alive(Pid) of
@@ -292,8 +303,8 @@ send_loop(State) ->
{presence, JID, Pid} ->
Host = State#state.host,
ServerHost = State#state.server_host,
- LJID = jlib:jid_tolower(JID),
- BJID = jlib:jid_remove_resource(LJID),
+ LJID = jlib:short_prepd_jid(JID),
+ BJID = jlib:short_prepd_bare_jid(JID),
%% 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) ->
@@ -320,7 +331,7 @@ send_loop(State) ->
%% 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),
+ {User, Server, Resource} = LJID,
case mod_caps:get_caps({User, Server, Resource}) of
nothing ->
%% we don't have caps, no need to handle PEP items
@@ -331,18 +342,18 @@ send_loop(State) ->
lists:foreach(
fun({U, S, R}) ->
case S of
- ServerHost -> %% local contacts
- case ejabberd_sm:get_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
+ ServerHost -> %% local contacts
+ case ejabberd_sm:get_user_resources(U, S) of
+ [] -> %% offline
+ PeerJID = exmpp_jid:make(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);
_ ->
@@ -366,7 +377,7 @@ send_loop(State) ->
true ->
Host = State#state.host,
ServerHost = State#state.server_host,
- Owner = jlib:jid_remove_resource(jlib:jid_tolower(JID)),
+ Owner = jlib:short_prepd_bare_jid(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 ->
@@ -416,37 +427,37 @@ send_loop(State) ->
identity(Host) ->
Identity = case lists:member(?PEPNODE, plugins(Host)) of
- true -> [{"category", "pubsub"}, {"type", "pep"}];
- false -> [{"category", "pubsub"}, {"type", "service"}]
+ true -> [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)];
+ false -> [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"service">>)]
end,
- {xmlelement, "identity", Identity, []}.
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = Identity}.
-disco_local_identity(Acc, _From, To, [], _Lang) ->
- Acc ++ [identity(To#jid.lserver)];
+disco_local_identity(Acc, _From, To, <<>>, _Lang) ->
+ Acc ++ [identity(exmpp_jid:prep_domain_as_list(To))];
disco_local_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
-disco_local_features(Acc, _From, To, [], _Lang) ->
- Host = To#jid.lserver,
+disco_local_features(Acc, _From, To, <<>>, _Lang) ->
+ Host = exmpp_jid:prep_domain_as_list(To),
Feats = case Acc of
{result, I} -> I;
_ -> []
end,
{result, Feats ++ lists:map(fun(Feature) ->
- ?NS_PUBSUB++"#"++Feature
+ ?NS_PUBSUB_s++"#"++Feature
end, features(Host, []))};
disco_local_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
-disco_local_items(Acc, _From, _To, [], _Lang) ->
+disco_local_items(Acc, _From, _To, <<>>, _Lang) ->
Acc;
disco_local_items(Acc, _From, _To, _Node, _Lang) ->
Acc.
-disco_sm_identity(Acc, _From, To, [], _Lang) ->
- Acc ++ [identity(To#jid.lserver)];
+disco_sm_identity(Acc, _From, To, <<>>, _Lang) ->
+ Acc ++ [identity(exmpp_jid:prep_domain_as_list(To))];
disco_sm_identity(Acc, From, To, Node, _Lang) ->
- LOwner = jlib:jid_tolower(jlib:jid_remove_resource(To)),
+ LOwner = jlib:short_prepd_bare_jid(To),
Acc ++ case node_disco_identity(LOwner, From, Node) of
{result, I} -> I;
_ -> []
@@ -455,7 +466,7 @@ disco_sm_identity(Acc, From, To, Node, _Lang) ->
disco_sm_features(Acc, _From, _To, [], _Lang) ->
Acc;
disco_sm_features(Acc, From, To, Node, _Lang) ->
- LOwner = jlib:jid_tolower(jlib:jid_remove_resource(To)),
+ LOwner = jlib:short_prepd_bare_jid(To),
Features = node_disco_features(LOwner, From, Node),
case {Acc, Features} of
{{result, AccFeatures}, {result, AddFeatures}} ->
@@ -466,36 +477,36 @@ disco_sm_features(Acc, From, To, Node, _Lang) ->
Acc
end.
-disco_sm_items(Acc, From, To, [], _Lang) ->
- Host = To#jid.lserver,
+disco_sm_items(Acc, From, To, <<>>, _Lang) ->
+ Host = exmpp_jid:prep_domain_as_list(To),
case tree_action(Host, get_subnodes, [Host, <<>>, From]) of
[] ->
Acc;
Nodes ->
- SBJID = jlib:jid_to_string(jlib:jid_remove_resource(To)),
+ SBJID = jlib:short_prepd_bare_jid(To),
Items = case Acc of
{result, I} -> I;
_ -> []
end,
NodeItems = lists:map(
fun(#pubsub_node{nodeid = {_, Node}}) ->
- {xmlelement, "item",
- [{"jid", SBJID}|nodeAttr(Node)],
- []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(SBJID)) | nodeAttr(Node)]}
end, Nodes),
{result, NodeItems ++ Items}
end;
-disco_sm_items(Acc, From, To, SNode, _Lang) ->
- Host = To#jid.lserver,
- Node = string_to_node(SNode),
+disco_sm_items(Acc, From, To, NodeB, _Lang) ->
+ Node = string_to_node(binary_to_list(NodeB)),
+ %% TODO, use iq_disco_items(Host, Node, From)
+ Host = exmpp_jid:prep_domain_as_list(To),
+ LJID = jlib:short_prepd_bare_jid(To),
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
% TODO call get_items/6 instead for access control (EJAB-1033)
case node_call(Type, get_items, [NodeId, From]) of
{result, []} ->
none;
{result, AllItems} ->
- SBJID = jlib:jid_to_string(jlib:jid_remove_resource(To)),
Items = case Acc of
{result, I} -> I;
_ -> []
@@ -503,7 +514,9 @@ disco_sm_items(Acc, From, To, SNode, _Lang) ->
NodeItems = lists:map(
fun(#pubsub_item{itemid = {Id, _}}) ->
{result, Name} = node_call(Type, get_item_name, [Host, Node, Id]),
- {xmlelement, "item", [{"jid", SBJID}, {"name", Name}], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(LJID)),
+ ?XMLATTR('name', Name)]}
end, AllItems),
{result, NodeItems ++ Items};
_ ->
@@ -519,11 +532,15 @@ disco_sm_items(Acc, From, To, SNode, _Lang) ->
%% presence hooks handling functions
%%
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID, JID, Pid) ->
- Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
+presence_probe(JID, JID, Pid) ->
+ {User, Server, Resource} = jlib:short_prepd_jid(JID),
+ Host = exmpp_jid:prep_domain_as_list(JID),
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:cast(Proc, {presence, JID, Pid}),
gen_server:cast(Proc, {presence, User, Server, [Resource], JID});
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{lserver = Host} = JID, _Pid) ->
+presence_probe(Peer, JID, _Pid) ->
+ {User, Server, Resource} = jlib:short_prepd_jid(Peer),
+ Host = exmpp_jid:prep_domain_as_list(JID),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:cast(Proc, {presence, User, Server, [Resource], JID}).
@@ -532,18 +549,18 @@ presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{
%%
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]
+ Owner = exmpp_jid:make(User, Server, ""),
+ {U, S, R} = jlib:short_prepd_jid(JID),
+ Rs = case R of
+ [] -> user_resources(U, S);
+ _ -> [R]
end,
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
- gen_server:cast(Proc, {presence, PUser, PServer, PResources, Owner});
-out_subscription(_,_,_,_) ->
+ gen_server:cast(Proc, {presence, U, S, Rs, Owner});
+out_subscription(_, _, _, _) ->
ok.
in_subscription(_, User, Server, Owner, unsubscribed, _) ->
- Subscriber = jlib:make_jid(User, Server, ""),
+ Subscriber = exmpp_jid:make(User, Server, ""),
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
gen_server:cast(Proc, {unsubscribe, Subscriber, Owner});
in_subscription(_, _, _, _, _, _) ->
@@ -554,19 +571,19 @@ in_subscription(_, _, _, _, _, _) ->
%%
remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
gen_server:cast(Proc, {remove_user, LUser, LServer}).
%%--------------------------------------------------------------------
%% 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}
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} |
+%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
%% @private
@@ -583,8 +600,8 @@ handle_call(stop, _From, State) ->
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State}
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
%% @private
@@ -599,7 +616,7 @@ handle_cast({presence, User, Server, Resources, JID}, State) ->
handle_cast({remove_user, LUser, LServer}, State) ->
spawn(fun() ->
Host = State#state.host,
- Owner = jlib:make_jid(LUser, LServer, ""),
+ Owner = exmpp_jid:make(LUser, LServer),
%% remove user's subscriptions
lists:foreach(fun(PType) ->
{result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Owner]),
@@ -618,12 +635,12 @@ handle_cast({remove_user, LUser, LServer}, State) ->
end, Affiliations)
end, State#state.plugins)
end),
- {noreply, State};
+ {noreply, State};
handle_cast({unsubscribe, Subscriber, Owner}, State) ->
spawn(fun() ->
Host = State#state.host,
- BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
+ BJID = jlib:short_prepd_bare_jid(Owner),
lists:foreach(fun(PType) ->
{result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Subscriber]),
lists:foreach(fun
@@ -652,8 +669,8 @@ handle_cast(_Msg, State) ->
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State}
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
%% @private
@@ -661,7 +678,7 @@ 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
+ case catch do_route(ServerHost, Access, Plugins, exmpp_jid:prep_domain_as_list(To), From, To, Packet) of
{'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]);
_ -> ok
end,
@@ -683,27 +700,31 @@ terminate(_Reason, #state{host = Host,
plugins = Plugins,
send_loop = SendLoop}) ->
ejabberd_router:unregister_route(Host),
+ ServerHostB = list_to_binary(ServerHost),
case lists:member(?PEPNODE, Plugins) of
- true ->
- 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),
- gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB),
- gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHost, ?NS_PUBSUB_OWNER);
- false ->
- ok
+ true ->
+ ejabberd_hooks:delete(disco_local_identity, ServerHostB, ?MODULE, disco_local_identity, 75),
+ ejabberd_hooks:delete(disco_local_features, ServerHostB, ?MODULE, disco_local_features, 75),
+ ejabberd_hooks:delete(disco_local_items, ServerHostB, ?MODULE, disco_local_items, 75),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, ServerHostB, ?NS_PUBSUB_OWNER);
+ false ->
+ ok
end,
- 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),
- 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),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER),
- mod_disco:unregister_feature(ServerHost, ?NS_PUBSUB),
+ ejabberd_hooks:delete(disco_local_identity, ServerHostB, ?MODULE, disco_local_identity, 75),
+ ejabberd_hooks:delete(disco_local_features, ServerHostB, ?MODULE, disco_local_features, 75),
+ ejabberd_hooks:delete(disco_local_items, ServerHostB, ?MODULE, disco_local_items, 75),
+ ejabberd_hooks:delete(disco_sm_identity, ServerHostB, ?MODULE, disco_sm_identity, 75),
+ ejabberd_hooks:delete(disco_sm_features, ServerHostB, ?MODULE, disco_sm_features, 75),
+ ejabberd_hooks:delete(disco_sm_items, ServerHostB, ?MODULE, disco_sm_items, 75),
+ ejabberd_hooks:delete(presence_probe_hook, ServerHostB, ?MODULE, presence_probe, 80),
+ ejabberd_hooks:delete(roster_in_subscription, ServerHostB, ?MODULE, in_subscription, 50),
+ ejabberd_hooks:delete(roster_out_subscription, ServerHostB, ?MODULE, out_subscription, 50),
+ ejabberd_hooks:delete(remove_user, ServerHostB, ?MODULE, remove_user, 50),
+ ejabberd_hooks:delete(anonymous_purge_hook, ServerHostB, ?MODULE, remove_user, 50),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHostB, ?NS_PUBSUB_OWNER),
+ mod_disco:unregister_feature(ServerHost, ?NS_PUBSUB_s),
SendLoop ! stop,
terminate_plugins(Host, ServerHost, Plugins, TreePlugin).
@@ -719,102 +740,103 @@ code_change(_OldVsn, State, _Extra) ->
%%% Internal functions
%%--------------------------------------------------------------------
do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
- {xmlelement, Name, Attrs, _Els} = Packet,
- case To of
- #jid{luser = "", lresource = ""} ->
+ #xmlel{name = Name} = Packet,
+ LNode = exmpp_jid:prep_node(To),
+ LRes = exmpp_jid:prep_resource(To),
+ case {LNode, LRes} of
+ {undefined, undefined} ->
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),
+ 'iq' ->
+ case exmpp_iq:xmlel_to_iq(Packet) of
+ #iq{type = get, ns = ?NS_DISCO_INFO,
+ payload = SubEl, lang = Lang} ->
+ QAttrs = SubEl#xmlel.attrs,
+ Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs, 'node', ""),
+ ServerHostB = list_to_binary(ServerHost),
Info = ejabberd_hooks:run_fold(
- disco_info, ServerHost, [],
- [ServerHost, ?MODULE, "", ""]),
+ disco_info, ServerHostB, [],
+ [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}]});
+ Result = #xmlel{ns = ?NS_DISCO_INFO,
+ name = 'query', attrs = QAttrs,
+ children = IQRes++Info},
+ exmpp_iq:result(Packet, Result);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(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),
+ #iq{type = get, ns = ?NS_DISCO_ITEMS,
+ payload = SubEl} = IQ ->
+ QAttrs = SubEl#xmlel.attrs,
+ Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs,
+ 'node', ""),
+ 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}]});
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS,
+ name = 'query', attrs = QAttrs,
+ children = IQRes},
+ exmpp_iq:result(Packet, Result);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(Packet, Error)
end,
ejabberd_router:route(To, From, Res);
- #iq{type = IQType, xmlns = ?NS_PUBSUB,
- lang = Lang, sub_el = SubEl} = IQ ->
+ #iq{type = IQType, ns = ?NS_PUBSUB,
+ lang = Lang, payload = SubEl} ->
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});
+ exmpp_iq:result(Packet, IQRes);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(Packet, Error)
end,
ejabberd_router:route(To, From, Res);
- #iq{type = IQType, xmlns = ?NS_PUBSUB_OWNER,
- lang = Lang, sub_el = SubEl} = IQ ->
+ #iq{type = IQType, ns = ?NS_PUBSUB_OWNER,
+ lang = Lang, payload = SubEl} ->
Res =
case iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) of
+ {result, []} ->
+ exmpp_iq:result(Packet);
{result, IQRes} ->
- jlib:iq_to_xml(
- IQ#iq{type = result,
- sub_el = IQRes});
+ exmpp_iq:result(Packet, IQRes);
{error, Error} ->
- jlib:make_error_reply(Packet, Error)
+ exmpp_iq:error(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,
+ #iq{type = get, ns = ?NS_VCARD = XMLNS,
+ lang = Lang} ->
+ VCard = #xmlel{ns = XMLNS, name = 'vCard',
+ children = iq_get_vcard(Lang)},
+ Res = exmpp_iq:result(Packet, VCard),
ejabberd_router:route(To, From, Res);
+ #iq{type = set, ns = ?NS_ADHOC} = IQ ->
+ Res = case iq_command(Host, ServerHost, From, IQ, Access, Plugins) of
+ {error, Error} ->
+ exmpp_iq:error(Packet, Error);
+ {result, IQRes} ->
+ exmpp_iq:result(Packet, IQRes)
+ end,
+ ejabberd_router:route(To, From, Res);
+
#iq{} ->
- Err = jlib:make_error_reply(
- Packet,
- ?ERR_FEATURE_NOT_IMPLEMENTED),
+ Err = exmpp_iq:error(Packet,
+ 'feature-not-implemented'),
ejabberd_router:route(To, From, Err);
_ ->
ok
end;
- "message" ->
- case xml:get_attr_s("type", Attrs) of
- "error" ->
+ 'message' ->
+ case exmpp_stanza:is_stanza_error(Packet) of
+ true ->
ok;
- _ ->
+ false ->
case find_authorization_response(Packet) of
none ->
ok;
invalid ->
ejabberd_router:route(To, From,
- jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST));
+ exmpp_message:error(Packet, 'bad-request'));
XFields ->
handle_authorization_response(Host, From, To, Packet, XFields)
end
@@ -823,13 +845,14 @@ do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
ok
end;
_ ->
- case xml:get_attr_s("type", Attrs) of
- "error" ->
+ case exmpp_stanza:get_type(Packet) of
+ <<"error">> ->
ok;
- "result" ->
+ <<"result">> ->
ok;
_ ->
- Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ 'item-not-found'),
ejabberd_router:route(To, From, Err)
end
end.
@@ -859,18 +882,18 @@ node_disco_info(Host, Node, From, Identity, Features) ->
end
end,
lists:map(fun(T) ->
- {xmlelement, "identity", [{"category", "pubsub"},
- {"type", T}], []}
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = [?XMLATTR('category', <<"pubsub">>),
+ ?XMLATTR('type', T)]}
end, Types)
end,
F = case Features of
false ->
[];
true ->
- [{xmlelement, "feature", [{"var", ?NS_PUBSUB}], []} |
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]} |
lists:map(fun
- ("rsm")-> {xmlelement, "feature", [{"var", ?NS_RSM}], []};
- (T) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []}
+ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
+ (T) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++T)]}
end, features(Type))]
end,
%% TODO: add meta-data info (spec section 5.4)
@@ -890,17 +913,17 @@ iq_disco_info(Host, SNode, From, Lang) ->
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_VCARD}], []}] ++
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
+ [?XMLATTR('category', "pubsub"),
+ ?XMLATTR('type', "service"),
+ ?XMLATTR('name', translate:translate(Lang, "Publish-Subscribe"))]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_DISCO_INFO_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_DISCO_ITEMS_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_VCARD_s)]}] ++
lists:map(fun
- ("rsm")-> {xmlelement, "feature", [{"var", ?NS_RSM}], []};
- (T) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []}
+ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
+ (Feature) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++Feature)]}
end, features(Host, Node))};
_ ->
node_disco_info(Host, Node, From)
@@ -909,9 +932,10 @@ iq_disco_info(Host, SNode, From, Lang) ->
iq_disco_items(Host, [], From, _RSM) ->
{result, lists:map(
fun(#pubsub_node{nodeid = {_, SubNode}, type = Type}) ->
- {result, Path} = node_call(Type, node_to_path, [SubNode]),
- [Name|_] = lists:reverse(Path),
- {xmlelement, "item", [{"jid", Host}, {"name", Name}|nodeAttr(SubNode)], []}
+ {result, Path} = node_call(Type, node_path, [SubNode]),
+ [Name | _] = lists:reverse(Path),
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host),
+ ?XMLATTR('name', Name) | nodeAttr(SubNode)]}
end, tree_action(Host, get_subnodes, [Host, <<>>, From]))};
iq_disco_items(Host, Item, From, RSM) ->
case string:tokens(Item, "!") of
@@ -928,12 +952,13 @@ iq_disco_items(Host, Item, From, RSM) ->
end,
Nodes = lists:map(
fun(#pubsub_node{nodeid = {_, SubNode}}) ->
- {xmlelement, "item", [{"jid", Host}|nodeAttr(SubNode)], []}
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host) | nodeAttr(SubNode)]}
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}], []}
+ {result, Name} = node_call(Type, get_item_name, [Host, Node, RN]),
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host),
+ ?XMLATTR('name', Name)]}
end, NodeItems),
{result, Nodes ++ Items ++ jlib:rsm_encode(RsmOut)}
end,
@@ -943,61 +968,63 @@ iq_disco_items(Host, Item, From, RSM) ->
end
end.
-iq_local(From, To, #iq{type = Type, sub_el = SubEl, xmlns = XMLNS, lang = Lang} = IQ) ->
- ServerHost = To#jid.lserver,
+iq_local(From, To, #iq{type = Type, payload = SubEl, ns = XMLNS, lang = Lang} = IQ_Rec) ->
+ ServerHost = exmpp_jid:prep_domain_as_list(To),
+ FromHost = exmpp_jid:prep_domain_as_list(To),
%% Accept IQs to server only from our own users.
if
- From#jid.lserver /= ServerHost ->
- IQ#iq{type = error, sub_el = [?ERR_FORBIDDEN, SubEl]};
+ FromHost /= ServerHost ->
+ exmpp_iq:error(IQ_Rec, 'forbidden');
true ->
- LOwner = jlib:jid_tolower(jlib:jid_remove_resource(From)),
+ LOwner = jlib:short_prepd_bare_jid(From),
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]}
+ {result, []} -> exmpp_iq:result(IQ_Rec);
+ {result, [IQRes]} -> exmpp_iq:result(IQ_Rec, IQRes);
+ {error, Error} -> exmpp_iq:error(IQ_Rec, Error)
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)),
+iq_sm(From, To, #iq{type = Type, payload = SubEl, ns = XMLNS, lang = Lang} = IQ_Rec) ->
+ ServerHost = exmpp_jid:prep_domain_as_list(To),
+ LOwner = jlib:short_prepd_bare_jid(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]}
+ {result, []} -> exmpp_iq:result(IQ_Rec);
+ {result, [IQRes]} -> exmpp_iq:result(IQ_Rec, IQRes);
+ {error, Error} -> exmpp_iq:error(IQ_Rec, Error)
end.
iq_get_vcard(Lang) ->
- [{xmlelement, "FN", [], [{xmlcdata, "ejabberd/mod_pubsub"}]},
- {xmlelement, "URL", [], [{xmlcdata, ?EJABBERD_URI}]},
- {xmlelement, "DESC", [],
- [{xmlcdata,
+ [#xmlel{ns = ?NS_VCARD, name = 'FN', children = [#xmlcdata{cdata = <<"ejabberd/mod_pubsub">>}]},
+ #xmlel{ns = ?NS_VCARD, name = 'URL', children = [#xmlcdata{cdata = list_to_binary(?EJABBERD_URI)}]},
+ #xmlel{ns = ?NS_VCARD, name = 'DESC', children =
+ [#xmlcdata{cdata = list_to_binary(
translate:translate(Lang,
"ejabberd Publish-Subscribe module") ++
- "\nCopyright (c) 2004-2009 Process-One"}]}].
+ "\nCopyright (c) 2004-2009 Process-One")}]}].
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 exmpp_xml:remove_cdata_from_list(SubEl#xmlel.children) of
+ [#xmlel{name = Name, attrs = Attrs, children = Els} | Rest] ->
+ Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', false)),
case {IQType, Name} of
- {set, "create"} ->
+ {set, 'create'} ->
Config = case Rest of
- [{xmlelement, "configure", _, C}] -> C;
+ [#xmlel{name = 'configure', children = C}] -> C;
_ -> []
end,
%% Get the type of the node
- Type = case xml:get_attr_s("type", Attrs) of
+ Type = case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'type', "") of
[] -> hd(Plugins);
T -> T
end,
@@ -1006,119 +1033,118 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
case lists:member(Type, Plugins) of
false ->
{error, extended_error(
- ?ERR_FEATURE_NOT_IMPLEMENTED,
+ '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),
+ {set, 'publish'} ->
+ case exmpp_xml:remove_cdata_from_list(Els) of
+ [#xmlel{name = 'item', attrs = ItemAttrs, children = Payload}] ->
+ ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', ""),
publish_item(Host, ServerHost, Node, From, ItemId, Payload);
[] ->
%% Publisher attempts to publish to persistent node with no item
- {error, extended_error(?ERR_BAD_REQUEST,
+ {error, extended_error('bad-request',
"item-required")};
_ ->
%% Entity attempts to publish item with multiple payload elements or namespace does not match
- {error, extended_error(?ERR_BAD_REQUEST,
+ {error, extended_error('bad-request',
"invalid-payload")}
end;
- {set, "retract"} ->
- ForceNotify = case xml:get_attr_s("notify", Attrs) of
+ {set, 'retract'} ->
+ ForceNotify = case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'notify', "") of
"1" -> true;
"true" -> true;
_ -> false
end,
- case xml:remove_cdata(Els) of
- [{xmlelement, "item", ItemAttrs, _}] ->
- ItemId = xml:get_attr_s("id", ItemAttrs),
+ case exmpp_xml:remove_cdata_from_list(Els) of
+ [#xmlel{name = 'item', attrs = ItemAttrs}] ->
+ ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', ""),
delete_item(Host, Node, From, ItemId, ForceNotify);
_ ->
%% Request does not specify an item
- {error, extended_error(?ERR_BAD_REQUEST,
+ {error, extended_error('bad-request',
"item-required")}
end;
- {set, "subscribe"} ->
+ {set, 'subscribe'} ->
Config = case Rest of
- [{xmlelement, "options", _, C}] -> C;
+ [#xmlel{name = 'configure', children = C}] -> C;
_ -> []
end,
- JID = xml:get_attr_s("jid", Attrs),
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
subscribe_node(Host, Node, From, JID, Config);
- {set, "unsubscribe"} ->
- JID = xml:get_attr_s("jid", Attrs),
- SubId = xml:get_attr_s("subid", Attrs),
+ {set, 'unsubscribe'} ->
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
+ SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
unsubscribe_node(Host, Node, From, JID, SubId);
- {get, "items"} ->
- MaxItems = xml:get_attr_s("max_items", Attrs),
- SubId = xml:get_attr_s("subid", Attrs),
+ {get, 'items'} ->
+ MaxItems = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'max_items', ""),
+ SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
ItemIDs = lists:foldl(fun
- ({xmlelement, "item", ItemAttrs, _}, Acc) ->
- case xml:get_attr_s("id", ItemAttrs) of
+ (#xmlel{name = 'item', attrs = ItemAttrs}, Acc) ->
+ case exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', "") of
"" -> Acc;
ItemID -> [ItemID|Acc]
end;
(_, Acc) ->
Acc
- end, [], xml:remove_cdata(Els)),
+ end, [], exmpp_xml:remove_cdata_from_list(Els)),
RSM = jlib:rsm_decode(SubEl),
- get_items(Host, Node, From, SubId, MaxItems, ItemIDs, RSM);
- {get, "subscriptions"} ->
+ get_items(Host, Node, From, SubId, MaxItems, ItemIDs, RSM);
+ {get, 'subscriptions'} ->
get_subscriptions(Host, Node, From, Plugins);
- {get, "affiliations"} ->
+ {get, 'affiliations'} ->
get_affiliations(Host, From, Plugins);
{get, "options"} ->
- SubID = xml:get_attr_s("subid", Attrs),
- JID = xml:get_attr_s("jid", Attrs),
+ SubID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
get_options(Host, Node, JID, SubID, Lang);
{set, "options"} ->
- SubID = xml:get_attr_s("subid", Attrs),
- JID = xml:get_attr_s("jid", Attrs),
+ SubID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
+ JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
set_options(Host, Node, JID, SubID, Els);
_ ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}
+ {error, 'feature-not-implemented'}
end;
Other ->
?INFO_MSG("Too many actions: ~p", [Other]),
- {error, ?ERR_BAD_REQUEST}
+ {error, '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)),
+ Action = lists:filter(fun(#xmlel{name = 'set'}) -> false;
+ (_) -> true
+ end, exmpp_xml:get_child_elements(SubEl)),
case Action of
- [{xmlelement, Name, Attrs, Els}] ->
- Node = string_to_node(xml:get_attr_s("node", Attrs)),
+ [#xmlel{name = Name, attrs = Attrs, children = Els}] ->
+ Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', "")),
case {IQType, Name} of
- {get, "configure"} ->
+ {get, 'configure'} ->
get_configure(Host, ServerHost, Node, From, Lang);
- {set, "configure"} ->
+ {set, 'configure'} ->
set_configure(Host, Node, From, Els, Lang);
- {get, "default"} ->
+ {get, 'default'} ->
get_default(Host, Node, From, Lang);
- {set, "delete"} ->
+ {set, 'delete'} ->
delete_node(Host, Node, From);
- {set, "purge"} ->
+ {set, 'purge'} ->
purge_node(Host, Node, From);
- {get, "subscriptions"} ->
+ {get, 'subscriptions'} ->
get_subscriptions(Host, Node, From);
- {set, "subscriptions"} ->
- set_subscriptions(Host, Node, From, xml:remove_cdata(Els));
- {get, "affiliations"} ->
+ {set, 'subscriptions'} ->
+ set_subscriptions(Host, Node, From, exmpp_xml:remove_cdata_from_list(Els));
+ {get, 'affiliations'} ->
get_affiliations(Host, Node, From);
- {set, "affiliations"} ->
- set_affiliations(Host, Node, From, xml:remove_cdata(Els));
+ {set, 'affiliations'} ->
+ set_affiliations(Host, Node, From, exmpp_xml:remove_cdata_from_list(Els));
_ ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}
+ {error, 'feature-not-implemented'}
end;
_ ->
?INFO_MSG("Too many actions: ~p", [Action]),
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
iq_command(Host, ServerHost, From, IQ, Access, Plugins) ->
@@ -1148,10 +1174,10 @@ adhoc_request(Host, _ServerHost, Owner,
xdata = XData},
_Access, _Plugins) ->
ParseOptions = case XData of
- {xmlelement, "x", _Attrs, _SubEls} = XEl ->
+ #xmlel{name = 'x'} = XEl ->
case jlib:parse_xdata_submit(XEl) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'bad-request')};
XData2 ->
case set_xoption(Host, XData2, []) of
NewOpts when is_list(NewOpts) ->
@@ -1162,7 +1188,7 @@ adhoc_request(Host, _ServerHost, Owner,
end;
_ ->
?INFO_MSG("Bad XForm: ~p", [XData]),
- {error, ?ERR_BAD_REQUEST}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'bad-request')}
end,
case ParseOptions of
{result, XForm} ->
@@ -1170,14 +1196,14 @@ adhoc_request(Host, _ServerHost, Owner,
{value, {_, Node}} ->
send_pending_auth_events(Host, Node, Owner);
false ->
- {error, extended_error(?ERR_BAD_REQUEST, "bad-payload")}
+ {error, extended_error('bad-request', "bad-payload")}
end;
Error ->
Error
end;
adhoc_request(_Host, _ServerHost, _Owner, Other, _Access, _Plugins) ->
?DEBUG("Couldn't process ad hoc command:~n~p", [Other]),
- {error, ?ERR_ITEM_NOT_FOUND}.
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item-not-found')}.
%% @spec (Host, Owner, Lang, Plugins) -> iqRes()
%% @doc Sends the process pending subscriptions XForm for Host to
@@ -1189,17 +1215,21 @@ send_pending_node_form(Host, Owner, _Lang, Plugins) ->
end,
case lists:filter(Filter, Plugins) of
[] ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED};
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'feature-not-implemented')};
Ps ->
XOpts = lists:map(fun (Node) ->
- {xmlelement, "option", [],
- [{xmlelement, "value", [],
- [{xmlcdata, node_to_string(Node)}]}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name='option',
+ children = [
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'value',
+ children = [
+ exmpp_xml:cdata(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)}]},
+ XForm = #xmlel{ns = ?NS_DATA_FORMS, name ='x', attrs = [?XMLATTR('type', <<"form">>)],
+ children = [
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field',
+ attrs = [?XMLATTR('type', <<"list-single">>),
+ ?XMLATTR('var', <<"pubsub#node">>)],
+ children = lists:usort(XOpts)}]},
#adhoc_response{status = executing,
defaultaction = "execute",
elements = [XForm]}
@@ -1213,8 +1243,8 @@ get_pending_nodes(Host, Owner, Plugins) ->
_ -> []
end
end,
- case transaction(Host,
- fun () -> {result, lists:flatmap(Tr, Plugins)} end,
+ case transaction(Host,
+ fun () -> {result, lists:flatmap(Tr, Plugins)} end,
sync_dirty) of
{result, Res} -> Res;
Err -> Err
@@ -1225,24 +1255,29 @@ get_pending_nodes(Host, Owner, Plugins) ->
%% 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)]),
+ [exmpp_jid:jid_to_string(Owner), Host, node_to_string(Node)]),
Action =
- fun (#pubsub_node{id = NodeID, type = Type} = N) ->
+ 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} ->
{result, Subscriptions} = node_call(Type, get_node_subscriptions, [NodeID]),
- 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),
+ lists:foreach(fun({J, pending, _SubID}) ->
+ {U, S, R} = J,
+ send_authorization_request(Node, exmpp_jid:make(U,S,R));
+ ({J, pending}) ->
+ {U, S, R} = J,
+ send_authorization_request(Node, exmpp_jid:make(U,S,R));
+ (_) ->
+ ok
+ end, Subscriptions),
{result, ok};
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'forbidden')}
end;
false ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'feature-not-implemented')}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -1256,60 +1291,55 @@ send_pending_auth_events(Host, Node, Owner) ->
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"}]}]}]}]},
+ {U, S, R} = Subscriber,
+ Stanza = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "PubSub subscriber request"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Choose whether to approve this entity's subscription."))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(?NS_PUBSUB_SUBSCRIBE_AUTH_s)}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"pubsub#node">>), ?XMLATTR('type', <<"text-single">>),
+ ?XMLATTR('label', translate:translate(Lang, "Node ID"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = node_to_string(Node)}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"pubsub#subscriber_jid">>),
+ ?XMLATTR('type', <<"jid-single">>),
+ ?XMLATTR('label', translate:translate(Lang, "Subscriber Address"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = exmpp_jid:to_binary(U, S, R)}]}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', <<"pubsub#allow">>),
+ ?XMLATTR('type', <<"boolean">>),
+ ?XMLATTR('label', translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?"))], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"false">>}]}]}]}]},
lists:foreach(fun(Owner) ->
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(Owner), Stanza}
+ {U, S, R} = Owner,
+ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(U, S, R), 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;
+ Els = Packet#xmlel.children,
+ XData1 = lists:map(fun(#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = XAttrs} = XEl) ->
+ case exmpp_xml:get_attribute_from_list_as_list(XAttrs, 'type', "") of
+ "cancel" ->
+ none;
_ ->
- none
+ jlib:parse_xdata_submit(XEl)
end;
(_) ->
none
- end, xml:remove_cdata(Els)),
+ end, exmpp_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]}} ->
+ {value, {_, [?NS_PUBSUB_SUBSCRIBE_AUTH_s]}} ->
XFields;
_ ->
invalid
@@ -1317,23 +1347,24 @@ find_authorization_response(Packet) ->
end.
%% @spec (Host, JID, Node, Subscription) -> void
-%% Host = mod_pubsub:host()
-%% JID = jlib:jid()
-%% SNode = string()
-%% Subscription = atom() | {atom(), mod_pubsub:subid()}
+%% Host = mod_pubsub:host()
+%% JID = jlib:jid()
+%% SNode = string()
+%% Subscription = atom() | {atom(), mod_pubsub:subid()}
+%% Plugins = [Plugin::string()]
%% @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)}]
+ {S, SID} -> [?XMLATTR('subscription', subscription_to_string(S)),
+ ?XMLATTR('subid', SID)];
+ S -> [?XMLATTR('subscription', subscription_to_string(S))]
end,
Stanza = event_stanza(
- [{xmlelement, "subscription",
- [{"jid", jlib:jid_to_string(JID)}|nodeAttr(SNode)] ++ SubAttrs,
- []}]),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'subscription', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(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),
@@ -1341,41 +1372,41 @@ handle_authorization_response(Host, From, To, Packet, XFields) ->
{{value, {_, [SNode]}}, {value, {_, [SSubscriber]}},
{value, {_, [SAllow]}}} ->
Node = string_to_node(SNode),
- Subscriber = jlib:string_to_jid(SSubscriber),
+ Subscriber = exmpp_jid:parse(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)),
+ IsApprover = lists:member(jlib:short_prepd_bare_jid(From), node_owners_call(Type, NodeId)),
{result, Subscriptions} = node_call(Type, get_subscriptions, [NodeId, Subscriber]),
if
not IsApprover ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
true ->
update_auth(Host, SNode, Type, NodeId,
- Subscriber, Allow,
- Subscriptions)
+ 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}} ->
+ exmpp_stanza:reply_with_error(Packet, Error));
+ {result, _} ->
%% XXX: notify about subscription state change, section 12.11
ok;
_ ->
ejabberd_router:route(
To, From,
- jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR))
+ exmpp_stanza:reply_with_error(Packet, 'internal-server-error'))
end;
_ ->
ejabberd_router:route(
To, From,
- jlib:make_error_reply(Packet, ?ERR_NOT_ACCEPTABLE))
+ exmpp_stanza:reply_with_error(Packet, 'not-acceptable'))
end.
update_auth(Host, Node, Type, NodeId, Subscriber,
@@ -1395,14 +1426,14 @@ update_auth(Host, Node, Type, NodeId, Subscriber,
NewSubscription),
{result, ok};
_ ->
- {error, ?ERR_UNEXPECTED_REQUEST}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'unexpected-request')}
end.
-define(XFIELD(Type, Label, Var, Val),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}],
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Val)}]}]}).
-define(BOOLXFIELD(Label, Var, Val),
?XFIELD("boolean", Label, Var,
@@ -1415,38 +1446,43 @@ update_auth(Host, Node, Type, NodeId, Subscriber,
?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]}).
+ #xmlel{ns = ?NS_DATA_FORMS,
+ name = 'field',
+ attrs = [?XMLATTR('type', <<"text-multi">>),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)
+ ],
+ children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value',
+ children = [?XMLCDATA(V)]} || V <- Vals]}).
-define(XFIELDOPT(Type, Label, Var, Val, Opts),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)], children =
lists:map(fun(Opt) ->
- {xmlelement, "option", [],
- [{xmlelement, "value", [],
- [{xmlcdata, Opt}]}]}
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = list_to_binary(Opt)}]}]}
end, Opts) ++
- [{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(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}],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"list-multi">>),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('var', Var)], children =
lists:map(fun(Opt) ->
- {xmlelement, "option", [],
- [{xmlelement, "value", [],
- [{xmlcdata, Opt}]}]}
- end, Opts) ++
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = list_to_binary(Opt)}]}]}
+ end, Opts) ++
lists:map(fun(Val) ->
- {xmlelement, "value", [],
- [{xmlcdata, Val}]}
- end, Vals)}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = list_to_binary(Val)}]}
+ end, Vals)
+ }).
%% @spec (Host::host(), ServerHost::host(), Node::pubsubNode(), Owner::jid(), NodeType::nodeType()) ->
%% {error, Reason::stanzaError()} |
@@ -1478,25 +1514,25 @@ create_node(Host, ServerHost, <<>>, Owner, Type, Access, Configuration) ->
NewNode, Owner, Type, Access, Configuration) of
{result, []} ->
{result,
- [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "create", nodeAttr(NewNode), []}]}]};
- Error ->
- Error
+ [#xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'create', attrs = nodeAttr(NewNode)}]}]};
+ Error ->
+ Error
end;
false ->
%% Service does not support instant nodes
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "nodeid-required")}
+ {error, extended_error('not-acceptable', "nodeid-required")}
end;
create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
Type = select_type(ServerHost, Host, Node, GivenType),
%% TODO, check/set node_type = Type
- ParseOptions = case xml:remove_cdata(Configuration) of
+ ParseOptions = case exmpp_xml:remove_cdata_from_list(Configuration) of
[] ->
{result, node_options(Type)};
- [{xmlelement, "x", _Attrs, _SubEls} = XEl] ->
+ [#xmlel{name = 'x'} = XEl] ->
case jlib:parse_xdata_submit(XEl) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
XData ->
case set_xoption(Host, XData, node_options(Type)) of
NewOpts when is_list(NewOpts) ->
@@ -1507,7 +1543,7 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
end;
_ ->
?INFO_MSG("Node ~p; bad configuration: ~p", [Node, Configuration]),
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end,
case ParseOptions of
{result, NodeOptions} ->
@@ -1533,18 +1569,17 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
Error
end;
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
- Reply = [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "create", nodeAttr(Node),
- []}]}],
+ Reply = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'create', attrs = nodeAttr(Node)}]},
case transaction(Host, CreateNode, transaction) of
{result, {Result, broadcast}} ->
%%Lang = "en", %% TODO: fix
%%OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
%%broadcast_publish_item(Host, Node, uniqid(), Owner,
- %% [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
+ %% [{xmlelement, "x", [{"xmlns", ?NS_DATA_FORMS}, {"type", "result"}],
%% [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NMI),
%% ?XFIELD("jid-single", "Node Creator", "creator", jlib:jid_to_string(OwnerKey))]}]),
case Result of
@@ -1580,7 +1615,7 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
%%
delete_node(_Host, [], _Owner) ->
%% Node is the root
- {error, ?ERR_NOT_ALLOWED};
+ {error, 'not-allowed'};
delete_node(Host, Node, Owner) ->
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
case node_call(Type, get_affiliation, [NodeId, Owner]) of
@@ -1594,7 +1629,7 @@ delete_node(Host, Node, Owner) ->
end;
_ ->
%% Entity is not an owner
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
Reply = [],
@@ -1605,7 +1640,8 @@ delete_node(Host, Node, Owner) ->
NodeId = RNode#pubsub_node.id,
Type = RNode#pubsub_node.type,
Options = RNode#pubsub_node.options,
- broadcast_removed_node(RH, RN, NodeId, Type, Options, SubsByDepth)
+ broadcast_removed_node(RH, RN, NodeId, Type, Options, SubsByDepth),
+ unset_cached_item(RH, NodeId)
end, Removed),
case Result of
default -> {result, Reply};
@@ -1651,10 +1687,13 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
{result, GoodSubOpts} -> GoodSubOpts;
_ -> invalid
end,
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
- end,
+ Subscriber = try
+ jlib:short_prepd_jid(exmpp_jid:parse(JID))
+ catch
+ _:_ ->
+ {undefined, undefined, undefined}
+ end,
+ SubId = uniqid(),
Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId}) ->
Features = features(Type),
SubscribeFeature = lists:member("subscribe", Features),
@@ -1674,28 +1713,28 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
{"", "", ""} ->
{false, false};
_ ->
- case node_owners_call(Type, NodeId) of
- [{OU, OS, _}|_] ->
- get_roster_info(OU, OS,
- Subscriber, AllowedGroups);
- _ ->
- {false, false}
- end
+ case node_owners_call(Type, NodeId) of
+ [{OU, OS, _} | _] ->
+ get_roster_info(OU, OS,
+ Subscriber, AllowedGroups);
+ _ ->
+ {false, false}
+ end
end
end,
if
not SubscribeFeature ->
%% Node does not support subscriptions
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscribe")};
+ {error, extended_error('feature-not-implemented', unsupported, "subscribe")};
not SubscribeConfig ->
%% Node does not support subscriptions
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscribe")};
+ {error, extended_error('feature-not-implemented', unsupported, "subscribe")};
HasOptions andalso not OptionsFeature ->
%% Node does not support subscription options
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscription-options")};
+ {error, extended_error('feature-not-implemented', unsupported, "subscription-options")};
SubOpts == invalid ->
%% Passed invalit options submit form
- {error, extended_error(?ERR_BAD_REQUEST, "invalid-options")};
+ {error, extended_error('bad-request', "invalid-options")};
true ->
node_call(Type, subscribe_node,
[NodeId, From, Subscriber,
@@ -1714,9 +1753,9 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
[{"subscription", subscription_to_string(Other)}]
end,
Fields =
- [{"jid", jlib:jid_to_string(Subscriber)} | SubAttrs],
- [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "subscription", Fields, []}]}]
+ [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)) | SubAttrs],
+ #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs = Fields}]}
end,
case transaction(Host, Node, Action, sync_dirty) of
{result, {TNode, {Result, subscribed, SubId, send_last}}} ->
@@ -1761,10 +1800,11 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
%%The request specifies a subscription ID that is not valid or current.
%%
unsubscribe_node(Host, Node, From, JID, SubId) when is_list(JID) ->
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
- end,
+ Subscriber = try jlib:short_prepd_jid(exmpp_jid:parse(JID))
+ catch
+ _:_ ->
+ {undefined, undefined, undefined}
+ end,
unsubscribe_node(Host, Node, From, Subscriber, SubId);
unsubscribe_node(Host, Node, From, Subscriber, SubId) ->
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
@@ -1812,30 +1852,31 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
if
not PublishFeature ->
%% Node does not support item publication
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "publish")};
+ {error, extended_error('feature-not-implemented', unsupported, "publish")};
PayloadSize > PayloadMaxSize ->
%% Entity attempts to publish very large payload
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "payload-too-big")};
+ {error, extended_error('not-acceptable', "payload-too-big")};
(PayloadCount == 0) and (Payload == []) ->
%% Publisher attempts to publish to payload node with no payload
- {error, extended_error(?ERR_BAD_REQUEST, "payload-required")};
+ {error, extended_error('bad-request', "payload-required")};
(PayloadCount > 1) or (PayloadCount == 0) ->
%% Entity attempts to publish item with multiple payload elements
- {error, extended_error(?ERR_BAD_REQUEST, "invalid-payload")};
+ {error, extended_error('bad-request', "invalid-payload")};
(DeliverPayloads == 0) and (PersistItems == 0) and (PayloadSize > 0) ->
%% Publisher attempts to publish to transient notification node with item
- {error, extended_error(?ERR_BAD_REQUEST, "item-forbidden")};
+ {error, extended_error('bad-request', "item-forbidden")};
((DeliverPayloads == 1) or (PersistItems == 1)) and (PayloadSize == 0) ->
%% Publisher attempts to publish to persistent node with no item
- {error, extended_error(?ERR_BAD_REQUEST, "item-required")};
+ {error, extended_error('bad-request', "item-required")};
true ->
node_call(Type, publish_item, [NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload])
end
end,
- ejabberd_hooks:run(pubsub_publish_item, ServerHost, [ServerHost, Node, Publisher, service_jid(Host), ItemId, Payload]),
- Reply = [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "publish", nodeAttr(Node),
- [{xmlelement, "item", itemAttr(ItemId), []}]}]}],
+ ServerHostB = list_to_binary(ServerHost),
+ ejabberd_hooks:run(pubsub_publish_item, ServerHostB, [ServerHost, Node, Publisher, service_jid(Host), ItemId, Payload]),
+ Reply = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'publish', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'item', attrs = itemAttr(ItemId)}]}]},
case transaction(Host, Node, Action, sync_dirty) of
{result, {TNode, {Result, Broadcast, Removed}}} ->
NodeId = TNode#pubsub_node.id,
@@ -1846,7 +1887,7 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
broadcast -> Payload;
PluginPayload -> PluginPayload
end,
- broadcast_publish_item(Host, Node, NodeId, Type, Options, Removed, ItemId, jlib:jid_tolower(Publisher), BroadcastPayload),
+ broadcast_publish_item(Host, Node, NodeId, Type, Options, Removed, ItemId, jlib:short_prepd_jid(Publisher), BroadcastPayload),
set_cached_item(Host, NodeId, ItemId, Payload),
case Result of
default -> {result, Reply};
@@ -1870,7 +1911,7 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
{result, Reply};
{result, {_, Result}} ->
{result, Result};
- {error, ?ERR_ITEM_NOT_FOUND} ->
+ {error, 'item-not-found'} ->
%% handles auto-create feature
%% for automatic node creation. we'll take the default node type:
%% first listed into the plugins configuration option, or pep
@@ -1881,10 +1922,10 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
{result, _} ->
publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload);
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end;
false ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end;
Error ->
Error
@@ -1908,7 +1949,7 @@ delete_item(Host, Node, Publisher, ItemId) ->
delete_item(Host, Node, Publisher, ItemId, false).
delete_item(_, "", _, _, _) ->
%% Request does not specify a node
- {error, extended_error(?ERR_BAD_REQUEST, "node-required")};
+ {error, extended_error('bad-request', "node-required")};
delete_item(Host, Node, Publisher, ItemId, ForceNotify) ->
Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId}) ->
Features = features(Type),
@@ -1918,13 +1959,13 @@ delete_item(Host, Node, Publisher, ItemId, ForceNotify) ->
if
%%-> iq_pubsub just does that matchs
%% %% Request does not specify an item
- %% {error, extended_error(?ERR_BAD_REQUEST, "item-required")};
+ %% {error, extended_error('bad-request', "item-required")};
not PersistentFeature ->
%% Node does not support persistent items
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
not DeleteFeature ->
%% Service does not support item deletion
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "delete-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "delete-items")};
true ->
node_call(Type, delete_item, [NodeId, Publisher, PublishModel, ItemId])
end
@@ -1975,13 +2016,13 @@ purge_node(Host, Node, Owner) ->
if
not PurgeFeature ->
%% Service does not support node purging
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "purge-nodes")};
+ {error, extended_error('feature-not-implemented', unsupported, "purge-nodes")};
not PersistentFeature ->
%% Node does not support persistent items
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
not PersistentConfig ->
%% Node is not configured for persistent items
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
true ->
node_call(Type, purge_node, [NodeId, Owner])
end
@@ -2017,7 +2058,7 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs, RSM) ->
SMaxItems == "" -> get_max_items_node(Host);
true ->
case catch list_to_integer(SMaxItems) of
- {'EXIT', _} -> {error, ?ERR_BAD_REQUEST};
+ {'EXIT', _} -> {error, 'bad-request'};
Val -> Val
end
end,
@@ -2035,17 +2076,17 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs, RSM) ->
case Host of
{OUser, OServer, _} ->
get_roster_info(OUser, OServer,
- jlib:jid_tolower(From), AllowedGroups);
+ jlib:short_prepd_jid(From), AllowedGroups);
_ ->
{true, true}
end,
if
not RetreiveFeature ->
%% Item Retrieval Not Supported
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "retrieve-items")};
not PersistentFeature ->
%% Persistent Items Not Supported
- {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")};
+ {error, extended_error('feature-not-implemented', unsupported, "persistent-items")};
true ->
node_call(Type, get_items,
[NodeId, From,
@@ -2054,7 +2095,7 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs, RSM) ->
end
end,
case transaction(Host, Node, Action, sync_dirty) of
- {result, {_, {Items, RSMOut}}} ->
+ {result, {_, Items, RSMOut}} ->
SendItems = case ItemIDs of
[] ->
Items;
@@ -2065,10 +2106,9 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIDs, RSM) ->
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)]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'items', attrs = nodeAttr(Node), children =
+ itemsEls(lists:sublist(SendItems, MaxItems))} | jlib:rsm_encode(RSMOut)]}};
Error ->
Error
end
@@ -2106,22 +2146,24 @@ send_items(Host, Node, NodeId, Type, LJID, last) ->
case node_action(Host, Type, get_last_items, [NodeId, LJID, 1]) of
{result, [LastItem]} ->
{ModifNow, ModifLjid} = LastItem#pubsub_item.modification,
- event_stanza_with_delay(
- [{xmlelement, "items", nodeAttr(Node),
- itemsEls([LastItem])}], ModifNow, ModifLjid);
+ event_stanza_with_delay([#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items',
+ attrs = nodeAttr(Node),
+ children = itemsEls([])}],
+ ModifNow, ModifLjid);
_ ->
- event_stanza(
- [{xmlelement, "items", nodeAttr(Node),
- itemsEls([])}])
+ event_stanza([#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items',
+ attrs = nodeAttr(Node),
+ children = itemsEls([])}])
end;
LastItem ->
{ModifNow, ModifLjid} = LastItem#pubsub_item.modification,
event_stanza_with_delay(
- [{xmlelement, "items", nodeAttr(Node),
- itemsEls([LastItem])}], ModifNow, ModifLjid)
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node),
+ children = itemsEls(LastItem)}], ModifNow, ModifLjid)
end,
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(LJID), Stanza};
-send_items(Host, Node, NodeId, Type, LJID, Number) ->
+ {U, S, R} = LJID,
+ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(U, S, R), Stanza};
+send_items(Host, Node, NodeId, Type, {LU, LS, LR} = LJID, Number) ->
ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of
{result, []} ->
[];
@@ -2137,14 +2179,14 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
[LastItem] ->
{ModifNow, ModifLjid} = LastItem#pubsub_item.modification,
event_stanza_with_delay(
- [{xmlelement, "items", nodeAttr(Node),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
itemsEls(ToSend)}], ModifNow, ModifLjid);
_ ->
event_stanza(
- [{xmlelement, "items", nodeAttr(Node),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
itemsEls(ToSend)}])
end,
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(LJID), Stanza}.
+ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(LU, LS, LR), Stanza}.
%% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response}
%% Host = host()
@@ -2161,7 +2203,7 @@ get_affiliations(Host, JID, Plugins) when is_list(Plugins) ->
if
not RetrieveFeature ->
%% Service does not support retreive affiliatons
- {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-affiliations")}, Acc};
+ {{error, extended_error('feature-not-implemented', unsupported, "retrieve-affiliations")}, Acc};
true ->
{result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, JID]),
{Status, [Affiliations|Acc]}
@@ -2172,53 +2214,52 @@ get_affiliations(Host, JID, Plugins) when is_list(Plugins) ->
Entities = lists:flatmap(
fun({_, none}) -> [];
({#pubsub_node{nodeid = {_, Node}}, Affiliation}) ->
- [{xmlelement, "affiliation",
- [{"affiliation", affiliation_to_string(Affiliation)}|nodeAttr(Node)],
- []}]
+ [#xmlel{ns = ?NS_PUBSUB, name = 'affiliation', attrs =
+ [?XMLATTR('node', node_to_string(Node)),
+ ?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
end, lists:usort(lists:flatten(Affiliations))),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "affiliations", [],
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'affiliations', children =
+ 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,
+ 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('feature-not-implemented', unsupported, "modify-affiliations")};
+ Affiliation /= owner ->
+ %% Entity is not an owner
+ {error, '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};
+ {error, '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)}],
- []}]
+ ({{AU, AS, AR}, Affiliation}) ->
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliation', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
+ ?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
end, Affiliations),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "affiliations", nodeAttr(Node),
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliations', attrs = nodeAttr(Node), children =
+ Entities}]}};
Error ->
Error
end.
set_affiliations(Host, Node, From, EntitiesEls) ->
- Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)),
+ Owner = jlib:short_prepd_bare_jid(From),
Entities =
lists:foldl(
fun(El, Acc) ->
@@ -2227,35 +2268,39 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
error;
_ ->
case El of
- {xmlelement, "affiliation", Attrs, _} ->
- JID = jlib:string_to_jid(
- xml:get_attr_s("jid", Attrs)),
+ #xmlel{name = 'affiliation', attrs = Attrs} ->
+ JID = try
+ exmpp_jid:parse(
+ exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
+ catch
+ _:_ -> error
+ end,
Affiliation = string_to_affiliation(
- xml:get_attr_s("affiliation", Attrs)),
+ exmpp_xml:get_attribute_from_list_as_list(Attrs, 'affiliation', false)),
if
(JID == error) or
(Affiliation == false) ->
error;
true ->
- [{jlib:jid_tolower(JID), Affiliation} | Acc]
+ [{JID, Affiliation} | Acc]
end
end
end
end, [], EntitiesEls),
case Entities of
error ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
_ ->
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
case lists:member(Owner, node_owners_call(Type, NodeId)) of
true ->
lists:foreach(
fun({JID, Affiliation}) ->
- node_call(Type, set_affiliation, [NodeId, JID, Affiliation])
+ node_call(Type, set_affiliation, [NodeId, JID, Affiliation])
end, Entities),
- {result, []};
- _ ->
- {error, ?ERR_FORBIDDEN}
+ {result, []};
+ _ ->
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -2271,7 +2316,7 @@ get_options(Host, Node, JID, SubID, Lang) ->
get_options_helper(JID, Lang, Node, NodeID, SubID, Type);
false ->
{error, extended_error(
- ?ERR_FEATURE_NOT_IMPLEMENTED,
+ 'feature-not-implemented',
unsupported, "subscription-options")}
end
end,
@@ -2281,9 +2326,11 @@ get_options(Host, Node, JID, SubID, Lang) ->
end.
get_options_helper(JID, Lang, Node, NodeID, SubID, Type) ->
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
+ Subscriber = try exmpp_jid:parse(JID) of
+ J -> jlib:short_jid(J)
+ catch
+ _ ->
+ {"", "", ""} %%pablo TODO: "" or <<>> ?. short_jid uses exmpp_jid:node/1, etc. that returns binaries
end,
{result, Subs} = node_call(Type, get_subscriptions,
[NodeID, Subscriber]),
@@ -2294,11 +2341,11 @@ get_options_helper(JID, Lang, Node, NodeID, SubID, Type) ->
end, [], Subs),
case {SubID, SubIDs} of
{_, []} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")};
+ {error, extended_error('not-acceptable', "not-subscribed")};
{[], [SID]} ->
read_sub(Subscriber, Node, NodeID, SID, Lang);
{[], _} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")};
+ {error, extended_error('not-acceptable', "subid-required")};
{_, _} ->
read_sub(Subscriber, Node, NodeID, SubID, Lang)
end.
@@ -2306,13 +2353,14 @@ get_options_helper(JID, Lang, Node, NodeID, SubID, Type) ->
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")};
+ {error, extended_error('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, XdataEl} = pubsub_subscription_odbc:get_options_xform(Lang, Options),
+ OptionsEl = #xmlel{ns = ?NS_PUBSUB, name = 'options',
+ attrs = [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)),
+ ?XMLATTR('Subid', SubID) | nodeAttr(Node)],
+ children = [XdataEl]},
+ PubsubEl = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children = [OptionsEl]},
{result, PubsubEl}
end.
@@ -2324,7 +2372,7 @@ set_options(Host, Node, JID, SubID, Configuration) ->
SubID, Type);
false ->
{error, extended_error(
- ?ERR_FEATURE_NOT_IMPLEMENTED,
+ 'feature-not-implemented',
unsupported, "subscription-options")}
end
end,
@@ -2338,9 +2386,10 @@ set_options_helper(Configuration, JID, NodeID, SubID, Type) ->
{result, GoodSubOpts} -> GoodSubOpts;
_ -> invalid
end,
- Subscriber = case jlib:string_to_jid(JID) of
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
+ Subscriber = try exmpp_jid:parse(JID) of
+ J -> jlib:short_jid(J)
+ catch
+ _ -> {"", "", ""} %%pablo TODO: "" or <<>> ?. short_jid uses exmpp_jid:node/1, etc. that returns binaries
end,
{result, Subs} = node_call(Type, get_subscriptions,
[NodeID, Subscriber]),
@@ -2351,21 +2400,21 @@ set_options_helper(Configuration, JID, NodeID, SubID, Type) ->
end, [], Subs),
case {SubID, SubIDs} of
{_, []} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")};
+ {error, extended_error('not-acceptable', "not-subscribed")};
{[], [SID]} ->
write_sub(Subscriber, NodeID, SID, SubOpts);
{[], _} ->
- {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")};
+ {error, extended_error('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")};
+ {error, extended_error('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")};
+ {error, extended_error('not-acceptable', "invalid-subid")};
{result, _} ->
{result, []}
end.
@@ -2386,9 +2435,9 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
if
not RetrieveFeature ->
%% Service does not support retreive subscriptions
- {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-subscriptions")}, Acc};
+ {{error, extended_error('feature-not-implemented', unsupported, "retrieve-subscriptions")}, Acc};
true ->
- Subscriber = jlib:jid_remove_resource(JID),
+ Subscriber = exmpp_jid:bare(JID),
{result, Subscriptions} = node_action(Host, Type, get_entity_subscriptions, [Host, Subscriber]),
{Status, [Subscriptions|Acc]}
end
@@ -2401,13 +2450,12 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
({#pubsub_node{nodeid = {_, SubsNode}}, Subscription}) ->
case Node of
<<>> ->
- [{xmlelement, "subscription",
- [{"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('node', node_to_string(SubsNode)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
SubsNode ->
- [{xmlelement, "subscription",
- [{"subscription", subscription_to_string(Subscription)}],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('subscription', subscription_to_string(Subscription))]}];
_ ->
[]
end;
@@ -2416,84 +2464,81 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
({#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)],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name='subscription',
+ attrs = [?XMLATTR('jid', exmpp_jid:jid_to_binary(SubJID)),
+ ?XMLATTR('subid', SubID),
+ ?XMLATTR('subscription', subscription_to_string(Subscription)) | nodeAttr(SubsNode)]}];
SubsNode ->
- [{xmlelement, "subscription",
- [{"jid", jlib:jid_to_string(SubJID)},
- {"subid", SubID},
- {"subscription", subscription_to_string(Subscription)}],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription',
+ attrs = [?XMLATTR('jid', exmpp_jid:jid_to_binary(SubJID)),
+ ?XMLATTR('subid', SubID),
+ ?XMLATTR('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)],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('node', node_to_string(SubsNode)),
+ ?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
SubsNode ->
- [{xmlelement, "subscription",
- [{"jid", jlib:jid_to_string(SubJID)},
- {"subscription", subscription_to_string(Subscription)}],
- []}];
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
_ ->
[]
end
end, lists:usort(lists:flatten(Subscriptions))),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "subscriptions", [],
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'subscriptions', children =
+ 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,
+ 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('feature-not-implemented', unsupported, "manage-subscriptions")};
+ Affiliation /= owner ->
+ %% Entity is not an owner
+ {error, 'forbidden'};
+ true ->
+ node_call(Type, get_node_subscriptions, [NodeId])
+ end
+ end,
case transaction(Host, Node, Action, sync_dirty) of
+ {result, {_, []}} ->
+ {error, 'item-not-found'};
{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}],
- []}]
+ ({{AU, AS, AR}, Subscription}) ->
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription))]}];
+ ({{AU, AS, AR}, Subscription, SubId}) ->
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
+ [?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
+ ?XMLATTR('subscription', subscription_to_string(Subscription)),
+ ?XMLATTR('subid', SubId)]}]
end, Subscriptions),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "subscriptions", nodeAttr(Node),
- Entities}]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscriptions', attrs = nodeAttr(Node), children =
+ Entities}]}};
Error ->
Error
end.
set_subscriptions(Host, Node, From, EntitiesEls) ->
- Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)),
+ Owner = jlib:short_prepd_bare_jid(From),
Entities =
lists:foldl(
fun(El, Acc) ->
@@ -2502,34 +2547,43 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
error;
_ ->
case El of
- {xmlelement, "subscription", Attrs, _} ->
- JID = jlib:string_to_jid(
- xml:get_attr_s("jid", Attrs)),
+ #xmlel{name = 'subscription', attrs = Attrs} ->
+ JID = try
+ exmpp_jid:parse(
+ exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
+ catch
+ _:_ ->
+ error
+ end,
Subscription = string_to_subscription(
- xml:get_attr_s("subscription", Attrs)),
- SubId = xml:get_attr_s("subid", Attrs),
+ exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subscription', false)),
+ SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, "subid", false),
if
(JID == error) or
(Subscription == false) ->
error;
true ->
- [{jlib:jid_tolower(JID), Subscription, SubId} | Acc]
+ [{JID, Subscription, SubId} | Acc]
end
end
end
end, [], EntitiesEls),
case Entities of
error ->
- {error, ?ERR_BAD_REQUEST};
+ {error, '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}
+ Stanza = #xmlel{ns = ?NS_JABBER_CLIENT,
+ name = 'message',
+ children =
+ [#xmlel{ns = ?NS_PUBSUB,
+ name = 'pubsub',
+ children =
+ [#xmlel{ns = ?NS_PUBSUB,
+ name = 'subscription',
+ attrs = [?XMLATTR('jid', exmpp_jid:to_binary(JID)),
+ ?XMLATTR('subsription', subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
+ ejabberd_router ! {route, service_jid(Host), JID, Stanza}
end,
Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
case lists:member(Owner, node_owners_call(Type, NodeId)) of
@@ -2543,10 +2597,10 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
end, [], Entities),
case Result of
[] -> {result, []};
- _ -> {error, ?ERR_NOT_ACCEPTABLE}
+ _ -> {error, 'not-acceptable'}
end;
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -2555,14 +2609,16 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
end
end.
+
%% @spec (OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, SubscriberResource}, AllowedGroups)
%% -> {PresenceSubscription, RosterGroup}
get_roster_info(OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, AllowedGroups) ->
+ OwnerServerB = list_to_binary(OwnerServer),
{Subscription, Groups} =
ejabberd_hooks:run_fold(
- roster_get_jid_info, OwnerServer,
+ roster_get_jid_info, OwnerServerB,
{none, []},
- [OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, ""}]),
+ [OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, undefined}]),
PresenceSubscription = (Subscription == both) orelse (Subscription == from)
orelse ({OwnerUser, OwnerServer} == {SubscriberUser, SubscriberServer}),
RosterGroup = lists:any(fun(Group) ->
@@ -2622,8 +2678,8 @@ string_to_node(SNode) -> list_to_binary(SNode).
%% @doc Generate pubsub service JID.
service_jid(Host) ->
case Host of
- {U,S,_} -> {jid, U, S, "", U, S, ""};
- _ -> {jid, "", Host, "", "", Host, ""}
+ {U,S,_} -> exmpp_jid:make(U, S);
+ _ -> exmpp_jid:make(Host)
end.
%% @spec (LJID, NotifyType, Depth, NodeOptions, SubOptions) -> boolean()
@@ -2670,51 +2726,52 @@ presence_can_deliver({User, Server, _}, true) ->
%% @doc Count 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([#xmlel{}|Tail], Count) -> payload_xmlelements(Tail, Count+1);
payload_xmlelements([_|Tail], Count) -> payload_xmlelements(Tail, Count).
%% @spec (Els) -> stanza()
-%% Els = [xmlelement()]
+%% Els = [xmlelement()]
%% @doc Build pubsub event stanza
event_stanza(Els) ->
event_stanza_withmoreels(Els, []).
+
event_stanza_with_delay(Els, ModifNow, ModifLjid) ->
DateTime = calendar:now_to_datetime(ModifNow),
MoreEls = [jlib:timestamp_to_xml(DateTime, utc, ModifLjid, "")],
event_stanza_withmoreels(Els, MoreEls).
event_stanza_withmoreels(Els, MoreEls) ->
- {xmlelement, "message", [],
- [{xmlelement, "event", [{"xmlns", ?NS_PUBSUB_EVENT}], Els} | MoreEls]}.
+ #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'event', children = Els} | MoreEls]}.
%%%%%% broadcast functions
-broadcast_publish_item(Host, Node, NodeId, Type, NodeOptions, Removed, ItemId, _From, Payload) ->
- %broadcast(Host, Node, NodeId, NodeOptions, none, true, "items", ItemEls)
+broadcast_publish_item(Host, Node, NodeId, Type, Options, Removed, ItemId, _From, Payload) ->
+ %broadcast(Host, Node, NodeId, Options, none, true, 'items', ItemEls)
case get_collection_subscriptions(Host, Node) of
- SubsByDepth when is_list(SubsByDepth) ->
- Content = case get_option(NodeOptions, deliver_payloads) of
+ [] ->
+ {result, false};
+
+ SubsByDepth when is_list(SubsByDepth) ->
+ Content = case get_option(Options, deliver_payloads) of
true -> Payload;
false -> []
end,
Stanza = event_stanza(
- [{xmlelement, "items", nodeAttr(Node),
- [{xmlelement, "item", itemAttr(ItemId), Content}]}]),
- broadcast_stanza(Host, Node, NodeId, Type,
- NodeOptions, SubsByDepth, items, Stanza),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = itemAttr(ItemId), children = Content}]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, Options, SubsByDepth, items, Stanza),
case Removed of
[] ->
ok;
_ ->
- case get_option(NodeOptions, notify_retract) of
+ case get_option(Options, 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);
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'retract', attrs = itemAttr(RId)} || RId <- Removed]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, Options, SubsByDepth, items, RetractStanza);
_ ->
ok
end
@@ -2729,16 +2786,18 @@ broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds) ->
broadcast_retract_items(_Host, _Node, _NodeId, _Type, _NodeOptions, [], _ForceNotify) ->
{result, false};
broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, ForceNotify) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, ForceNotify, "retract", RetractEls)
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, ForceNotify, 'retract', RetractEls)
case (get_option(NodeOptions, notify_retract) or ForceNotify) of
true ->
case get_collection_subscriptions(Host, Node) of
- SubsByDepth when is_list(SubsByDepth) ->
+ [] ->
+ {result, false};
+
+ 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),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'retract', attrs = itemAttr(ItemId)} || ItemId <- ItemIds]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, items, Stanza),
{result, true};
_ ->
{result, false}
@@ -2748,16 +2807,16 @@ broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, ForceNot
end.
broadcast_purge_node(Host, Node, NodeId, Type, NodeOptions) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, false, "purge", [])
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_retract, false, 'purge', [])
case get_option(NodeOptions, notify_retract) of
true ->
case get_collection_subscriptions(Host, Node) of
+ [] ->
+ {result, false};
SubsByDepth when is_list(SubsByDepth) ->
Stanza = event_stanza(
- [{xmlelement, "purge", nodeAttr(Node),
- []}]),
- broadcast_stanza(Host, Node, NodeId, Type,
- NodeOptions, SubsByDepth, nodes, Stanza),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'purge', attrs = nodeAttr(Node)}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza),
{result, true};
_ ->
{result, false}
@@ -2767,7 +2826,7 @@ broadcast_purge_node(Host, Node, NodeId, Type, NodeOptions) ->
end.
broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_delete, false, "delete", [])
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_delete, false, 'delete', [])
case get_option(NodeOptions, notify_delete) of
true ->
case SubsByDepth of
@@ -2775,10 +2834,8 @@ broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) ->
{result, false};
_ ->
Stanza = event_stanza(
- [{xmlelement, "delete", nodeAttr(Node),
- []}]),
- broadcast_stanza(Host, Node, NodeId, Type,
- NodeOptions, SubsByDepth, nodes, Stanza),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'delete', attrs = nodeAttr(Node)}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza),
{result, true}
end;
_ ->
@@ -2786,22 +2843,25 @@ broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) ->
end.
broadcast_config_notification(Host, Node, NodeId, Type, NodeOptions, Lang) ->
- %broadcast(Host, Node, NodeId, NodeOptions, notify_config, false, "items", ConfigEls)
+ %broadcast(Host, Node, NodeId, NodeOptions, notify_config, false, 'items', ConfigEls)
case get_option(NodeOptions, notify_config) of
true ->
case get_collection_subscriptions(Host, Node) of
+ [] ->
+ {result, false};
SubsByDepth when is_list(SubsByDepth) ->
Content = case get_option(NodeOptions, deliver_payloads) of
true ->
- [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
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),
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = [?XMLATTR('id', <<"configuration">>)], children =
+ Content}]}]),
+ broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza),
{result, true};
_ ->
{result, false}
@@ -2840,6 +2900,7 @@ get_options_for_subs(NodeID, Subs) ->
end, [], Subs).
% TODO: merge broadcast code that way
+% TODO: pablo: why is this commented?
%broadcast(Host, Node, NodeId, Type, NodeOptions, Feature, Force, ElName, SubEls) ->
% case (get_option(NodeOptions, Feature) or Force) of
% true ->
@@ -2877,14 +2938,15 @@ broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyTyp
end,
SHIMStanza = add_headers(Stanza, collection_shim(Node, Nodes)),
lists:foreach(fun(To) ->
- ejabberd_router ! {route, From, jlib:make_jid(To), SHIMStanza}
+ {TU, TS, TR} = To,
+ ejabberd_router ! {route, From, exmpp_jid:make(TU, TS, TR), SHIMStanza}
end, LJIDs)
end, NodesByJID),
%% Handles implicit presence subscriptions
case Host of
{LUser, LServer, LResource} ->
SenderResource = case LResource of
- [] ->
+ [] ->
case user_resources(LUser, LServer) of
[Resource|_] -> Resource;
_ -> ""
@@ -2897,22 +2959,21 @@ broadcast_stanza(Host, Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyTyp
%% 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
- Sender = jlib:make_jid(LUser, LServer, ""),
+ Sender = exmpp_jid:make(LUser, LServer),
%%ReplyTo = jlib:make_jid(LUser, LServer, SenderResource), % This has to be used
case catch ejabberd_c2s:get_subscribed(C2SPid) of
Contacts when is_list(Contacts) ->
lists:foreach(fun({U, S, _}) ->
spawn(fun() ->
- LJIDs = lists:foldl(fun(R, Acc) ->
- LJID = {U, S, R},
- case is_caps_notify(LServer, Node, LJID) of
- true -> [LJID | Acc];
+ Rs = lists:foldl(fun(R, Acc) ->
+ case is_caps_notify(LServer, Node, {U, S, R}) of
+ true -> [R | Acc];
false -> Acc
end
end, [], user_resources(U, S)),
- lists:foreach(fun(To) ->
- ejabberd_router ! {route, Sender, jlib:make_jid(To), Stanza}
- end, LJIDs)
+ lists:foreach(fun(R) ->
+ ejabberd_router ! {route, Sender, exmpp_jid:make(U, S, R), Stanza}
+ end, Rs)
end)
end, Contacts);
_ ->
@@ -2977,21 +3038,22 @@ is_caps_notify(Host, Node, LJID) ->
%%The service does not support retrieval of default node configuration.
%%
get_configure(Host, ServerHost, Node, From, Lang) ->
+ ServerHostB = list_to_binary(ServerHost),
Action =
fun(#pubsub_node{options = Options, type = Type, id = NodeId}) ->
case node_call(Type, get_affiliation, [NodeId, From]) of
{result, owner} ->
- Groups = ejabberd_hooks:run_fold(roster_groups, ServerHost, [], [ServerHost]),
+ Groups = ejabberd_hooks:run_fold(roster_groups, ServerHostB, [], [ServerHostB]),
{result,
- [{xmlelement, "pubsub",
- [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "configure", nodeAttr(Node),
- [{xmlelement, "x",
- [{"xmlns", ?NS_XDATA}, {"type", "form"}],
+ #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'configure', attrs =
+ nodeAttr(Node), children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"form">>)], children =
get_configure_xfields(Type, Options, Lang, Groups)
- }]}]}]};
+ }]}]}};
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, sync_dirty) of
@@ -3002,11 +3064,11 @@ get_configure(Host, ServerHost, Node, From, Lang) ->
get_default(Host, Node, _From, Lang) ->
Type = select_type(Host, Host, Node),
Options = node_options(Type),
- {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}],
- [{xmlelement, "default", [],
- [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}],
+ {result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'default', children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
get_configure_xfields(Type, Options, Lang, [])
- }]}]}]}.
+ }]}]}}.
%% Get node option
%% The result depend of the node type plugin system.
@@ -3099,8 +3161,8 @@ max_items(Host, Options) ->
-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])).
+ exmpp_jid:to_list(get_option(Options, Var)),
+ [exmpp_jid:to_list(O) || O <- Opts])).
-define(ALIST_CONFIG_FIELD(Label, Var, Opts),
?LISTXFIELD(Label, "pubsub#" ++ atom_to_list(Var),
@@ -3116,7 +3178,7 @@ max_items(Host, Options) ->
[node_to_string(N) || N <- get_option(Options, Var, [])])).
get_configure_xfields(_Type, Options, Lang, Groups) ->
- [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NODE_CONFIG),
+ [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NODE_CONFIG_s),
?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),
@@ -3150,19 +3212,19 @@ get_configure_xfields(_Type, Options, Lang, Groups) ->
%%The specified node does not exist.
%%
set_configure(Host, Node, From, Els, Lang) ->
- case xml:remove_cdata(Els) of
- [{xmlelement, "x", _Attrs1, _Els1} = XEl] ->
- case {xml:get_tag_attr_s("xmlns", XEl), xml:get_tag_attr_s("type", XEl)} of
- {?NS_XDATA, "cancel"} ->
+ case exmpp_xml:remove_cdata_from_list(Els) of
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'x'} = XEl] ->
+ case exmpp_xml:get_attribute_as_list(XEl, 'type', undefined) of
+ "cancel" ->
{result, []};
- {?NS_XDATA, "submit"} ->
+ "submit" ->
Action =
fun(#pubsub_node{options = Options, type = Type, id = NodeId} = N) ->
case node_call(Type, get_affiliation, [NodeId, From]) of
{result, owner} ->
case jlib:parse_xdata_submit(XEl) of
invalid ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
XData ->
OldOpts = case Options of
[] -> node_options(Type);
@@ -3179,7 +3241,7 @@ set_configure(Host, Node, From, Els, Lang) ->
end
end;
_ ->
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end
end,
case transaction(Host, Node, Action, transaction) of
@@ -3193,10 +3255,10 @@ set_configure(Host, Node, From, Els, Lang) ->
Other
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end;
_ ->
- {error, ?ERR_BAD_REQUEST}
+ {error, 'bad-request'}
end.
add_opt(Key, Value, Opts) ->
@@ -3212,7 +3274,7 @@ add_opt(Key, Value, Opts) ->
_ -> error
end,
case BoolVal of
- error -> {error, ?ERR_NOT_ACCEPTABLE};
+ error -> {error, 'not-acceptable'};
_ -> set_xoption(Host, Opts, add_opt(Opt, BoolVal, NewOpts))
end).
@@ -3226,13 +3288,13 @@ add_opt(Key, Value, Opts) ->
IVal =< Max ->
set_xoption(Host, Opts, add_opt(Opt, IVal, NewOpts));
_ ->
- {error, ?ERR_NOT_ACCEPTABLE}
+ {error, 'not-acceptable'}
end).
-define(SET_ALIST_XOPT(Opt, Val, Vals),
case lists:member(Val, [atom_to_list(V) || V <- Vals]) of
true -> set_xoption(Host, Opts, add_opt(Opt, list_to_atom(Val), NewOpts));
- false -> {error, ?ERR_NOT_ACCEPTABLE}
+ false -> {error, 'not-acceptable'}
end).
-define(SET_LIST_XOPT(Opt, Val),
@@ -3339,14 +3401,17 @@ get_cached_item(Host, NodeId) ->
end.
%%%% plugin handling
-
-plugins(Host) ->
+plugins(Host) when is_binary(Host) ->
+ plugins(binary_to_list(Host));
+plugins(Host) when is_list(Host) ->
case catch ets:lookup(gen_mod:get_module_proc(Host, config), plugins) of
[{plugins, []}] -> [?STDNODE];
[{plugins, PL}] -> PL;
_ -> [?STDNODE]
end.
-select_type(ServerHost, Host, Node, Type)->
+select_type(ServerHost, Host, Node, Type) when is_list(ServerHost) ->
+ select_type(list_to_binary(ServerHost), Host, Node, Type);
+select_type(ServerHost, Host, Node, Type) ->
SelectedType = case Host of
{_User, _Server, _Resource} ->
case catch ets:lookup(gen_mod:get_module_proc(ServerHost, config), pep_mapping) of
@@ -3442,10 +3507,10 @@ tree_action(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;
+ Result;
{aborted, Reason} ->
- ?ERROR_MSG("transaction return internal error: ~p~n",[{aborted, Reason}]),
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ ?ERROR_MSG("transaction return internal error: ~p~n",[{aborted, Reason}]),
+ {error, 'internal-server-error'}
end.
%% @doc node plugin call.
@@ -3487,11 +3552,12 @@ transaction(Host, Node, Action, 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,
+ transaction -> sql_transaction;
+ _ -> sql_bloc
+ end,
case catch ejabberd_odbc:SqlFun(odbc_conn(Host), Fun) of
{result, Result} -> {result, Result};
{error, Error} -> {error, Error};
@@ -3499,22 +3565,22 @@ transaction_retry(Host, Fun, Trans, Count) ->
{atomic, {error, Error}} -> {error, Error};
{aborted, Reason} ->
?ERROR_MSG("transaction return internal error: ~p~n", [{aborted, Reason}]),
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, '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};
+ {error, '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};
+ {error, 'internal-server-error'};
Other ->
?ERROR_MSG("transaction return internal error: ~p~n", [Other]),
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end.
odbc_conn({_U, Host, _R})->
@@ -3524,23 +3590,21 @@ odbc_conn(Host) ->
%% escape value for database storage
escape({_U, _H, _R}=JID)->
- ejabberd_odbc:escape(jlib:jid_to_string(JID));
+ ejabberd_odbc:escape(exmpp_jid:to_list(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, Ext, []).
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])}.
+ extended_error(Error, unsupported,
+ [?XMLATTR('feature', Feature)]);
+extended_error(Error, Ext, ExtAttrs) ->
+ Pubsub_Err = #xmlel{ns = ?NS_PUBSUB_ERRORS, name = Ext, attrs = ExtAttrs},
+ exmpp_xml:append_child(exmpp_stanza:error(?NS_JABBER_CLIENT, Error),
+ Pubsub_Err).
%% Give a uniq identifier
uniqid() ->
@@ -3549,29 +3613,29 @@ uniqid() ->
% node attributes
nodeAttr(Node) when is_list(Node) ->
- [{"node", Node}];
+ [?XMLATTR('node', Node)];
nodeAttr(Node) ->
- [{"node", node_to_string(Node)}].
+ [?XMLATTR('node', node_to_string(Node))].
% item attributes
itemAttr([]) -> [];
-itemAttr(ItemId) -> [{"id", ItemId}].
+itemAttr(ItemId) -> [?XMLATTR('id', ItemId)].
% build item elements from item list
itemsEls(Items) ->
lists:map(fun(#pubsub_item{itemid = {ItemId, _}, payload = Payload}) ->
- {xmlelement, "item", itemAttr(ItemId), Payload}
+ #xmlel{ns = ?NS_PUBSUB, name = 'item', attrs = itemAttr(ItemId), children = Payload}
end, Items).
-add_message_type({xmlelement, "message", Attrs, Els}, Type) ->
- {xmlelement, "message", [{"type", Type}|Attrs], Els};
-add_message_type(XmlEl, _Type) ->
- XmlEl.
+add_message_type(#xmlel{name='message'} = El, Type) -> exmpp_stanza:set_type(El, Type);
+add_message_type(El, _Type) -> El.
-add_headers({xmlelement, Name, Attrs, Els}, HeaderEls) ->
- HeaderEl = {xmlelement, "headers", [{"xmlns", ?NS_SHIM}], HeaderEls},
- {xmlelement, Name, Attrs, [HeaderEl | Els]}.
+add_headers(#xmlel{} = El, HeaderEls) ->
+ HeaderEl = #xmlel{ns = ?NS_SHIM, name = 'headers', children = HeaderEls},
+ exmpp_xml:prepend_child(El, HeaderEl).
collection_shim(Node, Nodes) ->
- [{xmlelement, "header", [{"name", "Collection"}],
- [{xmlcdata, node_to_string(N)}]} || N <- Nodes -- [Node]].
+ [#xmlel{ns = ?NS_PUBSUB, name ='header',
+ attrs = [?XMLATTR('name', <<"Collection">>)],
+ children = [ ?XMLCDATA(node_to_string(N))]
+ } || N <- Nodes -- [Node]].
diff --git a/src/mod_pubsub/node.template b/src/mod_pubsub/node.template
index e0c743d38..a6c8a9477 100644
--- a/src/mod_pubsub/node.template
+++ b/src/mod_pubsub/node.template
@@ -26,7 +26,6 @@
-author(__TO_BE_DEFINED__).
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_node).
@@ -45,7 +44,7 @@
create_node/2,
delete_node/1,
purge_node/2,
- subscribe_node/8,
+ subscribe_node/7,
unsubscribe_node/4,
publish_item/6,
delete_item/4,
@@ -56,9 +55,8 @@
set_affiliation/3,
get_entity_subscriptions/2,
get_node_subscriptions/1,
- get_subscriptions/2,
- set_subscriptions/4,
- get_pending_nodes/2,
+ get_subscription/2,
+ set_subscription/3,
get_states/1,
get_state/2,
set_state/1,
@@ -66,8 +64,7 @@
get_items/2,
get_item/7,
get_item/2,
- set_item/1,
- get_item_name/3
+ set_item/1
]).
@@ -78,7 +75,8 @@ terminate(Host, ServerHost) ->
node_hometree:terminate(Host, ServerHost).
options() ->
- [{deliver_payloads, true},
+ [{node_type, __TO_BE_DEFINED__},
+ {deliver_payloads, true},
{notify_config, false},
{notify_delete, false},
{notify_retract, true},
@@ -97,7 +95,7 @@ options() ->
features() ->
["create-nodes",
"delete-nodes",
- "delete-items",
+ "delete-any",
"instant-nodes",
"outcast-affiliation",
"persistent-items",
@@ -120,8 +118,8 @@ create_node(NodeId, Owner) ->
delete_node(Removed) ->
node_hometree:delete_node(Removed).
-subscribe_node(NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options) ->
- node_hometree:subscribe_node(NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options).
+subscribe_node(NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup) ->
+ node_hometree:subscribe_node(NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup).
unsubscribe_node(NodeId, Sender, Subscriber, SubID) ->
node_hometree:unsubscribe_node(NodeId, Sender, Subscriber, SubID).
@@ -156,14 +154,11 @@ get_entity_subscriptions(Host, Owner) ->
get_node_subscriptions(NodeId) ->
node_hometree:get_node_subscriptions(NodeId).
-get_subscriptions(NodeId, Owner) ->
- node_hometree:get_subscriptions(NodeId, Owner).
+get_subscription(NodeId, Owner) ->
+ node_hometree:get_subscription(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).
+set_subscription(NodeId, Owner, Subscription) ->
+ node_hometree:set_subscription(NodeId, Owner, Subscription).
get_states(NodeId) ->
node_hometree:get_states(NodeId).
@@ -177,7 +172,7 @@ set_state(State) ->
get_items(NodeId, From) ->
node_hometree:get_items(NodeId, From).
-get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) ->
+get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId)
node_hometree:get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId).
get_item(NodeId, ItemId) ->
@@ -188,6 +183,3 @@ get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, Su
set_item(Item) ->
node_hometree:set_item(Item).
-
-get_item_name(Host, Node, Id) ->
- node_hometree:get_item_name(Host, Node, Id).
diff --git a/src/mod_pubsub/node_buddy.erl b/src/mod_pubsub/node_buddy.erl
index c952252bd..4d0a75710 100644
--- a/src/mod_pubsub/node_buddy.erl
+++ b/src/mod_pubsub/node_buddy.erl
@@ -26,8 +26,9 @@
-module(node_buddy).
-author('christophe.romain@process-one.net').
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_node).
@@ -69,8 +70,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
@@ -169,6 +170,7 @@ 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).
@@ -201,4 +203,3 @@ node_to_path(Node) ->
path_to_node(Path) ->
node_flat:path_to_node(Path).
-
diff --git a/src/mod_pubsub/node_club.erl b/src/mod_pubsub/node_club.erl
index d77cde702..536c39d9f 100644
--- a/src/mod_pubsub/node_club.erl
+++ b/src/mod_pubsub/node_club.erl
@@ -27,7 +27,7 @@
-author('christophe.romain@process-one.net').
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-behaviour(gen_pubsub_node).
@@ -69,8 +69,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
@@ -200,4 +200,3 @@ node_to_path(Node) ->
path_to_node(Path) ->
node_flat:path_to_node(Path).
-
diff --git a/src/mod_pubsub/node_dag.erl b/src/mod_pubsub/node_dag.erl
index b70169460..439be2205 100644
--- a/src/mod_pubsub/node_dag.erl
+++ b/src/mod_pubsub/node_dag.erl
@@ -53,8 +53,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1]).
+ node_to_path/1,
+ path_to_node/1]).
init(Host, ServerHost, Opts) ->
@@ -96,7 +96,7 @@ publish_item(NodeID, Publisher, Model, MaxItems, ItemID, Payload) ->
#pubsub_node{options = Options} ->
case find_opt(node_type, Options) of
collection ->
- {error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "publish")};
+ {error, mod_pubsub:extended_error('not-allowed', "publish")};
_ ->
node_hometree:publish_item(NodeID, Publisher, Model,
MaxItems, ItemID, Payload)
@@ -181,4 +181,3 @@ node_to_path(Node) ->
path_to_node(Path) ->
node_hometree:path_to_node(Path).
-
diff --git a/src/mod_pubsub/node_dispatch.erl b/src/mod_pubsub/node_dispatch.erl
index d81848fe3..05e7d8494 100644
--- a/src/mod_pubsub/node_dispatch.erl
+++ b/src/mod_pubsub/node_dispatch.erl
@@ -27,7 +27,7 @@
-author('christophe.romain@process-one.net').
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-behaviour(gen_pubsub_node).
@@ -67,8 +67,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
@@ -122,10 +122,10 @@ delete_node(Removed) ->
subscribe_node(_NodeId, _Sender, _Subscriber, _AccessModel,
_SendLast, _PresenceSubscription, _RosterGroup, _Options) ->
- {error, ?ERR_FORBIDDEN}.
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'forbidden')}.
unsubscribe_node(_NodeId, _Sender, _Subscriber, _SubID) ->
- {error, ?ERR_FORBIDDEN}.
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'forbidden')}.
publish_item(NodeId, Publisher, Model, MaxItems, ItemId, Payload) ->
lists:foreach(fun(SubNode) ->
@@ -138,10 +138,10 @@ remove_extra_items(_NodeId, _MaxItems, ItemIds) ->
{result, {ItemIds, []}}.
delete_item(_NodeId, _Publisher, _PublishModel, _ItemId) ->
- {error, ?ERR_ITEM_NOT_FOUND}.
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item-not-found')}.
purge_node(_NodeId, _Owner) ->
- {error, ?ERR_FORBIDDEN}.
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'forbidden')}.
get_entity_affiliations(_Host, _Owner) ->
{result, []}.
@@ -204,4 +204,3 @@ node_to_path(Node) ->
path_to_node(Path) ->
node_flat:path_to_node(Path).
-
diff --git a/src/mod_pubsub/node_flat.erl b/src/mod_pubsub/node_flat.erl
index 854e64321..3e3617f54 100644
--- a/src/mod_pubsub/node_flat.erl
+++ b/src/mod_pubsub/node_flat.erl
@@ -26,7 +26,7 @@
-author('christophe.romain@process-one.net').
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-behaviour(gen_pubsub_node).
@@ -60,8 +60,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
@@ -95,12 +95,13 @@ features() ->
%% the home/localhost/user/... hierarchy
%% any node is allowed
create_node_permission(Host, ServerHost, _Node, _ParentNode, Owner, Access) ->
- LOwner = jlib:jid_tolower(Owner),
+ LOwner = jlib:short_prepd_jid(Owner),
Allowed = case LOwner of
- {"", Host, ""} ->
+ {undefined, Host, undefined} ->
true; % pubsub service always allowed
_ ->
- acl:match_rule(ServerHost, Access, LOwner) =:= allow
+ {LU, LS, LR} = LOwner,
+ acl:match_rule(ServerHost, Access, exmpp_jid:make(LU, LS, LR)) =:= allow
end,
{result, Allowed}.
diff --git a/src/mod_pubsub/node_flat_odbc.erl b/src/mod_pubsub/node_flat_odbc.erl
index 0e6c8faa1..973ee5018 100644
--- a/src/mod_pubsub/node_flat_odbc.erl
+++ b/src/mod_pubsub/node_flat_odbc.erl
@@ -26,7 +26,7 @@
-author('christophe.romain@process-one.net').
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-behaviour(gen_pubsub_node).
@@ -47,7 +47,6 @@
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,
@@ -55,17 +54,15 @@
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
+ node_to_path/1,
+ path_to_node/1
]).
@@ -76,8 +73,7 @@ terminate(Host, ServerHost) ->
node_hometree_odbc:terminate(Host, ServerHost).
options() ->
- [{node_type, flat},
- {deliver_payloads, true},
+ [{deliver_payloads, true},
{notify_config, false},
{notify_delete, false},
{notify_retract, true},
@@ -102,12 +98,13 @@ features() ->
%% the home/localhost/user/... hierarchy
%% any node is allowed
create_node_permission(Host, ServerHost, _Node, _ParentNode, Owner, Access) ->
- LOwner = jlib:jid_tolower(Owner),
+ LOwner = jlib:short_prepd_jid(Owner),
Allowed = case LOwner of
- {"", Host, ""} ->
+ {undefined, Host, undefined} ->
true; % pubsub service always allowed
_ ->
- acl:match_rule(ServerHost, Access, LOwner) =:= allow
+ {LU, LS, LR} = LOwner,
+ acl:match_rule(ServerHost, Access, exmpp_jid:make(LU, LS, LR)) =:= allow
end,
{result, Allowed}.
@@ -150,9 +147,6 @@ set_affiliation(NodeId, Owner, Affiliation) ->
get_entity_subscriptions(Host, Owner) ->
node_hometree_odbc:get_entity_subscriptions(Host, Owner).
-get_entity_subscriptions_for_send_last(Host, Owner) ->
- node_hometree_odbc:get_entity_subscriptions_for_send_last(Host, Owner).
-
get_node_subscriptions(NodeId) ->
node_hometree_odbc:get_node_subscriptions(NodeId).
@@ -176,12 +170,9 @@ 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).
+ node_hometree_odbc:get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId).
get_item(NodeId, ItemId) ->
node_hometree_odbc:get_item(NodeId, ItemId).
@@ -209,5 +200,4 @@ path_to_node(Path) ->
[Node|_] when is_list(Node) -> list_to_binary(string:join([""|Path], "/"));
% default case (used by PEP for example)
_ -> list_to_binary(Path)
- end.
-
+ end.
diff --git a/src/mod_pubsub/node_hometree.erl b/src/mod_pubsub/node_hometree.erl
index 5ce7b9724..c8bb61982 100644
--- a/src/mod_pubsub/node_hometree.erl
+++ b/src/mod_pubsub/node_hometree.erl
@@ -42,7 +42,7 @@
-author('christophe.romain@process-one.net').
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-behaviour(gen_pubsub_node).
@@ -76,8 +76,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
%% ================
@@ -197,13 +197,14 @@ features() ->
%% ```check_create_user_permission(Host, ServerHost, Node, ParentNode, Owner, Access) ->
%% node_default:check_create_user_permission(Host, ServerHost, Node, ParentNode, Owner, Access).'''
create_node_permission(Host, ServerHost, Node, _ParentNode, Owner, Access) ->
- LOwner = jlib:jid_tolower(Owner),
+ LOwner = jlib:short_prepd_jid(Owner),
{User, Server, _Resource} = LOwner,
Allowed = case LOwner of
- {"", Host, ""} ->
+ {undefined, Host, undefined} ->
true; % pubsub service always allowed
_ ->
- case acl:match_rule(ServerHost, Access, LOwner) of
+ {LU, LS, LR} = LOwner,
+ case acl:match_rule(ServerHost, Access, exmpp_jid:make(LU, LS, LR)) of
allow ->
case node_to_path(Node) of
["home", Server, User | _] -> true;
@@ -221,7 +222,7 @@ create_node_permission(Host, ServerHost, Node, _ParentNode, Owner, Access) ->
%% Owner = mod_pubsub:jid()
%% @doc
create_node(NodeId, Owner) ->
- OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
+ OwnerKey = jlib:short_prepd_bare_jid(Owner),
set_state(#pubsub_state{stateid = {OwnerKey, NodeId}, affiliation = owner}),
{result, {default, broadcast}}.
@@ -281,9 +282,9 @@ delete_node(Removed) ->
%% 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),
+ SubKey = jlib:short_prepd_jid(Subscriber),
+ GenKey = jlib:short_prepd_bare_jid(SubKey),
+ Authorized = (jlib:short_prepd_bare_jid(Sender) == GenKey),
GenState = get_state(NodeId, GenKey),
SubState = case SubKey of
GenKey -> GenState;
@@ -298,31 +299,31 @@ subscribe_node(NodeId, Sender, Subscriber, AccessModel,
if
not Authorized ->
%% JIDs do not match
- {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "invalid-jid")};
+ {error, ?ERR_EXTENDED('bad-request', "invalid-jid")};
Affiliation == outcast ->
%% Requesting entity is blocked
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
PendingSubscription ->
%% Requesting entity has pending subscription
- {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "pending-subscription")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('not-allowed', "closed-node")};
%%MustPay ->
%% % Payment is required for a subscription
%% {error, ?ERR_PAYMENT_REQUIRED};
%%ForbiddenAnonymous ->
%% % Requesting entity is anonymous
- %% {error, ?ERR_FORBIDDEN};
+ %% {error, 'forbidden'};
true ->
- case pubsub_subscription:add_subscription(Subscriber, NodeId, Options) of
- SubId when is_list(SubId) ->
+ case pubsub_subscription:subscribe_node(Subscriber, NodeId, Options) of
+ {result, SubId} ->
NewSub = case AccessModel of
authorize -> pending;
_ -> subscribed
@@ -337,7 +338,7 @@ subscribe_node(NodeId, Sender, Subscriber, AccessModel,
{result, {default, pending, SubId}}
end;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end
end.
@@ -350,9 +351,9 @@ subscribe_node(NodeId, Sender, Subscriber, AccessModel,
%% Reason = mod_pubsub:stanzaError()
%% @doc Unsubscribe 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),
+ SubKey = jlib:short_prepd_jid(Subscriber),
+ GenKey = jlib:short_prepd_bare_jid(SubKey),
+ Authorized = (jlib:short_prepd_bare_jid(Sender) == GenKey),
GenState = get_state(NodeId, GenKey),
SubState = case SubKey of
GenKey -> GenState;
@@ -369,16 +370,16 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) ->
if
%% Requesting entity is prohibited from unsubscribing entity
not Authorized ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
%% Entity did not specify SubId
%%SubId == "", ?? ->
- %% {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")};
+ %% {error, ?ERR_EXTENDED('bad-request', "subid-required")};
%% Invalid subscription identifier
%%InvalidSubId ->
- %% {error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
+ %% {error, ?ERR_EXTENDED('not-acceptable', "invalid-subid")};
%% Requesting entity is not a subscriber
Subscriptions == [] ->
- {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST, "not-subscribed")};
+ {error, ?ERR_EXTENDED('unexpected-request', "not-subscribed")};
%% Subid supplied, so use that.
SubIdExists ->
Sub = first_in_list(fun(S) ->
@@ -392,7 +393,7 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) ->
delete_subscription(SubKey, NodeId, S, SubState),
{result, default};
false ->
- {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST,
+ {error, ?ERR_EXTENDED('unexpected-request',
"not-subscribed")}
end;
%% No subid supplied, but there's only one matching
@@ -400,16 +401,15 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) ->
length(Subscriptions) == 1 ->
delete_subscription(SubKey, NodeId, hd(Subscriptions), SubState),
{result, default};
- %% No subid and more than one possible subscription match.
true ->
- {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}
+ {error, ?ERR_EXTENDED('bad-request', "subid-required")}
end.
delete_subscription(SubKey, NodeID, {Subscription, SubId}, SubState) ->
Affiliation = SubState#pubsub_state.affiliation,
AllSubs = SubState#pubsub_state.subscriptions,
NewSubs = AllSubs -- [{Subscription, SubId}],
- pubsub_subscription:delete_subscription(SubKey, NodeID, SubId),
+ pubsub_subscription:unsubscribe_node(SubKey, NodeID, SubId),
case {Affiliation, NewSubs} of
{none, []} ->
% Just a regular subscriber, and this is final item, so
@@ -459,8 +459,8 @@ delete_subscription(SubKey, NodeID, {Subscription, SubId}, SubState) ->
%%
%% 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),
+ SubKey = jlib:short_prepd_jid(Publisher),
+ GenKey = jlib:short_prepd_bare_jid(Publisher),
GenState = get_state(NodeId, GenKey),
SubState = case SubKey of
GenKey -> GenState;
@@ -477,7 +477,7 @@ publish_item(NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload) ->
and ((Affiliation == owner) or (Affiliation == publisher)))
or (Subscribed == true)) ->
%% Entity does not have sufficient privileges to publish to node
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
true ->
%% TODO: check creation, presence, roster
if MaxItems > 0 ->
@@ -539,8 +539,7 @@ remove_extra_items(NodeId, MaxItems, ItemIds) ->
%% Default plugin: The user performing the deletion must be the node owner
%% or a publisher, or PublishModel being open.
delete_item(NodeId, Publisher, PublishModel, ItemId) ->
- SubKey = jlib:jid_tolower(Publisher),
- GenKey = jlib:jid_remove_resource(SubKey),
+ GenKey = jlib:short_prepd_bare_jid(Publisher),
GenState = get_state(NodeId, GenKey),
#pubsub_state{affiliation = Affiliation, items = Items} = GenState,
Allowed = (Affiliation == publisher) orelse (Affiliation == owner)
@@ -552,7 +551,7 @@ delete_item(NodeId, Publisher, PublishModel, ItemId) ->
if
not Allowed ->
%% Requesting entity does not have sufficient privileges
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
true ->
case lists:member(ItemId, Items) of
true ->
@@ -576,10 +575,10 @@ delete_item(NodeId, Publisher, PublishModel, ItemId) ->
end;
(_, Res) ->
Res
- end, {error, ?ERR_ITEM_NOT_FOUND}, States);
+ end, {error, 'item-not-found'}, States);
_ ->
%% Non-existent node or item
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end
end
end.
@@ -590,8 +589,7 @@ delete_item(NodeId, Publisher, PublishModel, ItemId) ->
%% NodeId = mod_pubsub:pubsubNodeId()
%% Owner = mod_pubsub:jid()
purge_node(NodeId, Owner) ->
- SubKey = jlib:jid_tolower(Owner),
- GenKey = jlib:jid_remove_resource(SubKey),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
GenState = get_state(NodeId, GenKey),
case GenState of
#pubsub_state{affiliation = owner} ->
@@ -606,7 +604,7 @@ purge_node(NodeId, Owner) ->
{result, {default, broadcast}};
_ ->
%% Entity is not owner
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end.
%% @spec (Host, JID) -> [{Node,Affiliation}]
@@ -620,8 +618,7 @@ purge_node(NodeId, Owner) ->
%% 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),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
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;
@@ -643,14 +640,12 @@ get_node_affiliations(NodeId) ->
{result, lists:map(Tr, States)}.
get_affiliation(NodeId, Owner) ->
- SubKey = jlib:jid_tolower(Owner),
- GenKey = jlib:jid_remove_resource(SubKey),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
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),
+set_affiliation(NodeId, Owner, Affiliation) when ?IS_JID(Owner)->
+ GenKey = jlib:short_prepd_bare_jid(Owner),
GenState = get_state(NodeId, GenKey),
case {Affiliation, GenState#pubsub_state.subscriptions} of
{none, none} ->
@@ -670,8 +665,8 @@ set_affiliation(NodeId, Owner, 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),
+ {U, D, _} = SubKey = jlib:short_prepd_jid(Owner),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
States = case SubKey of
GenKey -> mnesia:match_object(
#pubsub_state{stateid = {{U, D, '_'}, '_'}, _ = '_'});
@@ -717,17 +712,17 @@ get_node_subscriptions(NodeId) ->
{result, lists:flatmap(Tr, States)}.
get_subscriptions(NodeId, Owner) ->
- SubKey = jlib:jid_tolower(Owner),
+ SubKey = jlib:short_prepd_jid(Owner),
SubState = get_state(NodeId, SubKey),
{result, SubState#pubsub_state.subscriptions}.
set_subscriptions(NodeId, Owner, Subscription, SubId) ->
- SubKey = jlib:jid_tolower(Owner),
+ SubKey = jlib:short_prepd_jid(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")};
+ none -> {error, ?ERR_EXTENDED('bad_request', "not-subscribed")};
_ -> new_subscription(NodeId, Owner, Subscription, SubState)
end;
{"", [{_, SID}]} ->
@@ -736,7 +731,7 @@ set_subscriptions(NodeId, Owner, Subscription, SubId) ->
_ -> replace_subscription({Subscription, SID}, SubState)
end;
{"", [_|_]} ->
- {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")};
+ {error, ?ERR_EXTENDED('bad_request', "subid-required")};
_ ->
case Subscription of
none -> unsub_with_subid(NodeId, SubId, SubState);
@@ -771,7 +766,6 @@ unsub_with_subid(NodeId, SubId, SubState) ->
_ ->
set_state(SubState#pubsub_state{subscriptions = NewSubs})
end.
-
%% @spec (Host, Owner) -> {result, [Node]} | {error, Reason}
%% Host = host()
%% Owner = jid()
@@ -857,11 +851,10 @@ get_state(NodeId, JID) ->
set_state(State) when is_record(State, pubsub_state) ->
mnesia:write(State);
set_state(_) ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}.
+ {error, 'internal-server-error'}.
%% @spec (NodeId, JID) -> ok | {error, Reason::stanzaError()}
%% NodeId = mod_pubsub:pubsubNodeId()
-%% JID = mod_pubsub:jid()
%% @doc Delete a state from database.
del_state(NodeId, JID) ->
mnesia:delete({pubsub_state, {JID, NodeId}}).
@@ -883,8 +876,8 @@ get_items(NodeId, _From) ->
Items = mnesia:match_object(#pubsub_item{itemid = {'_', NodeId}, _ = '_'}),
{result, lists:reverse(lists:keysort(#pubsub_item.modification, Items))}.
get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) ->
- SubKey = jlib:jid_tolower(JID),
- GenKey = jlib:jid_remove_resource(SubKey),
+ SubKey = jlib:short_prepd_jid(JID),
+ GenKey = jlib:short_prepd_bare_jid(JID),
GenState = get_state(NodeId, GenKey),
SubState = get_state(NodeId, SubKey),
Affiliation = GenState#pubsub_state.affiliation,
@@ -893,25 +886,25 @@ get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) -
if
%%SubId == "", ?? ->
%% Entity has multiple subscriptions to the node but does not specify a subscription ID
- %{error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")};
+ %{error, ?ERR_EXTENDED('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 ->
+ %{error, ?ERR_EXTENDED('not-acceptable', "invalid-subid")};
+ Affiliation == outcast ->
%% Requesting entity is blocked
- {error, ?ERR_FORBIDDEN};
+ {error, '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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('not-allowed', "closed-node")};
(AccessModel == authorize) and (not Whitelisted) ->
%% Node has authorize access model
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
%%MustPay ->
%% % Payment is required for a subscription
%% {error, ?ERR_PAYMENT_REQUIRED};
@@ -929,11 +922,10 @@ get_item(NodeId, ItemId) ->
[Item] when is_record(Item, pubsub_item) ->
{result, Item};
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end.
get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) ->
- SubKey = jlib:jid_tolower(JID),
- GenKey = jlib:jid_remove_resource(SubKey),
+ GenKey = jlib:short_prepd_bare_jid(JID),
GenState = get_state(NodeId, GenKey),
Affiliation = GenState#pubsub_state.affiliation,
Subscriptions = GenState#pubsub_state.subscriptions,
@@ -941,25 +933,25 @@ get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _S
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 ->
+ %{error, ?ERR_EXTENDED('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 ->
+ %{error, ?ERR_EXTENDED('not-acceptable', "invalid-subid")};
+ Affiliation == outcast ->
%% Requesting entity is blocked
- {error, ?ERR_FORBIDDEN};
+ {error, '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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('not-allowed', "closed-node")};
(AccessModel == authorize) and (not Whitelisted) ->
%% Node has authorize access model
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
%%MustPay ->
%% % Payment is required for a subscription
%% {error, ?ERR_PAYMENT_REQUIRED};
@@ -973,7 +965,7 @@ get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _S
set_item(Item) when is_record(Item, pubsub_item) ->
mnesia:write(Item);
set_item(_) ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}.
+ {error, 'internal-server-error'}.
%% @spec (NodeId, ItemId) -> ok | {error, Reason::stanzaError()}
%% NodeId = mod_pubsub:pubsubNodeId()
@@ -993,7 +985,7 @@ get_item_name(_Host, _Node, Id) ->
node_to_path(Node) ->
string:tokens(binary_to_list(Node), "/").
-
+
path_to_node([]) ->
<<>>;
path_to_node(Path) ->
diff --git a/src/mod_pubsub/node_hometree_odbc.erl b/src/mod_pubsub/node_hometree_odbc.erl
index 141d3275c..9e4414077 100644
--- a/src/mod_pubsub/node_hometree_odbc.erl
+++ b/src/mod_pubsub/node_hometree_odbc.erl
@@ -42,7 +42,8 @@
-author('christophe.romain@process-one.net').
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
+-include("jlib.hrl"). %% for rsm_in and rsm_out records definitions
-define(PUBSUB, mod_pubsub_odbc).
@@ -73,29 +74,26 @@
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,
- path_to_node/1,
- node_to_path/1
+ get_last_items/3,
+ path_to_node/1,
+ node_to_path/1
]).
-export([
- decode_jid/1,
- decode_node/1,
- decode_affiliation/1,
- decode_subscriptions/1,
- encode_jid/1,
- encode_affiliation/1,
- encode_subscriptions/1
- ]).
-
+ decode_jid/1,
+ decode_node/1,
+ decode_affiliation/1,
+ decode_subscriptions/1,
+ encode_jid/1,
+ encode_affiliation/1,
+ encode_subscriptions/1
+ ]).
%% ================
%% API definition
%% ================
@@ -204,13 +202,14 @@ features() ->
%% ```check_create_user_permission(Host, ServerHost, Node, ParentNode, Owner, Access) ->
%% node_default:check_create_user_permission(Host, ServerHost, Node, ParentNode, Owner, Access).'''
create_node_permission(Host, ServerHost, Node, _ParentNode, Owner, Access) ->
- LOwner = jlib:jid_tolower(Owner),
+ LOwner = jlib:short_prepd_jid(Owner),
{User, Server, _Resource} = LOwner,
Allowed = case LOwner of
- {"", Host, ""} ->
+ {undefined, Host, undefined} ->
true; % pubsub service always allowed
_ ->
- case acl:match_rule(ServerHost, Access, LOwner) of
+ {LU, LS, LR} = LOwner,
+ case acl:match_rule(ServerHost, Access, exmpp_jid:make(LU, LS, LR)) of
allow ->
case node_to_path(Node) of
["home", Server, User | _] -> true;
@@ -228,30 +227,37 @@ create_node_permission(Host, ServerHost, Node, _ParentNode, Owner, Access) ->
%% Owner = mod_pubsub:jid()
%% @doc
create_node(NodeId, Owner) ->
- OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
- State = #pubsub_state{stateid = {OwnerKey, NodeId}, affiliation = owner},
+ OwnerKey = jlib:short_prepd_bare_jid(Owner),
+ State = #pubsub_state{stateid = {OwnerKey, NodeId}, affiliation = owner},
catch ejabberd_odbc:sql_query_t(
- ["insert into pubsub_state(nodeid, jid, affiliation, subscriptions) "
- "values(", state_to_raw(NodeId, State), ");"]),
+ ["insert into pubsub_state(nodeid, jid, affiliation, subscriptions) "
+ "values(", state_to_raw(NodeId, State), ");"]),
{result, {default, broadcast}}.
%% @spec (Removed) -> ok
%% Removed = [mod_pubsub:pubsubNode()]
%% @doc purge items of deleted nodes after effective deletion.
delete_node(Removed) ->
+%% pablo: TODO, this is present on trunk/node_home_tree but not on trunk/node_home_tree_odbc.
+%% check what is the desired behaviour
+%% 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) ->
- Subscriptions = case catch ejabberd_odbc:sql_query_t(
- ["select jid, subscriptions "
- "from pubsub_state "
- "where nodeid='", NodeId, "';"]) of
- {selected, ["jid", "subscriptions"], RItems} ->
- lists:map(fun({SJID, Subscriptions}) ->
- {decode_jid(SJID), decode_subscriptions(Subscriptions)}
- end, RItems);
- _ ->
- []
- end,
+ Subscriptions = case catch ejabberd_odbc:sql_query_t(
+ ["select jid, subscriptions "
+ "from pubsub_state "
+ "where nodeid='", NodeId, ";"]) of
+ {selected, ["jid", "subscriptions"], RItems} ->
+ lists:map(fun({SJID, Subscriptions}) ->
+ {decode_jid(SJID), decode_subscriptions(Subscriptions)}
+ end, RItems);
+ _ ->
+ []
+ end,
%% state and item remove already done thanks to DELETE CASCADE
%% but here we get nothing in States, making notify_retract unavailable !
%% TODO, remove DELETE CASCADE from schema
@@ -294,9 +300,9 @@ delete_node(Removed) ->
%% 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),
+ SubKey = jlib:short_prepd_jid(Subscriber),
+ GenKey = jlib:short_prepd_bare_jid(SubKey),
+ Authorized = (jlib:short_prepd_bare_jid(Sender) == GenKey),
{Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey, SubKey),
Whitelisted = lists:member(Affiliation, [member, publisher, owner]),
PendingSubscription = lists:any(fun({pending, _}) -> true;
@@ -305,28 +311,28 @@ subscribe_node(NodeId, Sender, Subscriber, AccessModel,
if
not Authorized ->
%% JIDs do not match
- {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "invalid-jid")};
+ {error, ?ERR_EXTENDED('bad-request', "invalid-jid")};
Affiliation == outcast ->
%% Requesting entity is blocked
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
PendingSubscription ->
%% Requesting entity has pending subscription
- {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "pending-subscription")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('not-allowed', "closed-node")};
%%MustPay ->
%% % Payment is required for a subscription
%% {error, ?ERR_PAYMENT_REQUIRED};
%%ForbiddenAnonymous ->
%% % Requesting entity is anonymous
- %% {error, ?ERR_FORBIDDEN};
+ %% {error, 'forbidden'};
true ->
case pubsub_subscription_odbc:subscribe_node(Subscriber, NodeId, Options) of
{result, SubId} ->
@@ -334,7 +340,7 @@ subscribe_node(NodeId, Sender, Subscriber, AccessModel,
authorize -> pending;
_ -> subscribed
end,
- update_subscription(NodeId, SubKey, [{NewSub, SubId} | Subscriptions]),
+ update_subscription(NodeId, SubKey, [{NewSub, SubId} |Subscriptions]),
case {NewSub, SendLast} of
{subscribed, never} ->
{result, {default, subscribed, SubId}};
@@ -344,7 +350,7 @@ subscribe_node(NodeId, Sender, Subscriber, AccessModel,
{result, {default, pending, SubId}}
end;
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end
end.
@@ -357,9 +363,9 @@ subscribe_node(NodeId, Sender, Subscriber, AccessModel,
%% Reason = mod_pubsub:stanzaError()
%% @doc Unsubscribe 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),
+ SubKey = jlib:short_prepd_jid(Subscriber),
+ GenKey = jlib:short_prepd_bare_jid(SubKey),
+ Authorized = (jlib:short_prepd_bare_jid(Sender) == GenKey),
{Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, SubKey),
SubIdExists = case SubId of
[] -> false;
@@ -369,16 +375,16 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) ->
if
%% Requesting entity is prohibited from unsubscribing entity
not Authorized ->
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
%% Entity did not specify SubId
%%SubId == "", ?? ->
- %% {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")};
+ %% {error, ?ERR_EXTENDED('bad-request', "subid-required")};
%% Invalid subscription identifier
%%InvalidSubId ->
- %% {error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
+ %% {error, ?ERR_EXTENDED('not-acceptable', "invalid-subid")};
%% Requesting entity is not a subscriber
Subscriptions == [] ->
- {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST, "not-subscribed")};
+ {error, ?ERR_EXTENDED('unexpected-request', "not-subscribed")};
%% Subid supplied, so use that.
SubIdExists ->
Sub = first_in_list(fun(S) ->
@@ -392,16 +398,15 @@ unsubscribe_node(NodeId, Sender, Subscriber, SubId) ->
delete_subscription(SubKey, NodeId, S, Affiliation, Subscriptions),
{result, default};
false ->
- {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST, "not-subscribed")}
+ {error, ?ERR_EXTENDED('unexpected-request', "not-subscribed")}
end;
%% 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")}
+ {error, ?ERR_EXTENDED('bad-request', "subid-required")}
end.
delete_subscription(SubKey, NodeId, {Subscription, SubId}, Affiliation, Subscriptions) ->
@@ -416,6 +421,7 @@ delete_subscription(SubKey, NodeId, {Subscription, SubId}, Affiliation, Subscrip
update_subscription(NodeId, SubKey, NewSubs)
end.
+
%% @spec (NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload) ->
%% {true, PubsubItem} | {result, Reply}
%% NodeId = mod_pubsub:pubsubNodeId()
@@ -455,8 +461,8 @@ delete_subscription(SubKey, NodeId, {Subscription, SubId}, Affiliation, Subscrip
%%
%% 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),
+ SubKey = jlib:short_prepd_jid(Publisher),
+ GenKey = jlib:short_prepd_bare_jid(Publisher),
{Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey, SubKey),
Subscribed = case PublishModel of
subscribers -> is_subscribed(Subscriptions);
@@ -468,23 +474,23 @@ publish_item(NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload) ->
and ((Affiliation == owner) or (Affiliation == publisher)))
or (Subscribed == true)) ->
%% Entity does not have sufficient privileges to publish to node
- {error, ?ERR_FORBIDDEN};
+ {error, '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},
+ %% 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}};
+ 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, []}}
+ {result, {default, broadcast, []}}
end
end.
@@ -522,10 +528,9 @@ remove_extra_items(NodeId, MaxItems, ItemIds) ->
%% ItemId = string()
%% @doc Triggers item deletion.
%% Default plugin: The user performing the deletion must be the node owner
-%% or a publisher.
+%% or a publisher, or PublishModel being open.
delete_item(NodeId, Publisher, PublishModel, ItemId) ->
- SubKey = jlib:jid_tolower(Publisher),
- GenKey = jlib:jid_remove_resource(SubKey),
+ GenKey = jlib:short_prepd_bare_jid(Publisher),
{result, Affiliation} = get_affiliation(NodeId, GenKey),
Allowed = (Affiliation == publisher) orelse (Affiliation == owner)
orelse (PublishModel == open)
@@ -536,15 +541,15 @@ delete_item(NodeId, Publisher, PublishModel, ItemId) ->
if
not Allowed ->
%% Requesting entity does not have sufficient privileges
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
true ->
case del_item(NodeId, ItemId) of
{updated, 1} ->
- %% set new item list use useless
+ %% set new item list use useless
{result, {default, broadcast}};
_ ->
%% Non-existent node or item
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end
end.
@@ -554,8 +559,7 @@ delete_item(NodeId, Publisher, PublishModel, ItemId) ->
%% NodeId = mod_pubsub:pubsubNodeId()
%% Owner = mod_pubsub:jid()
purge_node(NodeId, Owner) ->
- SubKey = jlib:jid_tolower(Owner),
- GenKey = jlib:jid_remove_resource(SubKey),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
GenState = get_state(NodeId, GenKey),
case GenState of
#pubsub_state{affiliation = owner} ->
@@ -567,7 +571,7 @@ purge_node(NodeId, Owner) ->
{result, {default, broadcast}};
_ ->
%% Entity is not owner
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end.
%% @spec (Host, JID) -> [{Node,Affiliation}]
@@ -581,8 +585,7 @@ purge_node(NodeId, Owner) ->
%% 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),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
H = ?PUBSUB:escape(Host),
J = encode_jid(GenKey),
Reply = case catch ejabberd_odbc:sql_query_t(
@@ -614,8 +617,7 @@ get_node_affiliations(NodeId) ->
{result, Reply}.
get_affiliation(NodeId, Owner) ->
- SubKey = jlib:jid_tolower(Owner),
- GenKey = jlib:jid_remove_resource(SubKey),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
J = encode_jid(GenKey),
Reply = case catch ejabberd_odbc:sql_query_t(
["select affiliation from pubsub_state "
@@ -625,9 +627,8 @@ get_affiliation(NodeId, Owner) ->
end,
{result, Reply}.
-set_affiliation(NodeId, Owner, Affiliation) ->
- SubKey = jlib:jid_tolower(Owner),
- GenKey = jlib:jid_remove_resource(SubKey),
+set_affiliation(NodeId, Owner, Affiliation) when ?IS_JID(Owner)->
+ GenKey = jlib:short_prepd_bare_jid(Owner),
{_, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey),
case {Affiliation, Subscriptions} of
{none, none} ->
@@ -647,8 +648,8 @@ set_affiliation(NodeId, Owner, 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),
+ SubKey = jlib:short_prepd_jid(Owner),
+ GenKey = jlib:short_prepd_bare_jid(Owner),
H = ?PUBSUB:escape(Host),
SJ = encode_jid(SubKey),
GJ = encode_jid(GenKey),
@@ -684,7 +685,6 @@ get_entity_subscriptions(Host, Owner) ->
[]
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
@@ -751,8 +751,9 @@ get_node_subscriptions(NodeId) ->
end,
{result, Reply}.
+
get_subscriptions(NodeId, Owner) ->
- SubKey = jlib:jid_tolower(Owner),
+ SubKey = jlib:short_prepd_jid(Owner),
J = encode_jid(SubKey),
Reply = case catch ejabberd_odbc:sql_query_t(
["select subscriptions from pubsub_state "
@@ -763,12 +764,12 @@ get_subscriptions(NodeId, Owner) ->
{result, Reply}.
set_subscriptions(NodeId, Owner, Subscription, SubId) ->
- SubKey = jlib:jid_tolower(Owner),
+ SubKey = jlib:short_prepd_jid(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")};
+ none -> {error, ?ERR_EXTENDED('bad_request', "not-subscribed")};
_ -> new_subscription(NodeId, Owner, Subscription, SubState)
end;
{"", [{_, SID}]} ->
@@ -777,7 +778,7 @@ set_subscriptions(NodeId, Owner, Subscription, SubId) ->
_ -> replace_subscription({Subscription, SID}, SubState)
end;
{"", [_|_]} ->
- {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")};
+ {error, ?ERR_EXTENDED('bad_request', "subid-required")};
_ ->
case Subscription of
none -> unsub_with_subid(NodeId, SubId, SubState);
@@ -802,7 +803,7 @@ new_subscription(NodeId, Owner, Subscription, SubState) ->
set_state(SubState#pubsub_state{subscriptions = [{Subscription, SubId} | Subscriptions]}),
{Subscription, SubId};
_ ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end.
unsub_with_subid(NodeId, SubId, SubState) ->
@@ -817,7 +818,6 @@ unsub_with_subid(NodeId, SubId, SubState) ->
set_state(SubState#pubsub_state{subscriptions = NewSubs})
end.
-
%% @spec (Host, Owner) -> {result, [Node]} | {error, Reason}
%% Host = host()
%% Owner = jid()
@@ -825,6 +825,7 @@ unsub_with_subid(NodeId, SubId, SubState) ->
%% @doc Returns a list of Owner's nodes on Host with pending
%% subscriptions.
get_pending_nodes(Host, Owner) ->
+ %% pablo TODO, need to port those jlib:* calls to exmpp. Mnesia?
GenKey = jlib:jid_remove_resource(jlib:jid_tolower(Owner)),
States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'},
affiliation = owner,
@@ -893,6 +894,7 @@ get_states(NodeId) ->
{result, []}
end.
+
%% @spec (NodeId, JID) -> [State] | []
%% NodeId = mod_pubsub:pubsubNodeId()
%% JID = mod_pubsub:jid()
@@ -920,7 +922,7 @@ get_state_without_itemids(NodeId, JID) ->
%% @spec (State) -> ok | {error, Reason::stanzaError()}
%% State = mod_pubsub:pubsubStates()
%% @doc Write a state into database.
-set_state(State) ->
+set_state(State) when is_record(State, pubsub_state) ->
{_, NodeId} = State#pubsub_state.stateid,
set_state(NodeId, State).
set_state(NodeId, State) ->
@@ -947,7 +949,6 @@ set_state(NodeId, State) ->
%% @spec (NodeId, JID) -> ok | {error, Reason::stanzaError()}
%% NodeId = mod_pubsub:pubsubNodeId()
-%% JID = mod_pubsub:jid()
%% @doc Delete a state from database.
del_state(NodeId, JID) ->
J = encode_jid(JID),
@@ -957,7 +958,7 @@ del_state(NodeId, JID) ->
"and nodeid='", NodeId, "';"]),
ok.
-%% @spec (NodeId, From) -> {[Items],RsmOut} | []
+%% @spec (NodeId, From) -> {[Items], RsmOut} | []
%% NodeId = mod_pubsub:pubsubNodeId()
%% Items = mod_pubsub:pubsubItems()
%% @doc Returns the list of stored items for a given node.
@@ -972,10 +973,10 @@ del_state(NodeId, JID) ->
%% 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
+ ["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)};
_ ->
@@ -1057,36 +1058,35 @@ get_items(NodeId, _From, #rsm_in{max=M, direction=Direction, id=I, index=IncInde
_ ->
{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),
+ SubKey = jlib:short_prepd_jid(JID),
+ GenKey = jlib:short_prepd_bare_jid(JID),
{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")};
+ %{error, ?ERR_EXTENDED('bad-request', "subid-required")};
%%InvalidSubId ->
%% Entity is subscribed but specifies an invalid subscription ID
- %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
+ %{error, ?ERR_EXTENDED('not-acceptable', "invalid-subid")};
Affiliation == outcast ->
%% Requesting entity is blocked
- {error, ?ERR_FORBIDDEN};
+ {error, '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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('not-allowed', "closed-node")};
(AccessModel == authorize) and (not Whitelisted) ->
%% Node has authorize access model
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
%%MustPay ->
%% % Payment is required for a subscription
%% {error, ?ERR_PAYMENT_REQUIRED};
@@ -1121,35 +1121,36 @@ get_item(NodeId, ItemId) ->
{selected, ["itemid", "publisher", "creation", "modification", "payload"], [RItem]} ->
{result, raw_to_item(NodeId, RItem)};
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item-not-found'}
end.
+
get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) ->
- SubKey = jlib:jid_tolower(JID),
- GenKey = jlib:jid_remove_resource(SubKey),
+ SubKey = jlib:short_prepd_jid(JID),
+ GenKey = jlib:short_prepd_bare_jid(JID),
{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 ->
+ %{error, ?ERR_EXTENDED('bad-request', "subid-required")};
+ %%InvalidSubID ->
%% Entity is subscribed but specifies an invalid subscription ID
- %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
+ %{error, ?ERR_EXTENDED('not-acceptable', "invalid-subid")};
Affiliation == outcast ->
%% Requesting entity is blocked
- {error, ?ERR_FORBIDDEN};
+ {error, '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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('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")};
+ {error, ?ERR_EXTENDED('not-allowed', "closed-node")};
(AccessModel == authorize) and (not Whitelisted) ->
%% Node has authorize access model
- {error, ?ERR_FORBIDDEN};
+ {error, 'forbidden'};
%%MustPay ->
%% % Payment is required for a subscription
%% {error, ?ERR_PAYMENT_REQUIRED};
@@ -1211,14 +1212,6 @@ del_items(NodeId, ItemIds) ->
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
@@ -1381,3 +1374,11 @@ i2l(L, N) when is_list(L) ->
C when C > N -> L;
_ -> i2l([$0|L], N)
end.
+
+node_to_path(Node) ->
+ string:tokens(binary_to_list(Node), "/").
+
+path_to_node([]) ->
+ <<>>;
+path_to_node(Path) ->
+ list_to_binary(string:join([""|Path], "/")).
diff --git a/src/mod_pubsub/node_mb.erl b/src/mod_pubsub/node_mb.erl
index a497c17ba..9495a3bc5 100644
--- a/src/mod_pubsub/node_mb.erl
+++ b/src/mod_pubsub/node_mb.erl
@@ -36,9 +36,10 @@
-module(node_mb).
-author('eric@ohmforce.com').
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_node).
@@ -72,8 +73,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
init(Host, ServerHost, Opts) ->
@@ -208,4 +209,3 @@ node_to_path(Node) ->
path_to_node(Path) ->
node_pep:path_to_node(Path).
-
diff --git a/src/mod_pubsub/node_pep.erl b/src/mod_pubsub/node_pep.erl
index 5bdb4915f..ff397c8d2 100644
--- a/src/mod_pubsub/node_pep.erl
+++ b/src/mod_pubsub/node_pep.erl
@@ -29,9 +29,10 @@
-module(node_pep).
-author('christophe.romain@process-one.net').
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_node).
@@ -65,8 +66,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
init(Host, ServerHost, Opts) ->
@@ -115,13 +116,14 @@ features() ->
].
create_node_permission(Host, ServerHost, _Node, _ParentNode, Owner, Access) ->
- LOwner = jlib:jid_tolower(Owner),
- {User, Server, _Resource} = LOwner,
+ LOwner = jlib:short_prepd_jid(Owner),
+ {User, Server, Resource} = LOwner,
Allowed = case LOwner of
- {"", Host, ""} ->
+ {undefined, Host, undefined} ->
true; % pubsub service always allowed
_ ->
- case acl:match_rule(ServerHost, Access, LOwner) of
+ JID = exmpp_jid:make(User, Server, Resource),
+ case acl:match_rule(ServerHost, Access, JID) of
allow ->
case Host of
{User, Server, _} -> true;
diff --git a/src/mod_pubsub/node_pep_odbc.erl b/src/mod_pubsub/node_pep_odbc.erl
index e24c35a14..a92e522aa 100644
--- a/src/mod_pubsub/node_pep_odbc.erl
+++ b/src/mod_pubsub/node_pep_odbc.erl
@@ -29,12 +29,12 @@
-module(node_pep_odbc).
-author('christophe.romain@process-one.net').
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-include("pubsub.hrl").
--include("jlib.hrl").
-define(PUBSUB, mod_pubsub_odbc).
-
-behaviour(gen_pubsub_node).
%% API definition
@@ -70,9 +70,9 @@
get_item/2,
set_item/1,
get_item_name/3,
- get_last_items/3,
- node_to_path/1,
- path_to_node/1
+ get_last_items/3,
+ node_to_path/1,
+ path_to_node/1
]).
init(Host, ServerHost, Opts) ->
@@ -123,13 +123,14 @@ features() ->
].
create_node_permission(Host, ServerHost, _Node, _ParentNode, Owner, Access) ->
- LOwner = jlib:jid_tolower(Owner),
- {User, Server, _Resource} = LOwner,
+ LOwner = jlib:short_prepd_jid(Owner),
+ {User, Server, Resource} = LOwner,
Allowed = case LOwner of
- {"", Host, ""} ->
+ {undefined, Host, undefined} ->
true; % pubsub service always allowed
_ ->
- case acl:match_rule(ServerHost, Access, LOwner) of
+ JID = exmpp_jid:make(User, Server, Resource),
+ case acl:match_rule(ServerHost, Access, JID) of
allow ->
case Host of
{User, Server, _} -> true;
@@ -179,7 +180,7 @@ 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)),
+ OwnerKey = jlib:short_prepd_bare_jid(Owner),
node_hometree_odbc:get_entity_affiliations(OwnerKey, Owner).
get_node_affiliations(NodeId) ->
@@ -192,70 +193,70 @@ 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),
+ SubKey = jlib:short_prepd_jid(Owner),
+ GenKey = jlib:short_prepd_bare_jid(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 "
+ ["select host, node, type, i.nodeid, jid, subscription "
"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 "
+ ["select host, node, type, i.nodeid, jid, subscription "
"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} ->
+ {selected, ["host", "node", "type", "nodeid", "jid", "subscription"], RItems} ->
lists:map(fun({H, N, T, I, J, S}) ->
O = node_hometree_odbc:decode_jid(H),
Node = nodetree_odbc:raw_to_node(O, {N, "", T, I}),
- {Node, node_hometree_odbc:decode_subscriptions(S), node_hometree_odbc:decode_jid(J)}
+ {Node, node_hometree_odbc:decode_subscription(S), node_hometree_odbc:decode_jid(J)}
+ end, RItems);
+ _ ->
+ []
+ end,
+ {result, Reply}.
+get_entity_subscriptions_for_send_last(_Host, Owner) ->
+ SubKey = jlib:short_prepd_jid(Owner),
+ GenKey = jlib:short_prepd_bare_jid(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, subscription "
+ "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, subscription "
+ "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", "subscription"], RItems} ->
+ lists:map(fun({H, N, T, I, J, S}) ->
+ O = node_hometree_odbc:decode_jid(H),
+ Node = nodetree_odbc:raw_to_node(O, {N, "", T, I}),
+ {Node, node_hometree_odbc:decode_subscription(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_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
@@ -332,4 +333,3 @@ complain_if_modcaps_disabled(ServerHost) ->
_ ->
ok
end.
-
diff --git a/src/mod_pubsub/node_private.erl b/src/mod_pubsub/node_private.erl
index 10f019305..cdc50cd62 100644
--- a/src/mod_pubsub/node_private.erl
+++ b/src/mod_pubsub/node_private.erl
@@ -26,8 +26,9 @@
-module(node_private).
-author('christophe.romain@process-one.net').
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_node).
@@ -69,8 +70,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
@@ -204,4 +205,3 @@ node_to_path(Node) ->
path_to_node(Path) ->
node_flat:path_to_node(Path).
-
diff --git a/src/mod_pubsub/node_public.erl b/src/mod_pubsub/node_public.erl
index 5e26d8273..7872bea02 100644
--- a/src/mod_pubsub/node_public.erl
+++ b/src/mod_pubsub/node_public.erl
@@ -26,8 +26,9 @@
-module(node_public).
-author('christophe.romain@process-one.net').
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_node).
@@ -69,8 +70,8 @@
get_item/2,
set_item/1,
get_item_name/3,
- node_to_path/1,
- path_to_node/1
+ node_to_path/1,
+ path_to_node/1
]).
@@ -81,7 +82,8 @@ terminate(Host, ServerHost) ->
node_hometree:terminate(Host, ServerHost).
options() ->
- [{deliver_payloads, true},
+ [{node_type, public},
+ {deliver_payloads, true},
{notify_config, false},
{notify_delete, false},
{notify_retract, true},
@@ -163,7 +165,7 @@ get_subscriptions(NodeId, Owner) ->
node_hometree:get_subscriptions(NodeId, Owner).
set_subscriptions(NodeId, Owner, Subscription, SubId) ->
- node_hometree:set_subscriptions(NodeId, Owner, Subscription, SubId).
+ node_hometree:set_subscription(NodeId, Owner, Subscription, SubId).
get_pending_nodes(Host, Owner) ->
node_hometree:get_pending_nodes(Host, Owner).
@@ -202,4 +204,3 @@ node_to_path(Node) ->
path_to_node(Path) ->
node_flat:path_to_node(Path).
-
diff --git a/src/mod_pubsub/nodetree_dag.erl b/src/mod_pubsub/nodetree_dag.erl
index d7094e3e0..0c749fb51 100644
--- a/src/mod_pubsub/nodetree_dag.erl
+++ b/src/mod_pubsub/nodetree_dag.erl
@@ -39,7 +39,7 @@
-include("ejabberd.hrl").
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-behaviour(gen_pubsub_nodetree).
@@ -66,7 +66,7 @@ create_node(Key, NodeID, Type, Owner, Options, Parents) ->
N = #pubsub_node{nodeid = oid(Key, NodeID),
id = ID,
type = Type,
- parents = Parents,
+ parents = Parents,
owners = [OwnerJID],
options = Options},
case set_node(N) of
@@ -74,7 +74,7 @@ create_node(Key, NodeID, Type, Owner, Options, Parents) ->
Other -> Other
end;
_ ->
- {error, ?ERR_CONFLICT}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'conflict')}
end.
set_node(#pubsub_node{nodeid = {Key, _},
@@ -92,7 +92,7 @@ set_node(#pubsub_node{nodeid = {Key, _},
delete_node(Key, NodeID) ->
case find_node(Key, NodeID) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item-not-found')};
Node ->
%% Find all of N's children, update their configs to
%% remove N from the collection setting.
@@ -120,7 +120,7 @@ get_node(Host, NodeID, _From) ->
get_node(Host, NodeID) ->
case find_node(Host, NodeID) of
- false -> {error, ?ERR_ITEM_NOT_FOUND};
+ false -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item-not-found')};
Node -> Node
end.
@@ -135,7 +135,7 @@ get_nodes(Key) ->
get_parentnodes(Host, NodeID, _From) ->
case find_node(Host, NodeID) of
- false -> {error, ?ERR_ITEM_NOT_FOUND};
+ false -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item-not-found')};
#pubsub_node{parents = Parents} ->
Q = qlc:q([N || #pubsub_node{nodeid = {NHost, NNode}} = N <- mnesia:table(pubsub_node),
Parent <- Parents,
@@ -156,7 +156,7 @@ get_subnodes(Host, NodeID, _From) ->
get_subnodes(Host, NodeID) ->
case find_node(Host, NodeID) of
- false -> {error, ?ERR_ITEM_NOT_FOUND};
+ false -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item-not-found')};
_ ->
Q = qlc:q([Node || #pubsub_node{nodeid = {NHost, _},
parents = Parents} = Node <- mnesia:table(pubsub_node),
@@ -226,15 +226,15 @@ validate_parentage(Key, Owners, [[] | T]) ->
validate_parentage(Key, Owners, T);
validate_parentage(Key, Owners, [ParentID | T]) ->
case find_node(Key, ParentID) of
- false -> {error, ?ERR_ITEM_NOT_FOUND};
+ false -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'item_not_found')};
#pubsub_node{owners = POwners, options = POptions} ->
NodeType = find_opt(node_type, ?DEFAULT_NODETYPE, POptions),
MutualOwners = [O || O <- Owners, PO <- POwners,
O == PO],
case {MutualOwners, NodeType} of
- {[], _} -> {error, ?ERR_FORBIDDEN};
+ {[], _} -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'forbidden')};
{_, collection} -> validate_parentage(Key, Owners, T);
- {_, _} -> {error, ?ERR_NOT_ALLOWED}
+ {_, _} -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'not-allowed')}
end
end.
@@ -243,6 +243,6 @@ validate_parentage(Key, Owners, [ParentID | T]) ->
%% @doc Generate pubsub service JID.
service_jid(Host) ->
case Host of
- {U,S,_} -> {jid, U, S, "", U, S, ""};
- _ -> {jid, "", Host, "", "", Host, ""}
+ {U,S,_} -> exmpp_jid:make(U, S);
+ _ -> exmpp_jid:make(Host)
end.
diff --git a/src/mod_pubsub/nodetree_tree.erl b/src/mod_pubsub/nodetree_tree.erl
index 39160e7b5..610a9851e 100644
--- a/src/mod_pubsub/nodetree_tree.erl
+++ b/src/mod_pubsub/nodetree_tree.erl
@@ -37,9 +37,9 @@
-author('christophe.romain@process-one.net').
-include_lib("stdlib/include/qlc.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_nodetree).
@@ -101,32 +101,30 @@ options() ->
set_node(Record) when is_record(Record, pubsub_node) ->
mnesia:write(Record);
set_node(_) ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}.
+ {error, 'internal-server-error'}.
-get_node(Host, Node, _From) ->
- get_node(Host, Node).
-
-%% @spec (Host, Node) -> pubsubNode() | {error, Reason}
+%% @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) ->
case catch mnesia:read({pubsub_node, {Host, Node}}) of
[Record] when is_record(Record, pubsub_node) -> Record;
- [] -> {error, ?ERR_ITEM_NOT_FOUND};
+ [] -> {error, '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, 'item-not-found'};
Error -> Error
end.
+%% @spec (Host, From) -> [pubsubNode()] | {error, Reason}
+%% Host = mod_pubsub:host() | mod_pubsub:jid()
get_nodes(Host, _From) ->
get_nodes(Host).
-
-%% @spec (Host) -> [pubsubNode()] | {error, Reason}
-%% Host = mod_pubsub:host() | mod_pubsub:jid()
get_nodes(Host) ->
mnesia:match_object(#pubsub_node{nodeid = {Host, '_'}, _ = '_'}).
@@ -162,9 +160,9 @@ get_subnodes(Host, Node, _From) ->
get_subnodes(Host, Node).
get_subnodes(Host, <<>>) ->
Q = qlc:q([N || #pubsub_node{nodeid = {NHost, _},
- parents = Parents} = N <- mnesia:table(pubsub_node),
- Host == NHost,
- Parents == []]),
+ 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, _},
@@ -173,13 +171,12 @@ get_subnodes(Host, Node) ->
lists:member(Node, Parents)]),
qlc:e(Q).
-get_subnodes_tree(Host, Node, _From) ->
- get_subnodes_tree(Host, Node).
-
-%% @spec (Host, Index) -> [pubsubNodeIdx()] | {error, Reason}
+%% @spec (Host, Index, From) -> [pubsubNodeIdx()] | {error, Reason}
%% Host = mod_pubsub:host()
%% Node = mod_pubsub:pubsubNode()
%% From = mod_pubsub:jid()
+get_subnodes_tree(Host, Node, _From) ->
+ get_subnodes_tree(Host, Node).
get_subnodes_tree(Host, Node) ->
case get_node(Host, Node) of
{error, _} ->
@@ -204,8 +201,8 @@ get_subnodes_tree(Host, Node) ->
%% Owner = mod_pubsub:jid()
%% Options = list()
create_node(Host, Node, Type, Owner, Options, Parents) ->
- BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
- case catch mnesia:read({pubsub_node, {Host, Node}}) of
+ BJID = jlib:short_prepd_bare_jid(Owner),
+ case mnesia:read({pubsub_node, {Host, Node}}) of
[] ->
ParentExists =
case Host of
@@ -215,15 +212,15 @@ create_node(Host, Node, Type, Owner, Options, Parents) ->
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
+ [] -> true;
+ [Parent | _] ->
+ case mnesia:read({pubsub_node, {Host, Parent}}) of
+ [#pubsub_node{owners = [{[], Host, []}]}] -> true;
+ [#pubsub_node{owners = Owners}] -> lists:member(BJID, Owners);
+ _ -> false
end;
- _ ->
- false
+ _ ->
+ false
end
end,
case ParentExists of
@@ -238,11 +235,11 @@ create_node(Host, Node, Type, Owner, Options, Parents) ->
{ok, NodeId};
false ->
%% Requesting entity is prohibited from creating nodes
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end;
_ ->
%% NodeID already exists
- {error, ?ERR_CONFLICT}
+ {error, 'conflict'}
end.
%% @spec (Host, Node) -> [mod_pubsub:node()]
diff --git a/src/mod_pubsub/nodetree_tree_odbc.erl b/src/mod_pubsub/nodetree_tree_odbc.erl
index d8ff30832..4853992d3 100644
--- a/src/mod_pubsub/nodetree_tree_odbc.erl
+++ b/src/mod_pubsub/nodetree_tree_odbc.erl
@@ -36,8 +36,10 @@
-module(nodetree_tree_odbc).
-author('christophe.romain@process-one.net').
+-include_lib("stdlib/include/qlc.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("pubsub.hrl").
--include("jlib.hrl").
-define(PUBSUB, mod_pubsub_odbc).
-define(PLUGIN_PREFIX, "node_").
@@ -88,6 +90,7 @@ options() ->
[{virtual_tree, false},
{odbc, true}].
+
%% @spec (Host, Node, From) -> pubsubNode() | {error, Reason}
%% Host = mod_pubsub:host()
%% Node = mod_pubsub:pubsubNode()
@@ -104,9 +107,9 @@ get_node(Host, Node) ->
{selected, ["node", "parent", "type", "nodeid"], [RItem]} ->
raw_to_node(Host, RItem);
{'EXIT', _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal_server_error'};
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item_not_found'}
end.
get_node(NodeId) ->
case catch ejabberd_odbc:sql_query_t(
@@ -117,13 +120,13 @@ get_node(NodeId) ->
{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, 'internal_server_error'};
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item_not_found'}
end.
%% @spec (Host, From) -> [pubsubNode()] | {error, Reason}
-%% Host = mod_pubsub:host() | mod_pubsub:jid()
+%% Host = mod_pubsub:host() | mod_pubsub:jid()
get_nodes(Host, _From) ->
get_nodes(Host).
get_nodes(Host) ->
@@ -165,10 +168,6 @@ get_parentnodes_tree(Host, Node, From) ->
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)),
@@ -183,12 +182,12 @@ get_subnodes(Host, Node) ->
[]
end.
+%% @spec (Host, Index, From) -> [pubsubNodeIdx()] | {error, Reason}
+%% Host = mod_pubsub:host()
+%% Node = mod_pubsub:pubsubNode()
+%% From = mod_pubsub:jid()
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)),
@@ -204,38 +203,36 @@ get_subnodes_tree(Host, Node) ->
end.
%% @spec (Host, Node, Type, Owner, Options) -> 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()
+%% Host = mod_pubsub:host() | mod_pubsub:jid()
+%% Node = mod_pubsub:pubsubNode()
+%% NodeType = mod_pubsub:nodeType()
+%% Owner = mod_pubsub:jid()
+%% Options = list()
create_node(Host, Node, Type, Owner, Options, Parents) ->
- BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
+ BJID = jlib:short_prepd_bare_jid(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
+ {error, 'item_not_found'} ->
+ ParentExists = case Host of
+ {_, _, _} ->
+ %% 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 ->
@@ -249,18 +246,19 @@ create_node(Host, Node, Type, Owner, Options, Parents) ->
end;
false ->
%% Requesting entity is prohibited from creating nodes
- {error, ?ERR_FORBIDDEN}
+ {error, 'forbidden'}
end;
{result, _} ->
%% NodeID already exists
- {error, ?ERR_CONFLICT};
+ {error, 'conflict'};
Error ->
Error
end.
+
%% @spec (Host, Node) -> [mod_pubsub:node()]
-%% Host = mod_pubsub:host() | mod_pubsub:jid()
-%% Node = mod_pubsub:pubsubNode()
+%% 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)),
@@ -270,6 +268,7 @@ delete_node(Host, Node) ->
"where host='", H, "' and node like '", N, "%';"]),
Removed.
+
%% helpers
raw_to_node(Host, {Node, Parent, Type, NodeId}) ->
@@ -294,7 +293,7 @@ raw_to_node(Host, {Node, Parent, Type, NodeId}) ->
[]
end,
#pubsub_node{
- nodeid = {Host, ?PUBSUB:string_to_node(Node)},
+ nodeid = {Host, ?PUBSUB:string_to_node(Node)},
parents = [?PUBSUB:string_to_node(Parent)],
id = NodeId,
type = Type,
@@ -305,8 +304,8 @@ raw_to_node(Host, {Node, Parent, Type, NodeId}) ->
set_node(Record) ->
{Host, Node} = Record#pubsub_node.nodeid,
Parent = case Record#pubsub_node.parents of
- [] -> <<>>;
- [First|_] -> First
+ [] -> <<>>;
+ [First | _] -> First
end,
Type = Record#pubsub_node.type,
H = ?PUBSUB:escape(Host),
@@ -336,7 +335,7 @@ set_node(Record) ->
end,
case NodeId of
none ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal_server_error'};
_ ->
lists:foreach(fun({Key, Value}) ->
SKey = atom_to_list(Key),
@@ -359,9 +358,9 @@ nodeid(Host, Node) ->
{selected, ["nodeid"], [{NodeId}]} ->
{result, NodeId};
{'EXIT', _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, 'internal_server_error'};
_ ->
- {error, ?ERR_ITEM_NOT_FOUND}
+ {error, 'item_not_found'}
end.
nodeowners(NodeId) ->
diff --git a/src/mod_pubsub/nodetree_virtual.erl b/src/mod_pubsub/nodetree_virtual.erl
index ec35b91d9..5dddd4aab 100644
--- a/src/mod_pubsub/nodetree_virtual.erl
+++ b/src/mod_pubsub/nodetree_virtual.erl
@@ -26,15 +26,16 @@
%%% @doc The module {@module} is the PubSub node tree plugin that
%%% allow virtual nodes handling.
%%% PubSub node tree plugins are using the {@link gen_nodetree} behaviour.
-%%% This plugin development is still a work in progress. Due to optimizations in
+%%% The development of this plugin 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.
-module(nodetree_virtual).
-author('christophe.romain@process-one.net').
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("pubsub.hrl").
--include("jlib.hrl").
-behaviour(gen_pubsub_nodetree).
@@ -47,8 +48,6 @@
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,
@@ -88,23 +87,17 @@ set_node(_NodeRecord) ->
%% @spec (Host, Node, From) -> pubsubNode()
%% Host = mod_pubsub:host()
%% Node = mod_pubsub:pubsubNode()
-%% From = mod_pubsub:jid()
%% @doc Virtual node tree does not handle a node database. Any node is considered
%% as existing. Node record contains default values.
get_node(Host, Node, _From) ->
get_node(Host, Node).
get_node(Host, Node) ->
- get_node({Host, Node}).
+ #pubsub_node{nodeid = {Host, Node}, id = {Host, Node}, owners = [{undefined, list_to_binary(Host), undefined}]}.
get_node({Host, _} = NodeId) ->
- Record = #pubsub_node{nodeid = NodeId, id = NodeId},
- Module = list_to_atom("node_" ++ Record#pubsub_node.type),
- Options = Module:options(),
- Owners = [{"", Host, ""}],
- Record#pubsub_node{owners = Owners, options = Options}.
+ #pubsub_node{nodeid = NodeId, id = NodeId, owners = [{undefined, list_to_binary(Host), undefined}]}.
%% @spec (Host, From) -> [pubsubNode()]
%% Host = mod_pubsub:host() | mod_pubsub:jid()
-%% From = mod_pubsub:jid()
%% @doc Virtual node tree does not handle a node database. Any node is considered
%% as existing. Nodes list can not be determined.
get_nodes(Host, _From) ->
@@ -112,22 +105,6 @@ get_nodes(Host, _From) ->
get_nodes(_Host) ->
[].
-%% @spec (Host, Node, From) -> [pubsubNode()]
-%% Host = mod_pubsub:host()
-%% Node = mod_pubsub:pubsubNode()
-%% From = mod_pubsub:jid()
-%% @doc Virtual node tree does not handle parent/child. Child list is empty.
-get_parentnodes(_Host, _Node, _From) ->
- [].
-
-%% @spec (Host, Node, From) -> [pubsubNode()]
-%% Host = mod_pubsub:host()
-%% Node = mod_pubsub:pubsubNode()
-%% From = mod_pubsub:jid()
-%% @doc Virtual node tree does not handle parent/child. Child list is empty.
-get_parentnodes_tree(_Host, _Node, _From) ->
- [].
-
%% @spec (Host, Node, From) -> [pubsubNode()]
%% Host = mod_pubsub:host()
%% Node = mod_pubsub:pubsubNode()
@@ -138,10 +115,9 @@ get_subnodes(Host, Node, _From) ->
get_subnodes(_Host, _Node) ->
[].
-%% @spec (Host, Node, From) -> [pubsubNode()]
+%% @spec (Host, Index, From) -> [pubsubNode()]
%% Host = mod_pubsub:host()
%% Node = mod_pubsub:pubsubNode()
-%% From = mod_pubsub:jid()
%% @doc Virtual node tree does not handle parent/child. Child list is empty.
get_subnodes_tree(Host, Node, _From) ->
get_subnodes_tree(Host, Node).
@@ -157,8 +133,13 @@ get_subnodes_tree(_Host, _Node) ->
%% @doc No node record is stored on database. Any valid node
%% is considered as already created.
%% default allowed nodes: /home/host/user/any/node/name
-create_node(Host, Node, _Type, _Owner, _Options, _Parents) ->
- {error, {virtual, {Host, Node}}}.
+create_node(Host, Node, _Type, Owner, _Options, _Parents) ->
+ UserName = exmpp_jid:prep_node_as_list(Owner),
+ UserHost = exmpp_jid:prep_domain_as_list(Owner),
+ case Node of
+ ["home", UserHost, UserName | _] -> {error, {virtual, {Host, Node}}};
+ _ -> {error, 'not-allowed'}
+ end.
%% @spec (Host, Node) -> [mod_pubsub:node()]
%% Host = mod_pubsub:host()
diff --git a/src/mod_pubsub/pubsub.hrl b/src/mod_pubsub/pubsub.hrl
index c1ce99b5e..e437c979c 100644
--- a/src/mod_pubsub/pubsub.hrl
+++ b/src/mod_pubsub/pubsub.hrl
@@ -91,7 +91,7 @@
%%% This is the format of the nodes table. The type of the table
%%% is: set,ram/disc.
%%% The parentid and type fields are indexed.
-%%% nodeidx can be anything you want.
+%%% nodeidx can be anything you want.
-record(pubsub_node, {nodeid,
id,
parents = [],
@@ -126,7 +126,6 @@
payload = []
}).
-
%% @type pubsubSubscription() = #pubsub_subscription{
%% subid = string(),
%% state_key = {ljid(), pubsubNodeId()},
diff --git a/src/mod_pubsub/pubsub_db_odbc.erl b/src/mod_pubsub/pubsub_db_odbc.erl
index 3df26c171..f8afb4361 100644
--- a/src/mod_pubsub/pubsub_db_odbc.erl
+++ b/src/mod_pubsub/pubsub_db_odbc.erl
@@ -30,9 +30,9 @@
update_subscription/1]).
-%% TODO: Those -spec lines produce errors in old Erlang versions.
+%% Those -spec lines produce errors in old Erlang versions.
%% They can be enabled again in ejabberd 3.0 because it uses R12B or higher.
-%% -spec read_subscription(SubID :: string()) -> {ok, #pubsub_subscription{}} | notfound.
+-spec read_subscription(SubID :: string()) -> {ok, #pubsub_subscription{}} | notfound.
read_subscription(SubID) ->
case ejabberd_odbc:sql_query_t(
["select opt_name, opt_value "
@@ -49,19 +49,19 @@ read_subscription(SubID) ->
-%% -spec delete_subscription(SubID :: string()) -> ok.
+-spec delete_subscription(SubID :: string()) -> ok.
delete_subscription(SubID) ->
ejabberd_odbc:sql_query_t(["delete from pubsub_subscription_opt "
"where subid = '", ejabberd_odbc:escape(SubID), "'"]),
ok.
-%% -spec update_subscription(#pubsub_subscription{}) -> ok .
+-spec update_subscription(#pubsub_subscription{}) -> ok .
update_subscription(#pubsub_subscription{subid = SubId} = Sub) ->
delete_subscription(SubId),
add_subscription(Sub).
-%% -spec add_subscription(#pubsub_subscription{}) -> ok.
+-spec add_subscription(#pubsub_subscription{}) -> ok.
add_subscription(#pubsub_subscription{subid = SubId, options = Opts}) ->
EscapedSubId = ejabberd_odbc:escape(SubId),
lists:foreach(fun(Opt) ->
diff --git a/src/mod_pubsub/pubsub_odbc.patch b/src/mod_pubsub/pubsub_odbc.patch
index a23147bc5..0580f7592 100644
--- a/src/mod_pubsub/pubsub_odbc.patch
+++ b/src/mod_pubsub/pubsub_odbc.patch
@@ -1,5 +1,5 @@
---- mod_pubsub.erl 2009-10-20 16:33:47.000000000 +0200
-+++ mod_pubsub_odbc.erl 2009-10-20 16:33:26.000000000 +0200
+--- mod_pubsub.erl 2009-10-21 10:28:28.000000000 +0200
++++ mod_pubsub_odbc.erl 2009-10-21 10:28:28.000000000 +0200
@@ -42,7 +42,7 @@
%%% 6.2.3.1, 6.2.3.5, and 6.3. For information on subscription leases see
%%% XEP-0060 section 12.18.
@@ -9,8 +9,8 @@
-author('christophe.romain@process-one.net').
-version('1.13-0').
-@@ -54,9 +54,9 @@
- -include("jlib.hrl").
+@@ -55,9 +55,9 @@
+ -include("adhoc.hrl").
-include("pubsub.hrl").
--define(STDTREE, "tree").
@@ -22,7 +22,7 @@
%% exports for hooks
-export([presence_probe/3,
-@@ -102,7 +102,7 @@
+@@ -103,7 +103,7 @@
string_to_affiliation/1,
extended_error/2,
extended_error/3,
@@ -31,7 +31,7 @@
]).
%% API and gen_server callbacks
-@@ -121,7 +121,7 @@
+@@ -122,7 +122,7 @@
-export([send_loop/1
]).
@@ -40,7 +40,7 @@
-define(PLUGIN_PREFIX, "node_").
-define(TREE_PREFIX, "nodetree_").
-@@ -215,8 +215,6 @@
+@@ -224,8 +224,6 @@
ok
end,
ejabberd_router:register_route(Host),
@@ -49,7 +49,7 @@
init_nodes(Host, ServerHost, NodeTree, Plugins),
State = #state{host = Host,
server_host = ServerHost,
-@@ -269,207 +267,14 @@
+@@ -278,206 +276,15 @@
init_nodes(Host, ServerHost, _NodeTree, Plugins) ->
%% TODO, this call should be done plugin side
@@ -57,9 +57,9 @@
+ case lists:member("hometree_odbc", 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");
+- create_node(Host, ServerHost, string_to_node("/home" ++ ServerHost), service_jid(Host), "hometree");
+ 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");
++ create_node(Host, ServerHost, string_to_node("/home/" ++ ServerHost), service_jid(Host), "hometree_odbc");
false ->
ok
end.
@@ -192,26 +192,26 @@
- 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).
+- 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) ->
@@ -256,11 +256,11 @@
- _ ->
- ok
- end.
--
++
+
send_queue(State, Msg) ->
Pid = State#state.send_loop,
- case is_process_alive(Pid) of
-@@ -492,17 +297,15 @@
+@@ -501,17 +308,15 @@
%% 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) ->
@@ -284,7 +284,17 @@
true ->
% resource not concerned about that subscription
ok
-@@ -825,10 +628,10 @@
+@@ -692,8 +497,7 @@
+ end;
+
+ disco_sm_items(Acc, From, To, NodeB, _Lang) ->
+- SNode = binary_to_list(NodeB),
+- Node = string_to_node(SNode),
++ Node = string_to_node(binary_to_list(NodeB)),
+ %% TODO, use iq_disco_items(Host, Node, From)
+ Host = exmpp_jid:prep_domain_as_list(To),
+ LJID = jlib:short_prepd_bare_jid(To),
+@@ -841,10 +645,10 @@
{result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Subscriber]),
lists:foreach(fun
({Node, subscribed, _, JID}) ->
@@ -297,17 +307,22 @@
true ->
node_action(Host, Type, unsubscribe_node, [NodeId, Subscriber, JID, all]);
false ->
-@@ -943,7 +746,8 @@
- sub_el = SubEl} = IQ ->
- {xmlelement, _, QAttrs, _} = SubEl,
- Node = xml:get_attr_s("node", QAttrs),
+@@ -963,11 +767,12 @@
+ end,
+ ejabberd_router:route(To, From, Res);
+ #iq{type = get, ns = ?NS_DISCO_ITEMS,
+- payload = SubEl} ->
++ payload = SubEl} = IQ ->
+ QAttrs = SubEl#xmlel.attrs,
+ Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs,
+ 'node', ""),
- Res = case iq_disco_items(Host, Node, From) of
-+ Rsm = jlib:rsm_decode(IQ),
++ 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,
-@@ -1048,7 +852,7 @@
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS,
+ name = 'query', attrs = QAttrs,
+@@ -1070,7 +875,7 @@
[] ->
["leaf"]; %% No sub-nodes: it's a leaf node
_ ->
@@ -316,27 +331,27 @@
{result, []} -> ["collection"];
{result, _} -> ["leaf", "collection"];
_ -> []
-@@ -1064,8 +868,9 @@
+@@ -1086,8 +891,9 @@
[];
true ->
- [{xmlelement, "feature", [{"var", ?NS_PUBSUB}], []} |
+ [#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]} |
- lists:map(fun(T) ->
-- {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []}
+- #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++T)]}
+ lists:map(fun
-+ ("rsm")-> {xmlelement, "feature", [{"var", ?NS_RSM}], []};
-+ (T) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []}
++ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
++ (T) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++T)]}
end, features(Type))]
end,
%% TODO: add meta-data info (spec section 5.4)
-@@ -1093,21 +898,22 @@
- {xmlelement, "feature", [{"var", ?NS_DISCO_ITEMS}], []},
- {xmlelement, "feature", [{"var", ?NS_PUBSUB}], []},
- {xmlelement, "feature", [{"var", ?NS_VCARD}], []}] ++
+@@ -1115,22 +921,23 @@
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_DISCO_ITEMS_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_VCARD_s)]}] ++
- lists:map(fun(Feature) ->
-- {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++Feature}], []}
+- #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++Feature)]}
+ lists:map(fun
-+ ("rsm")-> {xmlelement, "feature", [{"var", ?NS_RSM}], []};
-+ (T) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []}
++ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
++ (Feature) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++Feature)]}
end, features(Host, Node))};
_ ->
node_disco_info(Host, Node, From)
@@ -346,16 +361,21 @@
+iq_disco_items(Host, [], From, _RSM) ->
{result, lists:map(
fun(#pubsub_node{nodeid = {_, SubNode}, type = Type}) ->
- {result, Path} = node_call(Type, node_to_path, [SubNode]),
- [Name|_] = lists:reverse(Path),
- {xmlelement, "item", [{"jid", Host}, {"name", Name}|nodeAttr(SubNode)], []}
- end, tree_action(Host, get_subnodes, [Host, <<>>, From]))};
+- {result, Path} = node_call(Type, node_to_path, [SubNode]),
+- [Name | _] = lists:reverse(Path),
++ {result, Path} = node_call(Type, node_path, [SubNode]),
++ [Name | _] = lists:reverse(Path),
+ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host),
+- ?XMLATTR('name', Name) | nodeAttr(SubNode)]}
+- end, tree_action(Host, get_subnodes, [Host, [], From]))};
-iq_disco_items(Host, Item, From) ->
++ ?XMLATTR('name', Name) | nodeAttr(SubNode)]}
++ end, tree_action(Host, get_subnodes, [Host, <<>>, From]))};
+iq_disco_items(Host, Item, From, RSM) ->
case string:tokens(Item, "!") of
[_SNode, _ItemID] ->
{result, []};
-@@ -1115,10 +921,10 @@
+@@ -1138,10 +945,10 @@
Node = string_to_node(SNode),
Action =
fun(#pubsub_node{type = Type, id = NodeId}) ->
@@ -369,85 +389,115 @@
end,
Nodes = lists:map(
fun(#pubsub_node{nodeid = {_, SubNode}}) ->
-@@ -1129,7 +935,7 @@
- {result, Name} = node_call(Type, get_item_name, [Host, Node, RN]),
- {xmlelement, "item", [{"jid", Host}, {"name", Name}], []}
+@@ -1150,9 +957,10 @@
+ Items = lists:map(
+ fun(#pubsub_item{itemid = {RN, _}}) ->
+ {result, Name} = node_call(Type, get_item_name, [Host, Node, RN]),
+- #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host), ?XMLATTR('name', Name)]}
++ #xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host),
++ ?XMLATTR('name', Name)]}
end, NodeItems),
- {result, Nodes ++ Items}
+ {result, Nodes ++ Items ++ jlib:rsm_encode(RsmOut)}
end,
case transaction(Host, Node, Action, sync_dirty) of
{result, {_, Result}} -> {result, Result};
-@@ -1258,7 +1064,8 @@
+@@ -1208,7 +1016,7 @@
+ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
+ case exmpp_xml:remove_cdata_from_list(SubEl#xmlel.children) of
+ [#xmlel{name = Name, attrs = Attrs, children = Els} | Rest] ->
+- Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(attrs, 'node', false)),
++ Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', false)),
+ case {IQType, Name} of
+ {set, 'create'} ->
+ Config = case Rest of
+@@ -1283,7 +1091,8 @@
(_, Acc) ->
Acc
- end, [], xml:remove_cdata(Els)),
+ end, [], exmpp_xml:remove_cdata_from_list(Els)),
- get_items(Host, Node, From, SubId, MaxItems, ItemIDs);
+ RSM = jlib:rsm_decode(SubEl),
-+ get_items(Host, Node, From, SubId, MaxItems, ItemIDs, RSM);
- {get, "subscriptions"} ->
++ get_items(Host, Node, From, SubId, MaxItems, ItemIDs, RSM);
+ {get, 'subscriptions'} ->
get_subscriptions(Host, Node, From, Plugins);
- {get, "affiliations"} ->
-@@ -1281,7 +1088,9 @@
+ {get, 'affiliations'} ->
+@@ -1305,8 +1114,9 @@
+ end.
iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) ->
- {xmlelement, _, _, SubEls} = SubEl,
-- Action = xml:remove_cdata(SubEls),
-+ Action = lists:filter(fun({xmlelement, "set", _, _}) -> false;
-+ (_) -> true
-+ end, xml:remove_cdata(SubEls)),
+- SubEls = SubEl#xmlel.children,
+- Action = exmpp_xml:remove_cdata_from_list(SubEls),
++ Action = lists:filter(fun(#xmlel{name = 'set'}) -> false;
++ (_) -> true
++ end, exmpp_xml:get_child_elements(SubEl)),
case Action of
- [{xmlelement, Name, Attrs, Els}] ->
- Node = string_to_node(xml:get_attr_s("node", Attrs)),
-@@ -1404,7 +1213,8 @@
+ [#xmlel{name = Name, attrs = Attrs, children = Els}] ->
+ Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', "")),
+@@ -1433,7 +1243,8 @@
_ -> []
end
end,
- case transaction(fun () -> {result, lists:flatmap(Tr, Plugins)} end,
-+ case transaction(Host,
-+ fun () -> {result, lists:flatmap(Tr, Plugins)} end,
++ case transaction(Host,
++ fun () -> {result, lists:flatmap(Tr, Plugins)} end,
sync_dirty) of
{result, Res} -> Res;
Err -> Err
-@@ -1444,7 +1254,7 @@
+@@ -1478,7 +1289,7 @@
%%% authorization handling
-send_authorization_request(#pubsub_node{owners = Owners, nodeid = {Host, Node}}, Subscriber) ->
+send_authorization_request(#pubsub_node{nodeid = {Host, Node}, type = Type, id = NodeId}, Subscriber) ->
Lang = "en", %% TODO fix
- Stanza = {xmlelement, "message",
- [],
-@@ -1473,7 +1283,7 @@
- [{xmlelement, "value", [], [{xmlcdata, "false"}]}]}]}]},
+ {U, S, R} = Subscriber,
+ Stanza = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', children =
+@@ -1508,7 +1319,7 @@
lists:foreach(fun(Owner) ->
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(Owner), Stanza}
+ {U, S, R} = Owner,
+ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(U, S, R), Stanza}
- end, Owners).
+ end, node_owners(Host, Type, NodeId)).
find_authorization_response(Packet) ->
- {xmlelement, _Name, _Attrs, Els} = Packet,
-@@ -1537,8 +1347,8 @@
+ Els = Packet#xmlel.children,
+@@ -1550,7 +1361,7 @@
+ end,
+ Stanza = event_stanza(
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'subscription', attrs =
+- [ ?XMLATTR('jid', exmpp_jid:to_binary(JID)) | nodeAttr(SNode)] ++ SubAttrs
++ [?XMLATTR('jid', exmpp_jid:to_binary(JID)) | nodeAttr(SNode)] ++ SubAttrs
+ }]),
+ ejabberd_router ! {route, service_jid(Host), JID, Stanza}.
+
+@@ -1561,14 +1372,14 @@
+ {{value, {_, [SNode]}}, {value, {_, [SSubscriber]}},
+ {value, {_, [SAllow]}}} ->
+ Node = string_to_node(SNode),
+- Subscriber = exmpp_jid:parse(SSubscriber),
++ Subscriber = exmpp_jid:parse(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),
+- IsApprover = lists:member(jlib:short_prepd_bare_jid(From), Owners),
+ Action = fun(#pubsub_node{type = Type, id = NodeId}) ->
-+ IsApprover = lists:member(jlib:jid_tolower(jlib:jid_remove_resource(From)), node_owners_call(Type, NodeId)),
++ IsApprover = lists:member(jlib:short_prepd_bare_jid(From), node_owners_call(Type, NodeId)),
{result, Subscriptions} = node_call(Type, get_subscriptions, [NodeId, Subscriber]),
if
not IsApprover ->
-@@ -1729,7 +1539,7 @@
- Reply = [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}],
- [{xmlelement, "create", nodeAttr(Node),
- []}]}],
+@@ -1763,7 +1574,7 @@
+ end,
+ Reply = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'create', attrs = nodeAttr(Node)}]},
- case transaction(CreateNode, transaction) of
+ case transaction(Host, CreateNode, transaction) of
{result, {Result, broadcast}} ->
%%Lang = "en", %% TODO: fix
%%OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
-@@ -1837,7 +1647,7 @@
+@@ -1872,7 +1683,7 @@
%%The node does not exist.
%%
subscribe_node(Host, Node, From, JID, Configuration) ->
@@ -456,33 +506,33 @@
{result, GoodSubOpts} -> GoodSubOpts;
_ -> invalid
end,
-@@ -1845,7 +1655,7 @@
- error -> {"", "", ""};
- J -> jlib:jid_tolower(J)
- end,
+@@ -1883,7 +1694,7 @@
+ {undefined, undefined, undefined}
+ end,
+ SubId = uniqid(),
- Action = fun(#pubsub_node{options = Options, owners = [Owner|_], type = Type, id = NodeId}) ->
+ Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId}) ->
Features = features(Type),
SubscribeFeature = lists:member("subscribe", Features),
OptionsFeature = lists:member("subscription-options", Features),
-@@ -1864,9 +1674,13 @@
+@@ -1902,9 +1713,13 @@
{"", "", ""} ->
{false, false};
_ ->
- {OU, OS, _} = Owner,
- get_roster_info(OU, OS,
- Subscriber, AllowedGroups)
-+ case node_owners_call(Type, NodeId) of
-+ [{OU, OS, _}|_] ->
-+ get_roster_info(OU, OS,
-+ Subscriber, AllowedGroups);
-+ _ ->
-+ {false, false}
-+ end
++ case node_owners_call(Type, NodeId) of
++ [{OU, OS, _} | _] ->
++ get_roster_info(OU, OS,
++ Subscriber, AllowedGroups);
++ _ ->
++ {false, false}
++ end
end
end,
if
-@@ -2197,7 +2011,7 @@
+@@ -2237,7 +2052,7 @@
%% 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.
@@ -491,7 +541,7 @@
MaxItems =
if
SMaxItems == "" -> get_max_items_node(Host);
-@@ -2236,11 +2050,11 @@
+@@ -2276,11 +2091,11 @@
node_call(Type, get_items,
[NodeId, From,
AccessModel, PresenceSubscription, RosterGroup,
@@ -501,21 +551,20 @@
end,
case transaction(Host, Node, Action, sync_dirty) of
- {result, {_, Items}} ->
-+ {result, {_, {Items, RSMOut}}} ->
++ {result, {_, Items, RSMOut}} ->
SendItems = case ItemIDs of
[] ->
Items;
-@@ -2253,7 +2067,8 @@
+@@ -2293,7 +2108,7 @@
%% 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)]}]};
+ {result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
+ [#xmlel{ns = ?NS_PUBSUB, name = 'items', attrs = nodeAttr(Node), children =
+- itemsEls(lists:sublist(SendItems, MaxItems))}]}};
++ itemsEls(lists:sublist(SendItems, MaxItems))} | jlib:rsm_encode(RSMOut)]}};
Error ->
Error
end
-@@ -2285,16 +2100,27 @@
+@@ -2325,17 +2140,29 @@
%% @doc Resend the items of a node to the user.
%% @todo use cache-last-item feature
send_items(Host, Node, NodeId, Type, LJID, last) ->
@@ -527,31 +576,34 @@
+ case node_action(Host, Type, get_last_items, [NodeId, LJID, 1]) of
+ {result, [LastItem]} ->
+ {ModifNow, ModifLjid} = LastItem#pubsub_item.modification,
-+ event_stanza_with_delay(
-+ [{xmlelement, "items", nodeAttr(Node),
-+ itemsEls([LastItem])}], ModifNow, ModifLjid);
++ event_stanza_with_delay([#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items',
++ attrs = nodeAttr(Node),
++ children = itemsEls([])}],
++ ModifNow, ModifLjid);
+ _ ->
-+ event_stanza(
-+ [{xmlelement, "items", nodeAttr(Node),
-+ itemsEls([])}])
++ event_stanza([#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items',
++ attrs = nodeAttr(Node),
++ children = itemsEls([])}])
+ end;
LastItem ->
{ModifNow, ModifLjid} = LastItem#pubsub_item.modification,
- Stanza = event_stanza_with_delay(
+ event_stanza_with_delay(
- [{xmlelement, "items", nodeAttr(Node),
-- itemsEls([LastItem])}], ModifNow, ModifLjid),
-- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(LJID), Stanza}
+ [#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node),
+- children = itemsEls(LastItem)}], ModifNow, ModifLjid),
+- {U, S, R} = LJID,
+- ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(U, S, R), Stanza}
- end;
-+ itemsEls([LastItem])}], ModifNow, ModifLjid)
++ children = itemsEls(LastItem)}], ModifNow, ModifLjid)
+ end,
-+ ejabberd_router ! {route, service_jid(Host), jlib:make_jid(LJID), Stanza};
- send_items(Host, Node, NodeId, Type, LJID, Number) ->
++ {U, S, R} = LJID,
++ ejabberd_router ! {route, service_jid(Host), exmpp_jid:make(U, S, R), Stanza};
+ send_items(Host, Node, NodeId, Type, {LU, LS, LR} = LJID, Number) ->
ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of
{result, []} ->
-@@ -2420,29 +2246,12 @@
+@@ -2464,29 +2291,12 @@
error ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
_ ->
- Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}=N) ->
- case lists:member(Owner, Owners) of
@@ -560,14 +612,14 @@
true ->
lists:foreach(
fun({JID, Affiliation}) ->
-- node_call(Type, set_affiliation, [NodeId, JID, Affiliation]),
+- {result, _} = node_call(Type, set_affiliation, [NodeId, JID, Affiliation]),
- case Affiliation of
- owner ->
-- NewOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
+- NewOwner = jlib:short_prepd_bare_jid(JID),
- NewOwners = [NewOwner|Owners],
- tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]);
- none ->
-- OldOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
+- OldOwner = jlib:short_prepd_bare_jid(JID),
- case lists:member(OldOwner, Owners) of
- true ->
- NewOwners = Owners--[OldOwner],
@@ -578,25 +630,25 @@
- _ ->
- ok
- end
-+ node_call(Type, set_affiliation, [NodeId, JID, Affiliation])
++ node_call(Type, set_affiliation, [NodeId, JID, Affiliation])
end, Entities),
- {result, []};
- _ ->
-@@ -2495,11 +2304,11 @@
+ {result, []};
+ _ ->
+@@ -2541,11 +2351,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")};
+ {error, extended_error('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]},
-@@ -2525,7 +2334,7 @@
+- {result, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options),
++ {result, XdataEl} = pubsub_subscription_odbc:get_options_xform(Lang, Options),
+ OptionsEl = #xmlel{ns = ?NS_PUBSUB, name = 'options',
+ attrs = [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)),
+ ?XMLATTR('Subid', SubID) | nodeAttr(Node)],
+@@ -2572,7 +2382,7 @@
end.
set_options_helper(Configuration, JID, NodeID, SubID, Type) ->
@@ -605,18 +657,18 @@
{result, GoodSubOpts} -> GoodSubOpts;
_ -> invalid
end,
-@@ -2554,7 +2363,7 @@
+@@ -2602,7 +2412,7 @@
write_sub(_Subscriber, _NodeID, _SubID, invalid) ->
- {error, extended_error(?ERR_BAD_REQUEST, "invalid-options")};
+ {error, extended_error('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")};
+ {error, extended_error('not-acceptable', "invalid-subid")};
{result, _} ->
-@@ -2722,8 +2531,8 @@
- {"subscription", subscription_to_string(Sub)} | nodeAttr(Node)], []}]}]},
- ejabberd_router ! {route, service_jid(Host), jlib:make_jid(JID), Stanza}
+@@ -2775,8 +2585,8 @@
+ ?XMLATTR('subsription', subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
+ ejabberd_router ! {route, service_jid(Host), JID, Stanza}
end,
- Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}) ->
- case lists:member(Owner, Owners) of
@@ -625,7 +677,7 @@
true ->
Result = lists:foldl(fun({JID, Subscription, SubId}, Acc) ->
-@@ -3007,7 +2816,7 @@
+@@ -3066,7 +2876,7 @@
{Depth, [{N, get_node_subs(N)} || N <- Nodes]}
end, tree_call(Host, get_parentnodes_tree, [Host, Node, service_jid(Host)]))}
end,
@@ -634,7 +686,7 @@
{result, CollSubs} -> CollSubs;
_ -> []
end.
-@@ -3021,9 +2830,9 @@
+@@ -3080,9 +2890,9 @@
get_options_for_subs(NodeID, Subs) ->
lists:foldl(fun({JID, subscribed, SubID}, Acc) ->
@@ -646,7 +698,16 @@
_ -> Acc
end;
(_, Acc) ->
-@@ -3221,6 +3030,30 @@
+@@ -3090,7 +2900,7 @@
+ end, [], Subs).
+
+ % TODO: merge broadcast code that way
+-% TODO: pablo: Why is this commented? Seems to be present on trunk.
++% TODO: pablo: why is this commented?
+ %broadcast(Host, Node, NodeId, Type, NodeOptions, Feature, Force, ElName, SubEls) ->
+ % case (get_option(NodeOptions, Feature) or Force) of
+ % true ->
+@@ -3282,6 +3092,30 @@
Result
end.
@@ -677,22 +738,22 @@
%% @spec (Host, Options) -> MaxItems
%% Host = host()
%% Options = [Option]
-@@ -3607,7 +3440,13 @@
+@@ -3671,7 +3505,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;
++ Result;
+ {aborted, Reason} ->
-+ ?ERROR_MSG("transaction return internal error: ~p~n",[{aborted, Reason}]),
-+ {error, ?ERR_INTERNAL_SERVER_ERROR}
++ ?ERROR_MSG("transaction return internal error: ~p~n",[{aborted, Reason}]),
++ {error, 'internal-server-error'}
+ end.
%% @doc node plugin call.
node_call(Type, Function, Args) ->
-@@ -3627,13 +3466,13 @@
+@@ -3691,13 +3531,13 @@
node_action(Host, Type, Function, Args) ->
?DEBUG("node_action ~p ~p ~p ~p",[Host,Type,Function,Args]),
@@ -708,7 +769,7 @@
case tree_call(Host, get_node, [Host, Node]) of
N when is_record(N, pubsub_node) ->
case Action(N) of
-@@ -3646,8 +3485,14 @@
+@@ -3710,8 +3550,15 @@
end
end, Trans).
@@ -716,33 +777,34 @@
- 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,
++ 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};
-@@ -3655,6 +3500,15 @@
+@@ -3719,6 +3566,15 @@
{aborted, Reason} ->
?ERROR_MSG("transaction return internal error: ~p~n", [{aborted, Reason}]),
- {error, ?ERR_INTERNAL_SERVER_ERROR};
+ {error, '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};
++ {error, '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};
-@@ -3663,6 +3517,17 @@
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'};
+@@ -3727,6 +3583,16 @@
+ {error, 'internal-server-error'}
end.
+odbc_conn({_U, Host, _R})->
@@ -752,10 +814,9 @@
+
+%% escape value for database storage
+escape({_U, _H, _R}=JID)->
-+ ejabberd_odbc:escape(jlib:jid_to_string(JID));
++ ejabberd_odbc:escape(exmpp_jid:to_list(JID));
+escape(Value)->
+ ejabberd_odbc:escape(Value).
-+
%%%% helpers
%% Add pubsub-specific error element
diff --git a/src/mod_pubsub/pubsub_subscription.erl b/src/mod_pubsub/pubsub_subscription.erl
index 15efd9f86..eacc63d16 100644
--- a/src/mod_pubsub/pubsub_subscription.erl
+++ b/src/mod_pubsub/pubsub_subscription.erl
@@ -39,7 +39,7 @@
write_subscription/4]).
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-define(PUBSUB_DELIVER, "pubsub#deliver").
-define(PUBSUB_DIGEST, "pubsub#digest").
@@ -90,50 +90,57 @@ init() ->
ok = create_table().
subscribe_node(JID, NodeID, Options) ->
- case catch mnesia:sync_dirty(fun add_subscription/3,
+ try mnesia:sync_dirty(fun add_subscription/3,
[JID, NodeID, Options]) of
- {'EXIT', {aborted, Error}} -> Error;
{error, Error} -> {error, Error};
Result -> {result, Result}
+ catch
+ Error -> Error
end.
unsubscribe_node(JID, NodeID, SubID) ->
- case catch mnesia:sync_dirty(fun delete_subscription/3,
+ try mnesia:sync_dirty(fun delete_subscription/3,
[JID, NodeID, SubID]) of
- {'EXIT', {aborted, Error}} -> Error;
{error, Error} -> {error, Error};
Result -> {result, Result}
+ catch
+ Error -> Error
end.
get_subscription(JID, NodeID, SubID) ->
- case catch mnesia:sync_dirty(fun read_subscription/3,
+ try mnesia:sync_dirty(fun read_subscription/3,
[JID, NodeID, SubID]) of
- {'EXIT', {aborted, Error}} -> Error;
{error, Error} -> {error, Error};
Result -> {result, Result}
+ catch
+ Error -> Error
end.
set_subscription(JID, NodeID, SubID, Options) ->
- case catch mnesia:sync_dirty(fun write_subscription/4,
+ try mnesia:sync_dirty(fun write_subscription/4,
[JID, NodeID, SubID, Options]) of
- {'EXIT', {aborted, Error}} -> Error;
{error, Error} -> {error, Error};
Result -> {result, Result}
+ catch
+ Error -> Error
end.
get_options_xform(Lang, Options) ->
Keys = [deliver, show_values, subscription_type, subscription_depth],
XFields = [get_option_xfield(Lang, Key, Options) || Key <- Keys],
- {result, {xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [{xmlelement, "field", [{"var", "FORM_TYPE"}, {"type", "hidden"}],
- [{xmlelement, "value", [],
- [{xmlcdata, ?NS_PUBSUB_SUB_OPTIONS}]}]}] ++ XFields}}.
+ {result, #xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
+ [#xmlel{ns = ?NS_DATA_FORMS,
+ name = 'field',
+ attrs = [?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)],
+ children = [#xmlel{ns = ?NS_DATA_FORMS,
+ name = 'value',
+ children = [?XMLCDATA(?NS_PUBSUB_SUBSCRIBE_OPTIONS_s)]}]}] ++ XFields}}.
parse_options_xform(XFields) ->
- case xml:remove_cdata(XFields) of
+ case exmpp_xml:get_child_elements(XFields) of
[] -> {result, []};
- [{xmlelement, "x", _Attrs, _Els} = XEl] ->
+ [#xmlel{name = 'x'} = XEl] ->
case jlib:parse_xdata_submit(XEl) of
XData when is_list(XData) ->
case set_xoption(XData, []) of
@@ -226,7 +233,7 @@ val_xfield(subscription_depth, ["all"]) -> all;
val_xfield(subscription_depth, [Depth]) ->
case catch list_to_integer(Depth) of
N when is_integer(N) -> N;
- _ -> {error, ?ERR_NOT_ACCEPTABLE}
+ _ -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'not-acceptable')}
end.
%% Convert XForm booleans to Erlang booleans.
@@ -234,7 +241,7 @@ xopt_to_bool("0") -> false;
xopt_to_bool("1") -> true;
xopt_to_bool("false") -> false;
xopt_to_bool("true") -> true;
-xopt_to_bool(_) -> {error, ?ERR_NOT_ACCEPTABLE}.
+xopt_to_bool(_) -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'not-acceptable')}.
%% Return a field for an XForm for Key, with data filled in, if
%% applicable, from Options.
@@ -248,10 +255,10 @@ get_option_xfield(Lang, Key, Options) ->
false ->
[]
end,
- {xmlelement, "field",
- [{"var", Var}, {"type", Type},
- {"label", translate:translate(Lang, Label)}],
- OptEls ++ Vals}.
+ #xmlel{ns = ?NS_DATA_FORMS,
+ name = 'field',
+ attrs = [?XMLATTR('var', Var), ?XMLATTR('type', Type), ?XMLATTR('label', translate:translate(Lang, Label))],
+ children = OptEls ++ Vals}.
type_and_options({Type, Options}, Lang) ->
{Type, [tr_xfield_options(O, Lang) || O <- Options]};
@@ -259,12 +266,15 @@ type_and_options(Type, _Lang) ->
{Type, []}.
tr_xfield_options({Value, Label}, Lang) ->
- {xmlelement, "option",
- [{"label", translate:translate(Lang, Label)}], [{xmlelement, "value", [],
- [{xmlcdata, Value}]}]}.
+ #xmlel{ns = ?NS_DATA_FORMS,
+ name = 'option',
+ attrs = [?XMLATTR('label', transalte:translate(Lang, Label))],
+ children = [#xmlel{ns = ?NS_DATA_FORMS,
+ name = 'value',
+ children = [?XMLCDATA(Value)]}]}.
tr_xfield_values(Value) ->
- {xmlelement, "value", [], [{xmlcdata, Value}]}.
+ #xmlel{ns = ?NS_DATA_FORMS, name ='value', children = [?XMLCDATA(Value)]}.
%% Return the XForm variable name for a subscription option key.
xfield_var(deliver) -> ?PUBSUB_DELIVER;
diff --git a/src/mod_pubsub/pubsub_subscription_odbc.erl b/src/mod_pubsub/pubsub_subscription_odbc.erl
index f05523081..4fb459424 100644
--- a/src/mod_pubsub/pubsub_subscription_odbc.erl
+++ b/src/mod_pubsub/pubsub_subscription_odbc.erl
@@ -33,8 +33,11 @@
get_options_xform/2,
parse_options_xform/1]).
+
+-include_lib("stdlib/include/qlc.hrl").
+
-include("pubsub.hrl").
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
-define(PUBSUB_DELIVER, "pubsub#deliver").
-define(PUBSUB_DIGEST, "pubsub#digest").
@@ -78,8 +81,8 @@
-define(SUBSCRIPTION_DEPTH_VALUE_ALL_LABEL,
"Receive notification from all descendent nodes").
-
-define(DB_MOD, pubsub_db_odbc).
+
%%====================================================================
%% API
%%====================================================================
@@ -91,7 +94,6 @@ subscribe_node(_JID, _NodeID, Options) ->
?DB_MOD:add_subscription(#pubsub_subscription{subid = SubID, options = Options}),
{result, SubID}.
-
unsubscribe_node(_JID, _NodeID, SubID) ->
case ?DB_MOD:read_subscription(SubID) of
{ok, Sub} ->
@@ -107,31 +109,32 @@ get_subscription(_JID, _NodeID, SubID) ->
notfound -> {error, notfound}
end.
-
set_subscription(_JID, _NodeID, SubID, Options) ->
case ?DB_MOD:read_subscription(SubID) of
{ok, _} ->
- ?DB_MOD:update_subscription(#pubsub_subscription{subid = SubID, options = Options}),
- {result, ok};
- notfound ->
- ?DB_MOD:add_subscription(#pubsub_subscription{subid = SubID, options = Options}),
- {result, ok}
+ ?DB_MOD:update_subscription(#pubsub_subscription{subid = SubID, options = Options}),
+ {result, ok};
+ notfound ->
+ ?DB_MOD:add_subscription(#pubsub_subscription{subid = SubID, options = Options}),
+ {result, ok}
end.
-
get_options_xform(Lang, Options) ->
Keys = [deliver, show_values, subscription_type, subscription_depth],
XFields = [get_option_xfield(Lang, Key, Options) || Key <- Keys],
- {result, {xmlelement, "x", [{"xmlns", ?NS_XDATA}],
- [{xmlelement, "field", [{"var", "FORM_TYPE"}, {"type", "hidden"}],
- [{xmlelement, "value", [],
- [{xmlcdata, ?NS_PUBSUB_SUB_OPTIONS}]}]}] ++ XFields}}.
+ {result, #xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
+ [#xmlel{ns = ?NS_DATA_FORMS,
+ name = 'field',
+ attrs = [?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)],
+ children = [#xmlel{ns = ?NS_DATA_FORMS,
+ name = 'value',
+ children = [?XMLCDATA(?NS_PUBSUB_SUBSCRIBE_OPTIONS_s)]}]}] ++ XFields}}.
parse_options_xform(XFields) ->
- case xml:remove_cdata(XFields) of
+ case exmpp_xml:get_child_elements(XFields) of
[] -> {result, []};
- [{xmlelement, "x", _Attrs, _Els} = XEl] ->
+ [#xmlel{name = 'x'} = XEl] ->
case jlib:parse_xdata_submit(XEl) of
XData when is_list(XData) ->
case set_xoption(XData, []) of
@@ -151,7 +154,6 @@ parse_options_xform(XFields) ->
create_table() ->
ok.
-
make_subid() ->
{T1, T2, T3} = now(),
lists:flatten(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])).
@@ -198,7 +200,7 @@ val_xfield(subscription_depth, ["all"]) -> all;
val_xfield(subscription_depth, [Depth]) ->
case catch list_to_integer(Depth) of
N when is_integer(N) -> N;
- _ -> {error, ?ERR_NOT_ACCEPTABLE}
+ _ -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'not-acceptable')}
end.
%% Convert XForm booleans to Erlang booleans.
@@ -206,7 +208,7 @@ xopt_to_bool("0") -> false;
xopt_to_bool("1") -> true;
xopt_to_bool("false") -> false;
xopt_to_bool("true") -> true;
-xopt_to_bool(_) -> {error, ?ERR_NOT_ACCEPTABLE}.
+xopt_to_bool(_) -> {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'not-acceptable')}.
%% Return a field for an XForm for Key, with data filled in, if
%% applicable, from Options.
@@ -220,10 +222,10 @@ get_option_xfield(Lang, Key, Options) ->
false ->
[]
end,
- {xmlelement, "field",
- [{"var", Var}, {"type", Type},
- {"label", translate:translate(Lang, Label)}],
- OptEls ++ Vals}.
+ #xmlel{ns = ?NS_DATA_FORMS,
+ name = 'field',
+ attrs = [?XMLATTR('var', Var), ?XMLATTR('type', Type), ?XMLATTR('label', translate:translate(Lang, Label))],
+ children = OptEls ++ Vals}.
type_and_options({Type, Options}, Lang) ->
{Type, [tr_xfield_options(O, Lang) || O <- Options]};
@@ -231,12 +233,15 @@ type_and_options(Type, _Lang) ->
{Type, []}.
tr_xfield_options({Value, Label}, Lang) ->
- {xmlelement, "option",
- [{"label", translate:translate(Lang, Label)}], [{xmlelement, "value", [],
- [{xmlcdata, Value}]}]}.
+ #xmlel{ns = ?NS_DATA_FORMS,
+ name = 'option',
+ attrs = [?XMLATTR('label', transalte:translate(Lang, Label))],
+ children = [#xmlel{ns = ?NS_DATA_FORMS,
+ name = 'value',
+ children = [?XMLCDATA(Value)]}]}.
tr_xfield_values(Value) ->
- {xmlelement, "value", [], [{xmlcdata, Value}]}.
+ #xmlel{ns = ?NS_DATA_FORMS, name ='value', children = [?XMLCDATA(Value)]}.
%% Return the XForm variable name for a subscription option key.
xfield_var(deliver) -> ?PUBSUB_DELIVER;
diff --git a/src/mod_register.erl b/src/mod_register.erl
index d8bcbbebd..d521369bd 100644
--- a/src/mod_register.erl
+++ b/src/mod_register.erl
@@ -35,18 +35,20 @@
unauthenticated_iq_register/4,
process_iq/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_REGISTER,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_INBAND_REGISTER,
?MODULE, process_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_REGISTER,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_INBAND_REGISTER,
?MODULE, process_iq, IQDisc),
- ejabberd_hooks:add(c2s_stream_features, Host,
+ ejabberd_hooks:add(c2s_stream_features, HostB,
?MODULE, stream_feature_register, 50),
- ejabberd_hooks:add(c2s_unauthenticated_iq, Host,
+ ejabberd_hooks:add(c2s_unauthenticated_iq, HostB,
?MODULE, unauthenticated_iq_register, 50),
mnesia:create_table(mod_register_ip,
[{ram_copies, [node()]},
@@ -56,65 +58,64 @@ start(Host, Opts) ->
ok.
stop(Host) ->
- ejabberd_hooks:delete(c2s_stream_features, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(c2s_stream_features, HostB,
?MODULE, stream_feature_register, 50),
- ejabberd_hooks:delete(c2s_unauthenticated_iq, Host,
+ ejabberd_hooks:delete(c2s_unauthenticated_iq, HostB,
?MODULE, unauthenticated_iq_register, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_REGISTER),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_REGISTER).
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_INBAND_REGISTER),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_INBAND_REGISTER).
stream_feature_register(Acc) ->
- [{xmlelement, "register",
- [{"xmlns", ?NS_FEATURE_IQREGISTER}], []} | Acc].
+ [#xmlel{ns = ?NS_INBAND_REGISTER_FEAT, name = 'register'} | Acc].
unauthenticated_iq_register(_Acc,
- Server, #iq{xmlns = ?NS_REGISTER} = IQ, IP) ->
+ Server, #iq{ns = ?NS_INBAND_REGISTER} = IQ_Rec, IP) ->
Address = case IP of
{A, _Port} -> A;
_ -> undefined
end,
- ResIQ = process_iq(jlib:make_jid("", "", ""),
- jlib:make_jid("", Server, ""),
- IQ,
+ BareJID = exmpp_jid:make(Server),
+ ResIQ = process_iq(exmpp_jid:make(),
+ BareJID,
+ IQ_Rec,
Address),
- Res1 = jlib:replace_from_to(jlib:make_jid("", Server, ""),
- jlib:make_jid("", "", ""),
- jlib:iq_to_xml(ResIQ)),
- jlib:remove_attr("to", Res1);
+ exmpp_iq:iq_to_xmlel(ResIQ, BareJID, undefined);
unauthenticated_iq_register(Acc, _Server, _IQ, _IP) ->
Acc.
process_iq(From, To, IQ) ->
- process_iq(From, To, IQ, jlib:jid_tolower(jlib:jid_remove_resource(From))).
+ process_iq(From, To, IQ, {exmpp_jid:prep_node_as_list(From),
+ exmpp_jid:prep_domain_as_list(From),
+ exmpp_jid:prep_resource_as_list(From)}).
process_iq(From, To,
- #iq{type = Type, lang = Lang, sub_el = SubEl, id = ID} = IQ,
+ #iq{type = Type, lang = Lang, payload = SubEl} = IQ_Rec,
Source) ->
case Type of
set ->
- UTag = xml:get_subtag(SubEl, "username"),
- PTag = xml:get_subtag(SubEl, "password"),
- RTag = xml:get_subtag(SubEl, "remove"),
- Server = To#jid.lserver,
+ UTag = exmpp_xml:get_element(SubEl, 'username'),
+ PTag = exmpp_xml:get_element(SubEl, 'password'),
+ RTag = exmpp_xml:get_element(SubEl, 'remove'),
+ Server = exmpp_jid:prep_domain_as_list(To),
if
- (UTag /= false) and (RTag /= false) ->
- User = xml:get_tag_cdata(UTag),
- case From of
- #jid{user = User, lserver = Server} ->
+ (UTag /= undefined) and (RTag /= undefined) ->
+ User = exmpp_xml:get_cdata_as_list(UTag),
+ case {exmpp_jid:node_as_list(From), exmpp_jid:prep_domain_as_list(From)} of
+ {User, Server} ->
ejabberd_auth:remove_user(User, Server),
- IQ#iq{type = result, sub_el = [SubEl]};
+ exmpp_iq:result(IQ_Rec, SubEl);
_ ->
if
- PTag /= false ->
- Password = xml:get_tag_cdata(PTag),
+ PTag /= undefined ->
+ Password = exmpp_xml:get_cdata_as_list(PTag),
case ejabberd_auth:remove_user(User,
Server,
Password) of
ok ->
- IQ#iq{type = result,
- sub_el = [SubEl]};
+ exmpp_iq:result(IQ_Rec, SubEl);
%% TODO FIXME: This piece of
%% code does not work since
%% the code have been changed
@@ -122,102 +123,93 @@ process_iq(From, To,
%% modules. lists:foreach can
%% only return ok:
not_allowed ->
- IQ#iq{type = error,
- sub_el =
- [SubEl, ?ERR_NOT_ALLOWED]};
+ exmpp_iq:error(IQ_Rec,
+ 'not-allowed');
not_exists ->
- IQ#iq{type = error,
- sub_el =
- [SubEl, ?ERR_ITEM_NOT_FOUND]};
+ exmpp_iq:error(IQ_Rec,
+ 'item-not-found');
_ ->
- IQ#iq{type = error,
- sub_el =
- [SubEl,
- ?ERR_INTERNAL_SERVER_ERROR]}
+ exmpp_iq:error(IQ_Rec,
+ 'internal-server-error')
end;
true ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_BAD_REQUEST]}
+ exmpp_iq:error(IQ_Rec, 'bad-request')
end
end;
- (UTag == false) and (RTag /= false) ->
- case From of
- #jid{user = User,
- lserver = Server,
- resource = Resource} ->
- ResIQ = #iq{type = result, xmlns = ?NS_REGISTER,
- id = ID,
- sub_el = [SubEl]},
+ (UTag == undefined) and (RTag /= undefined) ->
+ case {exmpp_jid:node_as_list(From),
+ exmpp_jid:prep_domain_as_list(From),
+ exmpp_jid:resource_as_list(From)}of
+ {User, Server, Resource} ->
+ ResIQ = exmpp_iq:result(IQ_Rec, SubEl),
ejabberd_router:route(
- jlib:make_jid(User, Server, Resource),
- jlib:make_jid(User, Server, Resource),
- jlib:iq_to_xml(ResIQ)),
+ exmpp_jid:make(User,
+ Server,
+ Resource),
+ exmpp_jid:make(User,
+ Server,
+ Resource),
+ exmpp_iq:iq_to_xmlel(ResIQ)),
ejabberd_auth:remove_user(User, Server),
ignore;
_ ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
+ exmpp_iq:error(IQ_Rec, 'not-allowed')
end;
- (UTag /= false) and (PTag /= false) ->
- User = xml:get_tag_cdata(UTag),
- Password = xml:get_tag_cdata(PTag),
- case From of
- #jid{user = User, lserver = Server} ->
- try_set_password(User, Server, Password, IQ, SubEl);
+ (UTag /= undefined) and (PTag /= undefined) ->
+ User = exmpp_xml:get_cdata_as_list(UTag),
+ Password = exmpp_xml:get_cdata_as_list(PTag),
+ case {exmpp_jid:node_as_list(From), exmpp_jid:prep_domain_as_list(From)} of
+ {User, Server} ->
+ try_set_password(User, Server, Password, IQ_Rec, SubEl);
_ ->
case try_register(User, Server, Password,
Source, Lang) of
ok ->
- IQ#iq{type = result, sub_el = [SubEl]};
+ exmpp_iq:result(IQ_Rec, SubEl);
{error, Error} ->
- IQ#iq{type = error,
- sub_el = [SubEl, Error]}
+ exmpp_iq:error(IQ_Rec, Error)
end
end;
true ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_BAD_REQUEST]}
+ exmpp_iq:error(IQ_Rec, 'bad-request')
end;
get ->
- IQ#iq{type = result,
- sub_el = [{xmlelement,
- "query",
- [{"xmlns", "jabber:iq:register"}],
- [{xmlelement, "instructions", [],
- [{xmlcdata,
- translate:translate(
- Lang,
- "Choose a username and password "
- "to register with this server")}]},
- {xmlelement, "username", [], []},
- {xmlelement, "password", [], []}]}]}
+ Result = #xmlel{ns = ?NS_INBAND_REGISTER, name = 'query', children =
+ [#xmlel{ns = ?NS_INBAND_REGISTER, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang,
+ "Choose a username and password "
+ "to register with this server"))}]},
+ #xmlel{ns = ?NS_INBAND_REGISTER, name = 'username'},
+ #xmlel{ns = ?NS_INBAND_REGISTER, name = 'password'}]},
+ exmpp_iq:result(IQ_Rec, Result)
end.
%% @doc Try to change password and return IQ response
-try_set_password(User, Server, Password, IQ, SubEl) ->
+try_set_password(User, Server, Password, IQ_Rec, SubEl) ->
case ejabberd_auth:set_password(User, Server, Password) of
ok ->
- IQ#iq{type = result, sub_el = [SubEl]};
+ exmpp_iq:result(IQ_Rec, SubEl);
{error, empty_password} ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_BAD_REQUEST]};
+ exmpp_iq:error(IQ_Rec, 'bad-request');
{error, not_allowed} ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+ exmpp_iq:error(IQ_Rec, 'not-allowed');
{error, invalid_jid} ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]};
+ exmpp_iq:error(IQ_Rec, 'item-not-found');
_ ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
+ exmpp_iq:error(IQ_Rec, 'internal-server-error')
end.
try_register(User, Server, Password, Source, Lang) ->
- case jlib:is_nodename(User) of
+ case exmpp_stringprep:is_node(User) of
false ->
- {error, ?ERR_BAD_REQUEST};
+ {error, 'bad-request'};
_ ->
- JID = jlib:make_jid(User, Server, ""),
+ JID = exmpp_jid:make(User,
+ Server),
Access = gen_mod:get_module_opt(Server, ?MODULE, access, all),
case acl:match_rule(Server, Access, JID) of
deny ->
- {error, ?ERR_CONFLICT};
+ {error, 'conflict'};
allow ->
case check_timeout(Source) of
true ->
@@ -230,60 +222,58 @@ try_register(User, Server, Password, Source, Lang) ->
remove_timeout(Source),
case Error of
{atomic, exists} ->
- {error, ?ERR_CONFLICT};
+ {error, 'conflict'};
{error, invalid_jid} ->
- {error, ?ERR_JID_MALFORMED};
+ {error, 'jid-malformed'};
{error, not_allowed} ->
- {error, ?ERR_NOT_ALLOWED};
+ {error, 'not-allowed'};
{error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ {error, 'internal-server-error'}
end
end;
false ->
ErrText = "Users are not allowed to register "
"accounts so quickly",
- {error, ?ERRT_RESOURCE_CONSTRAINT(Lang, ErrText)}
+ {error, exmpp_stanza:error(?NS_JABBER_CLIENT, 'resource-constraint', {Lang, ErrText})}
end
end
end.
send_welcome_message(JID) ->
- Host = JID#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(JID),
case gen_mod:get_module_opt(Host, ?MODULE, welcome_message, {"", ""}) of
{"", ""} ->
ok;
{Subj, Body} ->
ejabberd_router:route(
- jlib:make_jid("", Host, ""),
+ exmpp_jid:make(Host),
JID,
- {xmlelement, "message", [{"type", "normal"}],
- [{xmlelement, "subject", [], [{xmlcdata, Subj}]},
- {xmlelement, "body", [], [{xmlcdata, Body}]}]});
+ exmpp_message:normal(Subj, Body));
_ ->
ok
end.
send_registration_notifications(UJID) ->
- Host = UJID#jid.lserver,
+ Host = exmpp_jid:prep_domain_as_list(UJID),
case gen_mod:get_module_opt(Host, ?MODULE, registration_watchers, []) of
[] -> ok;
JIDs when is_list(JIDs) ->
Body = lists:flatten(
io_lib:format(
"The user '~s' was just created on node ~w.",
- [jlib:jid_to_string(UJID), node()])),
+ [exmpp_jid:to_list(UJID), node()])),
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}]}]})
+ try
+ JID = exmpp_jid:parse(S),
+ ejabberd_router:route(
+ exmpp_jid:make(Host),
+ JID,
+ exmpp_message:chat(Body))
+ catch
+ _ ->
+ ok
end
end, JIDs);
_ ->
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index e73eb1207..052351773 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -53,94 +53,128 @@
webadmin_page/3,
webadmin_user/4,
get_versioning_feature/2,
- roster_versioning_enabled/1,
- roster_version/2]).
+ roster_versioning_enabled/1]).
+
+-include_lib("exmpp/include/exmpp.hrl").
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_roster.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
+-define(NS_ROSTER_VER, "urn:xmpp:features:rosterver").
-start(Host, Opts) ->
+%% @type rosteritem() = {roster, USJ, US, Contact_JID, Name, Subscription, Ask, Groups, Askmessage, Xs}
+%% USJ = {LUser, LServer, Prepd_Contact_JID}
+%% LUser = binary()
+%% LServer = binary()
+%% Prepd_Contact_JID = jlib:shortjid()
+%% US = {LUser, LServer}
+%% Contact_JID = jlib:shortjid()
+%% Name = binary()
+%% Subscription = none | to | from | both
+%% Ask = none | out | in | both
+%% Groups = [binary()]
+%% Askmessage = binary()
+%% Xs = [exmpp_xml:xmlel()]
+
+%% @spec (Host, Opts) -> term()
+%% Host = string()
+%% Opts = list()
+
+start(Host, Opts) when is_list(Host) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
mnesia:create_table(roster,[{disc_copies, [node()]},
{attributes, record_info(fields, roster)}]),
mnesia:create_table(roster_version, [{disc_copies, [node()]},
- {attributes, record_info(fields, roster_version)}]),
-
+ {attributes, record_info(fields, roster_version)}]),
update_table(),
mnesia:add_table_index(roster, us),
mnesia:add_table_index(roster_version, us),
- ejabberd_hooks:add(roster_get, Host,
+ ejabberd_hooks:add(roster_get, HostB,
?MODULE, get_user_roster, 50),
- ejabberd_hooks:add(roster_in_subscription, Host,
+ ejabberd_hooks:add(roster_in_subscription, HostB,
?MODULE, in_subscription, 50),
- ejabberd_hooks:add(roster_out_subscription, Host,
+ ejabberd_hooks:add(roster_out_subscription, HostB,
?MODULE, out_subscription, 50),
- ejabberd_hooks:add(roster_get_subscription_lists, Host,
+ ejabberd_hooks:add(roster_get_subscription_lists, HostB,
?MODULE, get_subscription_lists, 50),
- ejabberd_hooks:add(roster_get_jid_info, Host,
+ ejabberd_hooks:add(roster_get_jid_info, HostB,
?MODULE, get_jid_info, 50),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(anonymous_purge_hook, Host,
+ ejabberd_hooks:add(anonymous_purge_hook, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(resend_subscription_requests_hook, Host,
+ ejabberd_hooks:add(resend_subscription_requests_hook, HostB,
?MODULE, get_in_pending_subscriptions, 50),
- ejabberd_hooks:add(roster_get_versioning_feature, Host,
+ ejabberd_hooks:add(roster_get_versioning_feature, HostB,
?MODULE, get_versioning_feature, 50),
- ejabberd_hooks:add(webadmin_page_host, Host,
+ ejabberd_hooks:add(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:add(webadmin_user, Host,
+ ejabberd_hooks:add(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_ROSTER,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_ROSTER,
?MODULE, process_iq, IQDisc).
-stop(Host) ->
- ejabberd_hooks:delete(roster_get, Host,
+%% @spec (Host) -> term()
+%% Host = string()
+
+stop(Host) when is_list(Host) ->
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(roster_get, HostB,
?MODULE, get_user_roster, 50),
- ejabberd_hooks:delete(roster_in_subscription, Host,
+ ejabberd_hooks:delete(roster_in_subscription, HostB,
?MODULE, in_subscription, 50),
- ejabberd_hooks:delete(roster_out_subscription, Host,
+ ejabberd_hooks:delete(roster_out_subscription, HostB,
?MODULE, out_subscription, 50),
- ejabberd_hooks:delete(roster_get_subscription_lists, Host,
+ ejabberd_hooks:delete(roster_get_subscription_lists, HostB,
?MODULE, get_subscription_lists, 50),
- ejabberd_hooks:delete(roster_get_jid_info, Host,
+ ejabberd_hooks:delete(roster_get_jid_info, HostB,
?MODULE, get_jid_info, 50),
- ejabberd_hooks:delete(remove_user, Host,
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(anonymous_purge_hook, Host,
+ ejabberd_hooks:delete(anonymous_purge_hook, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(resend_subscription_requests_hook, Host,
+ ejabberd_hooks:delete(resend_subscription_requests_hook, HostB,
?MODULE, get_in_pending_subscriptions, 50),
- ejabberd_hooks:delete(roster_get_versioning_feature, Host,
+ ejabberd_hooks:delete(roster_get_versioning_feature, HostB,
?MODULE, get_versioning_feature, 50),
- ejabberd_hooks:delete(webadmin_page_host, Host,
+ ejabberd_hooks:delete(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:delete(webadmin_user, Host,
+ ejabberd_hooks:delete(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_ROSTER).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB,
+ ?NS_ROSTER).
+%% @spec (From, To, IQ_Rec) -> IQ_Result
+%% From = exmpp_jid:jid()
+%% To = exmpp_jid:jid()
+%% IQ_Rec = exmpp_iq:iq()
+%% IQ_Result = exmpp_iq:iq()
-process_iq(From, To, IQ) ->
- #iq{sub_el = SubEl} = IQ,
- #jid{lserver = LServer} = From,
+process_iq(From, To, IQ_Rec)
+ when ?IS_JID(From), ?IS_JID(To), ?IS_IQ_RECORD(IQ_Rec) ->
+ LServer = exmpp_jid:prep_domain_as_list(From),
case lists:member(LServer, ?MYHOSTS) of
true ->
- process_local_iq(From, To, IQ);
+ process_local_iq(From, To, IQ_Rec);
_ ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]}
+ exmpp_iq:error(IQ_Rec, '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.
+%% @spec (From, To, IQ_Rec) -> IQ_Result
+%% From = exmpp_jid:jid()
+%% To = exmpp_jid:jid()
+%% IQ_Rec = exmpp_iq:iq()
+%% IQ_Result = exmpp_iq:iq()
+
+process_local_iq(From, To, #iq{type = get} = IQ_Rec)
+ when ?IS_JID(From), ?IS_JID(To), ?IS_IQ_RECORD(IQ_Rec) ->
+ process_iq_get(From, To, IQ_Rec);
+process_local_iq(From, To, #iq{type = set} = IQ_Rec)
+ when ?IS_JID(From), ?IS_JID(To), ?IS_IQ_RECORD(IQ_Rec) ->
+ process_iq_set(From, To, IQ_Rec).
roster_hash(Items) ->
sha:sha(term_to_binary(
@@ -148,20 +182,20 @@ roster_hash(Items) ->
[R#roster{groups = lists:sort(Grs)} ||
R = #roster{groups = Grs} <- Items]))).
-roster_versioning_enabled(Host) ->
- gen_mod:get_module_opt(Host, ?MODULE, versioning, false).
+%% @spec (Host::binary()) -> true | false
+roster_versioning_enabled(Host) ->
+ gen_mod:get_module_opt(binary_to_list(Host), ?MODULE, versioning, false).
+%% @spec (Host::binary()) -> true | false
roster_version_on_db(Host) ->
- gen_mod:get_module_opt(Host, ?MODULE, store_current_id, false).
+ gen_mod:get_module_opt(binary_to_list(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 = exmpp_xml:element(?NS_ROSTER_VER, 'ver', [],
+ [exmpp_xml:element(?NS_ROSTER_VER, 'optional')]),
[Feature | Acc];
false -> []
end.
@@ -171,29 +205,39 @@ roster_version(LServer ,LUser) ->
case roster_version_on_db(LServer) of
true ->
case mnesia:dirty_read(roster_version, US) of
- [#roster_version{version = V}] -> V;
+ [#roster_version{version =V}] -> V;
[] -> not_found
end;
false ->
roster_hash(ejabberd_hooks:run_fold(roster_get, LServer, [], [US]))
end.
-%% Load roster from DB only if neccesary.
+%% @spec (From, To, IQ_Rec) -> IQ_Result
+%% From = exmpp_jid:jid()
+%% To = exmpp_jid:jid()
+%% IQ_Rec = exmpp_iq:iq()
+%% IQ_Result = exmpp_iq:iq()
+%% @doc 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},
+%% - 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 version IDs on db OR
+%% - the roster version from client don't match current version
+process_iq_get(From, To, IQ_Rec) ->
+ US = {_, LServer} = {exmpp_jid:prep_node(From), exmpp_jid:prep_domain(From)},
try
{ItemsToSend, VersionToSend} =
- case {xml:get_tag_attr("ver", SubEl),
+ case {exmpp_xml:get_attribute_as_list(exmpp_iq:get_request(IQ_Rec), ver, not_found),
roster_versioning_enabled(LServer),
roster_version_on_db(LServer)} of
- {{value, RequestedVersion}, true, true} ->
+ {not_found, _ , _} ->
+ {lists:map(fun item_to_xml/1,
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), false};
+ {_, false, _} ->
+ {lists:map(fun item_to_xml/1,
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), false};
+
+ {RequestedVersion, true, true} ->
%% Retrieve version from DB. Only load entire roster
%% when neccesary.
case mnesia:dirty_read(roster_version, US) of
@@ -201,39 +245,48 @@ process_iq_get(From, To, #iq{sub_el = SubEl} = IQ) ->
{false, false};
[#roster_version{version = NewVersion}] ->
{lists:map(fun item_to_xml/1,
- ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [], [US])), NewVersion};
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), NewVersion};
[] ->
RosterVersion = sha:sha(term_to_binary(now())),
mnesia:dirty_write(#roster_version{us = US, version = RosterVersion}),
{lists:map(fun item_to_xml/1,
- ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [], [US])), RosterVersion}
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), RosterVersion}
end;
-
- {{value, RequestedVersion}, true, false} ->
- RosterItems = ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [] , [US]),
+ {RequestedVersion, true, false} ->
+ RosterItems = ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [] , [US]),
case roster_hash(RosterItems) of
RequestedVersion ->
{false, false};
New ->
{lists:map(fun item_to_xml/1, RosterItems), New}
- end;
+ 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}
+ case {ItemsToSend, VersionToSend} of
+ {false, false} ->
+ exmpp_iq:result(IQ_Rec);
+ {Items, false} ->
+ exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [] , Items));
+ {Items, Version} ->
+ exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [?XMLATTR('ver', Version)], Items))
+ end
catch
_:_ ->
- IQ#iq{type =error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
- end.
+ exmpp_iq:error(IQ_Rec, 'internal-server-error')
+ end.
-get_user_roster(Acc, US) ->
+
+
+
+%% @spec (Acc, US) -> New_Acc
+%% Acc = [rosteritem()]
+%% US = {User, Server}
+%% User = binary()
+%% Server = binary()
+%% New_Acc = [rosteritem()]
+
+get_user_roster(Acc, {U, S} = US) when is_binary(U), is_binary(S) ->
case catch mnesia:dirty_index_read(roster, US, #roster.us) of
Items when is_list(Items) ->
lists:filter(fun(#roster{subscription = none, ask = in}) ->
@@ -245,126 +298,161 @@ get_user_roster(Acc, US) ->
Acc
end.
+%% @spec (Item) -> XML
+%% Item = rosteritem()
+%% XML = exmpp_xml:xmlel()
item_to_xml(Item) ->
- Attrs1 = [{"jid", jlib:jid_to_string(Item#roster.jid)}],
+ {U, S, R} = Item#roster.jid,
+ Attrs1 = exmpp_xml:set_attribute_in_list([],
+ 'jid', exmpp_jid:to_binary(U, S, R)),
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]
+ exmpp_xml:set_attribute_in_list(Attrs1, 'name', Name)
end,
+ Attrs3 = exmpp_xml:set_attribute_in_list(Attrs2,
+ 'subscription', Item#roster.subscription),
Attrs4 = case ask_to_pending(Item#roster.ask) of
out ->
- [{"ask", "subscribe"} | Attrs3];
+ exmpp_xml:set_attribute_in_list(Attrs3,
+ 'ask', <<"subscribe">>);
both ->
- [{"ask", "subscribe"} | Attrs3];
+ exmpp_xml:set_attribute_in_list(Attrs3,
+ 'ask', <<"subscribe">>);
_ ->
Attrs3
end,
SubEls1 = lists:map(fun(G) ->
- {xmlelement, "group", [], [{xmlcdata, G}]}
+ exmpp_xml:set_cdata(
+ #xmlel{ns = ?NS_ROSTER, name = 'group'}, G)
end, Item#roster.groups),
SubEls = SubEls1 ++ Item#roster.xs,
- {xmlelement, "item", Attrs4, SubEls}.
+ #xmlel{ns = ?NS_ROSTER, name = 'item', attrs = Attrs4, children = SubEls}.
+%% @spec (From, To, IQ_Rec) -> IQ_Result
+%% From = exmpp_jid:jid()
+%% To = exmpp_jid:jid()
+%% IQ_Rec = exmpp_iq:iq()
+%% IQ_Result = exmpp_iq:iq()
-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;
+process_iq_set(From, To, #iq{payload = Request} = IQ_Rec) ->
+ case Request of
+ #xmlel{children = Els} ->
+ lists:foreach(fun(El) -> process_item_set(From, To, El) end, Els);
_ ->
- JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
- LJID = jlib:jid_tolower(JID1),
- F = fun() ->
- Res = mnesia:read({roster, {LUser, LServer, LJID}}),
- Item = case Res of
- [] ->
- #roster{usj = {LUser, LServer, LJID},
- us = {LUser, LServer},
- jid = JID};
- [I] ->
- I#roster{jid = JID,
- name = "",
- groups = [],
- xs = []}
- end,
- Item1 = process_item_attrs(Item, Attrs),
- Item2 = process_item_els(Item1, Els),
- case Item2#roster.subscription of
- remove ->
- mnesia:delete({roster, {LUser, LServer, LJID}});
- _ ->
- mnesia:write(Item2)
- 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 -> mnesia:write(#roster_version{us = {LUser, LServer}, version = sha:sha(term_to_binary(now()))});
- false -> ok
- end,
- {Item, Item3}
- end,
- case mnesia:transaction(F) of
- {atomic, {OldItem, Item}} ->
- push_item(User, LServer, To, Item),
- case Item#roster.subscription of
+ ok
+ end,
+ exmpp_iq:result(IQ_Rec).
+
+%% @spec (From, To, El) -> ok
+%% From = exmpp_jid:jid()
+%% To = exmpp_jid:jid()
+%% El = exmpp_xml:xmlel()
+
+process_item_set(From, To, #xmlel{} = El) ->
+ try
+ JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, 'jid', <<>>)),
+ User = exmpp_jid:node(From),
+ LUser = exmpp_jid:prep_node(From),
+ LServer = exmpp_jid:prep_domain(From),
+ JID = jlib:short_jid(JID1),
+ LJID = jlib:short_prepd_jid(JID1),
+ F = fun() ->
+ Res = mnesia:read({roster, {LUser, LServer, LJID}}),
+ Item = case Res of
+ [] ->
+ #roster{usj = {LUser, LServer, LJID},
+ us = {LUser, LServer},
+ jid = JID};
+ [I] ->
+ I#roster{jid = JID,
+ name = <<>>,
+ groups = [],
+ xs = []}
+ end,
+ Item1 = process_item_attrs(Item, El#xmlel.attrs),
+ Item2 = process_item_els(Item1, El#xmlel.children),
+ case Item2#roster.subscription of
remove ->
- send_unsubscribing_presence(From, OldItem),
- ok;
+ mnesia:delete({roster, {LUser, LServer, LJID}});
_ ->
- ok
- end;
- E ->
- ?DEBUG("ROSTER: roster item set error: ~p~n", [E]),
- ok
- end
+ mnesia:write(Item2)
+ end,
+ %% If the item exist in shared roster, take the
+ %% subscription information from there:
+ Item3 = ejabberd_hooks:run_fold(roster_process_item,
+ exmpp_jid:prep_domain(From), Item2, [exmpp_jid:prep_domain(From)]),
+ case roster_version_on_db(LServer) of
+ true -> mnesia:write(#roster_version{us = {LUser, LServer}, version = sha:sha(term_to_binary(now()))});
+ false -> ok
+ end,
+ {Item, Item3}
+ end,
+ case mnesia:transaction(F) of
+ {atomic, {OldItem, Item}} ->
+ push_item(User, LServer, To, Item),
+ case Item#roster.subscription of
+ remove ->
+ IsTo = case OldItem#roster.subscription of
+ both -> true;
+ to -> true;
+ _ -> false
+ end,
+ IsFrom = case OldItem#roster.subscription of
+ both -> true;
+ from -> true;
+ _ -> false
+ end,
+ {U, S, R} = OldItem#roster.jid,
+ if IsTo ->
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ exmpp_jid:make(U, S, R),
+ exmpp_presence:unsubscribe());
+ true -> ok
+ end,
+ if IsFrom ->
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ exmpp_jid:make(U, S, R),
+ exmpp_presence:unsubscribed());
+ true -> ok
+ end,
+ ok;
+ _ ->
+ ok
+ end;
+ E ->
+ ?DEBUG("ROSTER: roster item set error: ~p~n", [E]),
+ ok
+ end
+ catch
+ _ ->
+ ok
end;
process_item_set(_From, _To, _) ->
ok.
-process_item_attrs(Item, [{Attr, Val} | Attrs]) ->
+%% @spec (Item, Attrs) -> New_Item
+%% Item = rosteritem()
+%% Attrs = [exmpp_xml:xmlnsattribute()]
+%% New_Item = rosteritem()
+
+process_item_attrs(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
case Attr of
- "jid" ->
- case jlib:string_to_jid(Val) of
- error ->
- process_item_attrs(Item, Attrs);
- JID1 ->
- JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
- process_item_attrs(Item#roster{jid = JID}, Attrs)
- end;
- "name" ->
+ 'name' ->
process_item_attrs(Item#roster{name = Val}, Attrs);
- "subscription" ->
+ 'subscription' ->
case Val of
- "remove" ->
+ <<"remove">> ->
process_item_attrs(Item#roster{subscription = remove},
Attrs);
_ ->
process_item_attrs(Item, Attrs)
end;
- "ask" ->
+ 'ask' ->
process_item_attrs(Item, Attrs);
_ ->
process_item_attrs(Item, Attrs)
@@ -372,54 +460,73 @@ process_item_attrs(Item, [{Attr, Val} | Attrs]) ->
process_item_attrs(Item, []) ->
Item.
+%% @spec (Item, Els) -> New_Item
+%% Item = rosteritem()
+%% Els = [exmpp_xml:xmlel()]
+%% New_Item = rosteritem()
-process_item_els(Item, [{xmlelement, Name, Attrs, SEls} | Els]) ->
+process_item_els(Item, [#xmlel{ns = NS, name = Name} = El | Els]) ->
case Name of
- "group" ->
- Groups = [xml:get_cdata(SEls) | Item#roster.groups],
+ 'group' ->
+ Groups = [exmpp_xml:get_cdata(El) | Item#roster.groups],
process_item_els(Item#roster{groups = Groups}, Els);
_ ->
- case xml:get_attr_s("xmlns", Attrs) of
- "" ->
+ if
+ NS == ?NS_JABBER_CLIENT; NS == ?NS_JABBER_SERVER ->
process_item_els(Item, Els);
- _ ->
- XEls = [{xmlelement, Name, Attrs, SEls} | Item#roster.xs],
+ true ->
+ XEls = [El | Item#roster.xs],
process_item_els(Item#roster{xs = XEls}, Els)
end
end;
-process_item_els(Item, [{xmlcdata, _} | Els]) ->
+process_item_els(Item, [_ | Els]) ->
process_item_els(Item, Els);
process_item_els(Item, []) ->
Item.
+%% @spec (User, Server, From, Item) -> term()
+%% User = binary()
+%% Server = binary()
+%% From = exmpp_jid:jid()
+%% Item = rosteritem()
-push_item(User, Server, From, Item) ->
- ejabberd_sm:route(jlib:make_jid("", "", ""),
- jlib:make_jid(User, Server, ""),
- {xmlelement, "broadcast", [],
+push_item(User, Server, From, Item)
+ when is_binary(User), is_binary(Server), ?IS_JID(From) ->
+ ejabberd_sm:route(exmpp_jid:make(),
+ exmpp_jid:make(User, Server),
+ #xmlel{name = 'broadcast', children =
[{item,
Item#roster.jid,
Item#roster.subscription}]}),
+
case roster_versioning_enabled(Server) of
- true ->
+ true ->
push_item_version(Server, User, From, Item, roster_version(Server, User));
false ->
lists:foreach(fun(Resource) ->
- push_item(User, Server, Resource, From, Item)
+ push_item(User, Server, Resource, From, Item)
end, ejabberd_sm:get_user_resources(User, Server))
end.
+%% @spec (User, Server, Resource, From, Item) -> term()
+%% User = binary()
+%% Server = binary()
+%% Resource = binary()
+%% From = exmpp_jid:jid()
+%% Item = rosteritem()
+
% TODO: don't push to those who didn't 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)]}]},
+push_item(User, Server, Resource, From, Item)
+ when is_binary(User), is_binary(Server), is_binary(Resource),
+ ?IS_JID(From) ->
+ Request = #xmlel{ns = ?NS_ROSTER, name = 'query',
+ children = [item_to_xml(Item)]},
+ ResIQ = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
+ "push" ++ randoms:get_string()),
ejabberd_router:route(
From,
- jlib:make_jid(User, Server, Resource),
- jlib:iq_to_xml(ResIQ)).
+ exmpp_jid:make(User, Server, Resource),
+ ResIQ).
%% @doc Roster push, calculate and include the version attribute.
%% TODO: don't push to those who didn't load roster
@@ -429,28 +536,45 @@ push_item_version(Server, User, 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)]}]},
+ Request = #xmlel{ns = ?NS_ROSTER, name = 'query', attrs = [?XMLATTR('ver', RosterVersion)],
+ children = [mod_roster:item_to_xml(Item)]},
+ ResIQ = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
+ "push" ++ randoms:get_string()),
ejabberd_router:route(
From,
- jlib:make_jid(User, Server, Resource),
- jlib:iq_to_xml(IQPush)).
+ exmpp_jid:make(User, Server, Resource),
+ ResIQ).
-get_subscription_lists(_, User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- US = {LUser, LServer},
- case mnesia:dirty_index_read(roster, US, #roster.us) of
- Items when is_list(Items) ->
- fill_subscription_lists(Items, [], []);
+%% @spec (Ignored, User, Server) -> Subscription_Lists
+%% Ignored = term()
+%% User = binary()
+%% Server = binary()
+%% Subscription_Lists = {F, T}
+%% F = [jlib:shortjid()]
+%% T = [jlib:shortjid()]
+
+get_subscription_lists(_, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ US = {User,Server},
+ case mnesia:dirty_index_read(roster, US, #roster.us) of
+ Items when is_list(Items) ->
+ fill_subscription_lists(Items, [], []);
+ _ ->
+ {[], []}
+ end
+ catch
_ ->
{[], []}
end.
+%% @spec (Items, F, T) -> {New_F, New_T}
+%% Items = [rosteritem()]
+%% F = [jlib:shortjid()]
+%% T = [jlib:shortjid()]
+%% New_F = [jlib:shortjid()]
+%% New_T = [jlib:shortjid()]
+
fill_subscription_lists([I | Is], F, T) ->
J = element(3, I#roster.usj),
case I#roster.subscription of
@@ -466,105 +590,131 @@ fill_subscription_lists([I | Is], F, T) ->
fill_subscription_lists([], F, T) ->
{F, T}.
+%% @hidden
+
ask_to_pending(subscribe) -> out;
ask_to_pending(unsubscribe) -> none;
ask_to_pending(Ask) -> Ask.
+%% @spec (Ignored, User, Server, JID, Type, Reason) -> bool()
+%% Ignored = term()
+%% User = binary()
+%% Server = binary()
+%% JID = exmpp_jid:jid()
+%% Type = subscribe | subscribed | unsubscribe | unsubscribed
+%% Reason = binary() | undefined
-
-in_subscription(_, User, Server, JID, Type, Reason) ->
+in_subscription(_, User, Server, JID, Type, Reason)
+ when is_binary(User), is_binary(Server), ?IS_JID(JID) ->
process_subscription(in, User, Server, JID, Type, Reason).
-out_subscription(User, Server, JID, Type) ->
- process_subscription(out, User, Server, JID, Type, []).
+%% @spec (User, Server, JID, Type) -> bool()
+%% User = binary()
+%% Server = binary()
+%% JID = exmpp_jid:jid()
+%% Type = subscribe | subscribed | unsubscribe | unsubscribed
-process_subscription(Direction, User, Server, JID1, Type, Reason) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- US = {LUser, LServer},
- LJID = jlib:jid_tolower(JID1),
- F = fun() ->
- Item = case mnesia:read({roster, {LUser, LServer, LJID}}) of
- [] ->
- JID = {JID1#jid.user,
- JID1#jid.server,
- JID1#jid.resource},
- #roster{usj = {LUser, LServer, LJID},
- us = US,
- jid = JID};
- [I] ->
- I
- 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)
+out_subscription(User, Server, JID, Type)
+ when is_binary(User), is_binary(Server), ?IS_JID(JID) ->
+ process_subscription(out, User, Server, JID, Type, <<>>).
+
+%% @spec (Direction, User, Server, JID1, Type, Reason) -> bool()
+%% Direction = in | out
+%% User = binary()
+%% Server = binary()
+%% JID1 = exmpp_jid:jid()
+%% Type = subscribe | subscribed | unsubscribe | unsubscribed
+%% Reason = binary() | undefined
+
+process_subscription(Direction, User, Server, JID1, Type, Reason)
+ when is_binary(User), is_binary(Server) ->
+ try
+ US = {User, Server},
+ LJID = jlib:short_prepd_jid(JID1),
+ F = fun() ->
+ Item = case mnesia:read({roster, {User, Server, LJID}}) of
+ [] ->
+ JID = jlib:short_jid(JID1),
+ #roster{usj = {User, Server, LJID},
+ us = US,
+ jid = JID};
+ [I] ->
+ I
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 ->
- mnesia:delete({roster, {LUser, LServer, LJID}}),
- {none, AutoReply};
- {Subscription, Pending} ->
- NewItem = Item#roster{subscription = Subscription,
- ask = Pending,
- askmessage = list_to_binary(AskMessage)},
- mnesia:write(NewItem),
- case roster_version_on_db(LServer) of
- true -> mnesia:write(#roster_version{us = {LUser, LServer}, version = sha:sha(term_to_binary(now()))});
+ 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 ->
+ mnesia:delete({roster, {User, Server, LJID}}),
+ {none, AutoReply};
+ {Subscription, Pending} ->
+ AskBinary = case AskMessage of
+ undefined -> <<>>;
+ B -> B
+ end,
+ NewItem = Item#roster{subscription = Subscription,
+ ask = Pending,
+ askmessage = AskBinary},
+ mnesia:write(NewItem),
+ case roster_version_on_db(Server) of
+ true -> mnesia:write(#roster_version{us = {User, Server}, version = sha:sha(term_to_binary(now()))});
false -> ok
- end,
- {{push, NewItem}, AutoReply}
- end
- end,
- case mnesia:transaction(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,
+ {{push, NewItem}, AutoReply}
+ end
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;
+ case mnesia:transaction(F) of
+ {atomic, {Push, AutoReply}} ->
+ case AutoReply of
+ none ->
+ ok;
+ _ ->
+ ejabberd_router:route(
+ exmpp_jid:make(User, Server), JID1,
+ exmpp_presence:AutoReply())
+ end,
+ case Push of
+ {push, Item} ->
+ if
+ Item#roster.subscription == none,
+ Item#roster.ask == in ->
+ ok;
+ true ->
+ push_item(User, Server,
+ exmpp_jid:make(User, Server), Item)
+ end,
+ true;
+ none ->
+ false
+ end;
+ _ ->
+ false
+ end
+ catch
_ ->
false
end.
@@ -664,26 +814,35 @@ in_auto_reply(from, out, unsubscribe) -> unsubscribed;
in_auto_reply(both, none, unsubscribe) -> unsubscribed;
in_auto_reply(_, _, _) -> none.
+%% @spec (User, Server) -> term()
+%% User = binary()
+%% Server = binary()
-remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
- US = {LUser, LServer},
- send_unsubscription_to_rosteritems(LUser, LServer),
- F = fun() ->
- lists:foreach(fun(R) ->
- mnesia:delete_object(R)
- end,
- mnesia:index_read(roster, US, #roster.us))
- end,
- mnesia:transaction(F).
+remove_user(User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ send_unsubscription_to_rosteritems(LUser, LServer),
+ F = fun() ->
+ lists:foreach(fun(R) ->
+ mnesia:delete_object(R)
+ end,
+ mnesia:index_read(roster, US, #roster.us))
+ end,
+ mnesia:transaction(F)
+ catch
+ _ ->
+ ok
+ end.
%% 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, ""}),
+ From = exmpp_jid:make(LUser, LServer, ""),
lists:foreach(fun(RosterItem) ->
send_unsubscribing_presence(From, RosterItem)
end,
@@ -701,97 +860,107 @@ send_unsubscribing_presence(From, Item) ->
from -> true;
_ -> false
end,
+ {INode, IDom, IRes} = Item#roster.jid,
+ SendToJID = exmpp_jid:make(INode, IDom, IRes),
if IsTo ->
- send_presence_type(
- jlib:jid_remove_resource(From),
- jlib:make_jid(Item#roster.jid), "unsubscribe");
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ SendToJID,
+ exmpp_presence:unsubscribe());
true -> ok
end,
if IsFrom ->
- send_presence_type(
- jlib:jid_remove_resource(From),
- jlib:make_jid(Item#roster.jid), "unsubscribed");
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ SendToJID,
+ exmpp_presence: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),
- F = fun() ->
- lists:foreach(fun(El) ->
- process_item_set_t(LUser, LServer, El)
- end, Els)
- end,
- mnesia:transaction(F).
+%% @spec (User, Server, El) -> term()
+%% User = binary()
+%% Server = binary()
+%% El = exmpp_xml:xmlel()
-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 ->
- ok;
+set_items(User, Server, #xmlel{children = Els})
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ F = fun() ->
+ lists:foreach(fun(El) ->
+ process_item_set_t(LUser, LServer, El)
+ end, Els)
+ end,
+ mnesia:transaction(F)
+ catch
_ ->
- JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
- LJID = {JID1#jid.luser, JID1#jid.lserver, JID1#jid.lresource},
- Item = #roster{usj = {LUser, LServer, LJID},
- us = {LUser, LServer},
- jid = JID},
- Item1 = process_item_attrs_ws(Item, Attrs),
- Item2 = process_item_els(Item1, Els),
- case Item2#roster.subscription of
- remove ->
- mnesia:delete({roster, {LUser, LServer, LJID}});
- _ ->
- mnesia:write(Item2)
- end
+ ok
+ end.
+
+%% @spec (LUser, LServer, El) -> term()
+%% LUser = binary()
+%% LServer = binary()
+%% El = exmpp_xml:xmlel()
+
+process_item_set_t(LUser, LServer, #xmlel{} = El) ->
+ try
+ JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_list(El, 'jid', <<>>)),
+ JID = jlib:short_jid(JID1),
+ LJID = jlib:short_prepd_jid(JID1),
+ Item = #roster{usj = {LUser, LServer, LJID},
+ us = {LUser, LServer},
+ jid = JID},
+ Item1 = process_item_attrs_ws(Item, El#xmlel.attrs),
+ Item2 = process_item_els(Item1, El#xmlel.children),
+ case Item2#roster.subscription of
+ remove ->
+ mnesia:delete({roster, {LUser, LServer, LJID}});
+ _ ->
+ mnesia:write(Item2)
+ end
+ catch
+ _ ->
+ ok
end;
process_item_set_t(_LUser, _LServer, _) ->
ok.
-process_item_attrs_ws(Item, [{Attr, Val} | Attrs]) ->
+%% @spec (Item, Attrs) -> New_Item
+%% Item = rosteritem()
+%% Attrs = [exmpp_xml:xmlnsattribute()]
+%% New_Item = rosteritem()
+
+process_item_attrs_ws(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
case Attr of
- "jid" ->
- case jlib:string_to_jid(Val) of
- error ->
- process_item_attrs_ws(Item, Attrs);
- JID1 ->
- JID = {JID1#jid.user, JID1#jid.server, JID1#jid.resource},
- process_item_attrs_ws(Item#roster{jid = JID}, Attrs)
- end;
- "name" ->
+ 'name' ->
process_item_attrs_ws(Item#roster{name = Val}, Attrs);
- "subscription" ->
+ 'subscription' ->
case Val of
- "remove" ->
+ <<"remove">> ->
process_item_attrs_ws(Item#roster{subscription = remove},
Attrs);
- "none" ->
+ <<"none">> ->
process_item_attrs_ws(Item#roster{subscription = none},
Attrs);
- "both" ->
+ <<"both">> ->
process_item_attrs_ws(Item#roster{subscription = both},
Attrs);
- "from" ->
+ <<"from">> ->
process_item_attrs_ws(Item#roster{subscription = from},
Attrs);
- "to" ->
+ <<"to">> ->
process_item_attrs_ws(Item#roster{subscription = to},
Attrs);
_ ->
process_item_attrs_ws(Item, Attrs)
end;
- "ask" ->
+ 'ask' ->
process_item_attrs_ws(Item, Attrs);
_ ->
process_item_attrs_ws(Item, Attrs)
@@ -799,25 +968,27 @@ process_item_attrs_ws(Item, [{Attr, Val} | Attrs]) ->
process_item_attrs_ws(Item, []) ->
Item.
-get_in_pending_subscriptions(Ls, User, Server) ->
- JID = jlib:make_jid(User, Server, ""),
- US = {JID#jid.luser, JID#jid.lserver},
+%% @spec (Ls, User, Server) -> New_Ls
+%% Ls = [exmpp_xml:xmlel()]
+%% User = binary()
+%% Server = binary()
+%% New_Ls = [exmpp_xml:xmlel()]
+
+get_in_pending_subscriptions(Ls, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ JID = exmpp_jid:make(User, Server),
+ US = {exmpp_jid:prep_node(JID), exmpp_jid:prep_domain(JID)},
case mnesia:dirty_index_read(roster, US, #roster.us) of
Result when is_list(Result) ->
- Ls ++ lists:map(
+ Ls ++ lists:map(
fun(R) ->
Message = R#roster.askmessage,
- Status = if is_binary(Message) ->
- binary_to_list(Message);
- true ->
- ""
- end,
- {xmlelement, "presence",
- [{"from", jlib:jid_to_string(R#roster.jid)},
- {"to", jlib:jid_to_string(JID)},
- {"type", "subscribe"}],
- [{xmlelement, "status", [],
- [{xmlcdata, Status}]}]}
+ {U0, S0, R0} = R#roster.jid,
+ Pres1 = exmpp_presence:subscribe(),
+ Pres2 = exmpp_stanza:set_jids(Pres1,
+ exmpp_jid:to_binary(U0, S0, R0),
+ exmpp_jid:to_binary(JID)),
+ exmpp_presence:set_status(Pres2, Message)
end,
lists:filter(
fun(R) ->
@@ -835,38 +1006,51 @@ get_in_pending_subscriptions(Ls, User, Server) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-get_jid_info(_, User, Server, JID) ->
- LUser = jlib:nodeprep(User),
- LJID = jlib:jid_tolower(JID),
- LServer = jlib:nameprep(Server),
- case catch mnesia:dirty_read(roster, {LUser, LServer, LJID}) of
- [#roster{subscription = Subscription, groups = Groups}] ->
- {Subscription, Groups};
+%% @spec (Ignored, User, Server, JID) -> {Subscription, Groups}
+%% Ignored = term()
+%% User = binary()
+%% Server = binary()
+%% JID = exmpp_jid:jid()
+%% Subscription = none | to | from | both
+%% Groups = [binary()]
+
+get_jid_info(_, User, Server, JID)
+ when is_binary(User), is_binary(Server), ?IS_JID(JID) ->
+ try
+ LJID = jlib:short_prepd_jid(JID),
+ case catch mnesia:dirty_read(roster, {User, Server, LJID}) of
+ [#roster{subscription = Subscription, groups = Groups}] ->
+ {Subscription, Groups};
+ _ ->
+ LRJID = jlib:short_prepd_bare_jid(JID),
+ if
+ LRJID == LJID ->
+ {none, []};
+ true ->
+ case catch mnesia:dirty_read(
+ roster, {User, Server, LRJID}) of
+ [#roster{subscription = Subscription,
+ groups = Groups}] ->
+ {Subscription, Groups};
+ _ ->
+ {none, []}
+ end
+ end
+ end
+ catch
_ ->
- LRJID = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
- if
- LRJID == LJID ->
- {none, []};
- true ->
- case catch mnesia:dirty_read(
- roster, {LUser, LServer, LRJID}) of
- [#roster{subscription = Subscription,
- groups = Groups}] ->
- {Subscription, Groups};
- _ ->
- {none, []}
- end
- end
+ {none, []}
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% @hidden
update_table() ->
Fields = record_info(fields, roster),
case mnesia:table_info(roster, attributes) of
Fields ->
- ok;
+ convert_to_exmpp();
[uj, user, jid, name, subscription, ask, groups, xattrs, xs] ->
convert_table1(Fields);
[usj, us, jid, name, subscription, ask, groups, xattrs, xs] ->
@@ -876,6 +1060,7 @@ update_table() ->
mnesia:transform_table(roster, ignore, Fields)
end.
+%% @hidden
%% Convert roster table to support virtual host
convert_table1(Fields) ->
@@ -894,11 +1079,18 @@ convert_table1(Fields) ->
F1 = fun() ->
mnesia:write_lock_table(mod_roster_tmp_table),
mnesia:foldl(
- fun(#roster{usj = {U, JID}, us = U} = R, _) ->
+ fun(#roster{usj = {U, {JID_U, JID_S, JID_R}}, us = U, xs = XS, askmessage = AM} = R, _) ->
+ U1 = convert_jid_to_exmpp(U),
+ JID_U1 = convert_jid_to_exmpp(JID_U),
+ JID_R1 = convert_jid_to_exmpp(JID_R),
+ JID1 = {JID_U1, JID_S, JID_R1},
+ XS1 = convert_xs_to_exmpp(XS),
+ AM1 = convert_askmessage_to_exmpp(AM),
mnesia:dirty_write(
mod_roster_tmp_table,
- R#roster{usj = {U, Host, JID},
- us = {U, Host}})
+ R#roster{usj = {U1, Host, JID1},
+ us = {U1, Host}, xs = XS1,
+ askmessage = AM1})
end, ok, roster)
end,
mnesia:transaction(F1),
@@ -913,111 +1105,242 @@ convert_table1(Fields) ->
mnesia:transaction(F2),
mnesia:delete_table(mod_roster_tmp_table).
+%% @hidden
%% Convert roster table: xattrs fields become
convert_table2(Fields) ->
?INFO_MSG("Converting roster table from "
"{usj, us, jid, name, subscription, ask, groups, xattrs, xs} format", []),
- mnesia:transform_table(roster, ignore, Fields).
+ mnesia:transform_table(roster, ignore, Fields),
+ convert_to_exmpp().
+%% @hidden
+
+convert_to_exmpp() ->
+ Fun = fun() ->
+ case mnesia:first(roster) of
+ {_User, Server, _JID} when is_binary(Server) ->
+ none;
+ {_User, Server, _JID} when is_list(Server) ->
+ mnesia:foldl(fun convert_to_exmpp2/2,
+ done, roster, write);
+ '$end_of_table' ->
+ none
+ end
+ end,
+ mnesia:transaction(Fun).
+
+%% @hidden
+
+convert_to_exmpp2(#roster{
+ usj = {USJ_U, USJ_S, {USJ_JU, USJ_JS, USJ_JR}} = Key,
+ us = {US_U, US_S},
+ jid = {JID_U, JID_S, JID_R},
+ name = N, xs = XS, groups = G, askmessage = AM} = R, Acc) ->
+ % Remove old entry.
+ mnesia:delete({roster, Key}),
+ % Convert "" to undefined in JIDs and string() to binary().
+ USJ_U1 = convert_jid_to_exmpp(USJ_U),
+ USJ_S1 = convert_jid_to_exmpp(USJ_S),
+ USJ_JU1 = convert_jid_to_exmpp(USJ_JU),
+ USJ_JS1 = convert_jid_to_exmpp(USJ_JS),
+ USJ_JR1 = convert_jid_to_exmpp(USJ_JR),
+ US_U1 = convert_jid_to_exmpp(US_U),
+ US_S1 = convert_jid_to_exmpp(US_S),
+ JID_U1 = convert_jid_to_exmpp(JID_U),
+ JID_S1 = convert_jid_to_exmpp(JID_S),
+ JID_R1 = convert_jid_to_exmpp(JID_R),
+ % Convert name.
+ N1 = convert_name_to_exmpp(N),
+ % Convert groups.
+ G1 = convert_groups_to_exmpp(G, []),
+ % Convert xs.
+ XS1 = convert_xs_to_exmpp(XS),
+ % Convert askmessage.
+ AM1 = convert_askmessage_to_exmpp(AM),
+ % Prepare the new record.
+ New_R = R#roster{
+ usj = {USJ_U1, USJ_S1, {USJ_JU1, USJ_JS1, USJ_JR1}},
+ us = {US_U1, US_S1},
+ jid = {JID_U1, JID_S1, JID_R1},
+ name = N1, groups = G1, xs = XS1, askmessage = AM1},
+ % Write the new record.
+ mnesia:write(New_R),
+ Acc.
+
+%% @hidden
+
+convert_jid_to_exmpp("") -> undefined;
+convert_jid_to_exmpp(V) when is_list(V) -> list_to_binary(V).
+
+%% @hidden
+
+convert_name_to_exmpp(N) when is_list(N) -> list_to_binary(N).
+
+%% @hidden
+
+convert_groups_to_exmpp([G | Rest], New_G) ->
+ convert_groups_to_exmpp(Rest, [list_to_binary(G) | New_G]);
+convert_groups_to_exmpp([], New_G) ->
+ lists:reverse(New_G).
+
+%% @hidden
+
+convert_xs_to_exmpp(Els) ->
+ convert_xs_to_exmpp(Els, []).
+
+%% @hidden
+
+convert_xs_to_exmpp([El | Rest], Result) ->
+ New_El = exmpp_xml:xmlelement_to_xmlel(El,
+ [?NS_JABBER_CLIENT], [{?NS_XMPP, ?NS_XMPP_pfx}]),
+ convert_xs_to_exmpp(Rest, [New_El | Result]);
+convert_xs_to_exmpp([], Result) ->
+ lists:reverse(Result).
+
+%% @hidden
+
+convert_askmessage_to_exmpp(AM) when is_binary(AM) ->
+ AM;
+convert_askmessage_to_exmpp(AM) ->
+ list_to_binary(AM).
+
+%% @spec (Acc, Host, Request) -> {stop, Result} | Acc
+%% Acc = term()
+%% Host = string()
+%% Request = ejabberd_http:request()
+%% Result = [ejabberd_web:html()]
webadmin_page(_, Host,
#request{us = _US,
path = ["user", U, "roster"],
q = Query,
- lang = Lang} = _Request) ->
- Res = user_roster(U, Host, Query, Lang),
+ lang = Lang} = _Request)
+ when is_list(Host), is_list(U) ->
+ Res = user_roster(list_to_binary(U), list_to_binary(Host), Query, Lang),
{stop, Res};
webadmin_page(Acc, _, _) -> Acc.
-user_roster(User, Server, Query, Lang) ->
- US = {jlib:nodeprep(User), jlib:nameprep(Server)},
- Items1 = mnesia:dirty_index_read(roster, US, #roster.us),
- Res = user_roster_parse_query(User, Server, Items1, Query),
- Items = mnesia:dirty_index_read(roster, US, #roster.us),
- 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")
- ])].
+%% @spec (User, Server, Query, Lang) -> Result
+%% User = binary()
+%% Server = binary()
+%% Query = ejabberd_http:query()
+%% Lang = string()
+%% Result = [ejabberd_web:html()]
-build_contact_jid_td(RosterJID) ->
+user_roster(User, Server, Query, Lang) ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ Items1 = mnesia:dirty_index_read(roster, US, #roster.us),
+ Res = user_roster_parse_query(User, Server, Items1, Query),
+ Items = mnesia:dirty_index_read(roster, US, #roster.us),
+ 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", [?XMLATTR('class', <<"valign">>)],
+ binary_to_list(R#roster.name)),
+ ?XAC("td", [?XMLATTR('class', <<"valign">>)],
+ atom_to_list(R#roster.subscription)),
+ ?XAC("td", [?XMLATTR('class', <<"valign">>)],
+ atom_to_list(Pending)),
+ ?XAE("td", [?XMLATTR('class', <<"valign">>)], Groups),
+ if
+ Pending == in ->
+ ?XAE("td", [?XMLATTR('class', <<"valign">>)],
+ [?INPUTT("submit",
+ "validate" ++
+ ejabberd_web_admin:term_to_id(R#roster.jid),
+ "Validate")]);
+ true ->
+ ?X("td")
+ end,
+ ?XAE("td", [?XMLATTR('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", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
+ FItems ++
+ [?P,
+ ?INPUT("text", "newjid", ""), ?C(" "),
+ ?INPUTT("submit", "addjid", "Add Jabber ID")
+ ])]
+ catch
+ _ ->
+ [?XC("h1", ?T("Roster of ") ++ us_to_list({User, Server}))] ++
+ [?CT("Bad format"), ?P] ++
+ [?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
+ [?P,
+ ?INPUT("text", "newjid", ""), ?C(" "),
+ ?INPUTT("submit", "addjid", "Add Jabber ID")
+ ])]
+ end.
+
+%% @spec (JID) -> Result
+%% JID = jlib:shortjid()
+%% Result = ejabberd_web:html()
+
+build_contact_jid_td({U, S, R}) ->
%% 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
- {"", _} -> "";
+ ContactJID = exmpp_jid:make(U, S, R),
+ JIDURI = case {exmpp_jid:prep_node(ContactJID), exmpp_jid:prep_domain(ContactJID)} of
+ {undefined, _} -> "";
{CUser, CServer} ->
- case lists:member(CServer, ?MYHOSTS) of
+ CUser_S = binary_to_list(CUser),
+ CServer_S = binary_to_list(CServer),
+ case lists:member(CServer_S, ?MYHOSTS) of
false -> "";
- true -> "/admin/server/" ++ CServer ++ "/user/" ++ CUser ++ "/"
+ true -> "/admin/server/" ++ CServer_S ++ "/user/" ++ CUser_S ++ "/"
end
end,
case JIDURI of
[] ->
- ?XAC("td", [{"class", "valign"}], jlib:jid_to_string(RosterJID));
+ ?XAC('td', [?XMLATTR('class', <<"valign">>)], exmpp_jid:to_list(ContactJID));
URI when is_list(URI) ->
- ?XAE("td", [{"class", "valign"}], [?AC(JIDURI, jlib:jid_to_string(RosterJID))])
+ ?XAE('td', [?XMLATTR('class', <<"valign">>)], [?AC(JIDURI, exmpp_jid:to_list(ContactJID))])
end.
+%% @spec (User, Server, Items, Query) -> ok | nothing | error
+%% User = binary()
+%% Server = binary()
+%% Items = [rosteritem()]
+%% Query = ejabberd_http:query()
+
user_roster_parse_query(User, Server, Items, Query) ->
case lists:keysearch("addjid", 1, Query) of
{value, _} ->
@@ -1025,11 +1348,12 @@ user_roster_parse_query(User, Server, Items, Query) ->
{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 ->
+ try
+ JID = exmpp_jid:parse(SJID),
+ user_roster_subscribe_jid(User, Server, JID),
+ ok
+ catch
+ _ ->
error
end;
false ->
@@ -1047,42 +1371,57 @@ user_roster_parse_query(User, Server, Items, Query) ->
end
end.
+%% @spec (User, Server, JID) -> term()
+%% User = binary()
+%% Server = binary()
+%% JID = exmpp_jid:jid()
user_roster_subscribe_jid(User, Server, JID) ->
out_subscription(User, Server, JID, subscribe),
- UJID = jlib:make_jid(User, Server, ""),
+ UJID = exmpp_jid:make(User, Server),
ejabberd_router:route(
- UJID, JID, {xmlelement, "presence", [{"type", "subscribe"}], []}).
+ UJID, JID, exmpp_presence:subscribe()).
+
+%% @spec (User, Server, Items, Query) -> term()
+%% User = binary()
+%% Server = binary()
+%% Items = [rosteritem()]
+%% Query = ejabberd_http:query()
user_roster_item_parse_query(User, Server, Items, Query) ->
lists:foreach(
- fun(R) ->
- JID = R#roster.jid,
+ fun(Roster) ->
+ JID = Roster#roster.jid,
case lists:keysearch(
"validate" ++ ejabberd_web_admin:term_to_id(JID), 1, Query) of
{value, _} ->
- JID1 = jlib:make_jid(JID),
+ {U, S, R} = JID,
+ JID1 = exmpp_jid:make(U, S, R),
out_subscription(
User, Server, JID1, subscribed),
- UJID = jlib:make_jid(User, Server, ""),
+ UJID = exmpp_jid:make(User, Server),
ejabberd_router:route(
- UJID, JID1, {xmlelement, "presence",
- [{"type", "subscribed"}], []}),
+ UJID, JID1, exmpp_presence: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, ""),
+ {U, S, R} = JID,
+ UJID = exmpp_jid:make(User, Server),
+ Attrs1 = exmpp_xml:set_attribute_in_list([],
+ 'jid', exmpp_jid:to_list(U, S, R)),
+ Attrs2 = exmpp_xml:set_attribute_in_list(Attrs1,
+ 'subscription', "remove"),
+ Item = #xmlel{ns = ?NS_ROSTER, name = 'item',
+ attrs = Attrs2},
+ Request = #xmlel{
+ ns = ?NS_ROSTER,
+ name = 'query',
+ children = [Item]},
process_iq(
UJID, UJID,
- #iq{type = set,
- sub_el = {xmlelement, "query",
- [{"xmlns", ?NS_ROSTER}],
- [{xmlelement, "item",
- [{"jid", jlib:jid_to_string(JID)},
- {"subscription", "remove"}],
- []}]}}),
+ exmpp_iq:set(?NS_JABBER_CLIENT, Request)),
throw(submitted);
false ->
ok
@@ -1092,9 +1431,21 @@ user_roster_item_parse_query(User, Server, Items, Query) ->
end, Items),
nothing.
+%% @spec ({User, Server}) -> string()
+%% User = binary()
+%% Server = binary()
+
us_to_list({User, Server}) ->
- jlib:jid_to_string({User, Server, ""}).
+ exmpp_jid:bare_to_list(User, Server).
+
+%% @spec (Acc, User, Server, Lang) -> New_Acc
+%% Acc = [ejabberd_web:html()]
+%% User = string()
+%% Server = string()
+%% Lang = string()
+%% New_Acc = [ejabberd_web:html()]
webadmin_user(Acc, _User, _Server, Lang) ->
+ % `Lang' is used by the `T' macro, called from the `ACT' macro.
Acc ++ [?XE("h3", [?ACT("roster/", "Roster")])].
diff --git a/src/mod_roster.hrl b/src/mod_roster.hrl
index 58d93dbc8..242f1d05a 100644
--- a/src/mod_roster.hrl
+++ b/src/mod_roster.hrl
@@ -22,11 +22,11 @@
-record(roster, {usj,
us,
jid,
- name = "",
+ name = <<>>,
subscription = none,
ask = none,
groups = [],
- askmessage = [],
+ askmessage = <<>>,
xs = []}).
-record(roster_version, {us,
diff --git a/src/mod_roster_odbc.erl b/src/mod_roster_odbc.erl
index 9fb36bd9d..536da1efa 100644
--- a/src/mod_roster_odbc.erl
+++ b/src/mod_roster_odbc.erl
@@ -54,83 +54,84 @@
get_versioning_feature/2,
roster_versioning_enabled/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_roster.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
+-define(NS_ROSTER_VER, "urn:xmpp:features:rosterver").
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- ejabberd_hooks:add(roster_get, Host,
+ ejabberd_hooks:add(roster_get, HostB,
?MODULE, get_user_roster, 50),
- ejabberd_hooks:add(roster_in_subscription, Host,
+ ejabberd_hooks:add(roster_in_subscription, HostB,
?MODULE, in_subscription, 50),
- ejabberd_hooks:add(roster_out_subscription, Host,
+ ejabberd_hooks:add(roster_out_subscription, HostB,
?MODULE, out_subscription, 50),
- ejabberd_hooks:add(roster_get_subscription_lists, Host,
+ ejabberd_hooks:add(roster_get_subscription_lists, HostB,
?MODULE, get_subscription_lists, 50),
- ejabberd_hooks:add(roster_get_jid_info, Host,
+ ejabberd_hooks:add(roster_get_jid_info, HostB,
?MODULE, get_jid_info, 50),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(anonymous_purge_hook, Host,
+ ejabberd_hooks:add(anonymous_purge_hook, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:add(resend_subscription_requests_hook, Host,
+ ejabberd_hooks:add(resend_subscription_requests_hook, HostB,
?MODULE, get_in_pending_subscriptions, 50),
- ejabberd_hooks:add(roster_get_versioning_feature, Host,
+ ejabberd_hooks:add(roster_get_versioning_feature, HostB,
?MODULE, get_versioning_feature, 50),
- ejabberd_hooks:add(webadmin_page_host, Host,
+ ejabberd_hooks:add(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:add(webadmin_user, Host,
+ ejabberd_hooks:add(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_ROSTER,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_ROSTER,
?MODULE, process_iq, IQDisc).
stop(Host) ->
- ejabberd_hooks:delete(roster_get, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(roster_get, HostB,
?MODULE, get_user_roster, 50),
- ejabberd_hooks:delete(roster_in_subscription, Host,
+ ejabberd_hooks:delete(roster_in_subscription, HostB,
?MODULE, in_subscription, 50),
- ejabberd_hooks:delete(roster_out_subscription, Host,
+ ejabberd_hooks:delete(roster_out_subscription, HostB,
?MODULE, out_subscription, 50),
- ejabberd_hooks:delete(roster_get_subscription_lists, Host,
+ ejabberd_hooks:delete(roster_get_subscription_lists, HostB,
?MODULE, get_subscription_lists, 50),
- ejabberd_hooks:delete(roster_get_jid_info, Host,
+ ejabberd_hooks:delete(roster_get_jid_info, HostB,
?MODULE, get_jid_info, 50),
- ejabberd_hooks:delete(remove_user, Host,
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(anonymous_purge_hook, Host,
+ ejabberd_hooks:delete(anonymous_purge_hook, HostB,
?MODULE, remove_user, 50),
- ejabberd_hooks:delete(resend_subscription_requests_hook, Host,
+ ejabberd_hooks:delete(resend_subscription_requests_hook, HostB,
?MODULE, get_in_pending_subscriptions, 50),
- ejabberd_hooks:delete(roster_get_versioning_feature, Host,
+ ejabberd_hooks:delete(roster_get_versioning_feature, HostB,
?MODULE, get_versioning_feature, 50),
- ejabberd_hooks:delete(webadmin_page_host, Host,
+ ejabberd_hooks:delete(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:delete(webadmin_user, Host,
+ ejabberd_hooks:delete(webadmin_user, HostB,
?MODULE, webadmin_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_ROSTER).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_ROSTER).
-process_iq(From, To, IQ) ->
- #iq{sub_el = SubEl} = IQ,
- #jid{lserver = LServer} = From,
+process_iq(From, To, IQ_Rec) ->
+ LServer = exmpp_jid:prep_domain_as_list(From),
case lists:member(LServer, ?MYHOSTS) of
true ->
- process_local_iq(From, To, IQ);
+ process_local_iq(From, To, IQ_Rec);
_ ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]}
+ exmpp_iq:error(IQ_Rec, '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.
+process_local_iq(From, To, #iq{type = get} = IQ_Rec) ->
+ process_iq_get(From, To, IQ_Rec);
+process_local_iq(From, To, #iq{type = set} = IQ_Rec) ->
+ process_iq_set(From, To, IQ_Rec).
+
roster_hash(Items) ->
@@ -139,20 +140,20 @@ roster_hash(Items) ->
[R#roster{groups = lists:sort(Grs)} ||
R = #roster{groups = Grs} <- Items]))).
-roster_versioning_enabled(Host) ->
- gen_mod:get_module_opt(Host, ?MODULE, versioning, false).
+%% @spec (Host::binary()) -> true | false
+roster_versioning_enabled(Host) ->
+ gen_mod:get_module_opt(binary_to_list(Host), ?MODULE, versioning, false).
+%% @spec (Host::binary()) -> true | false
roster_version_on_db(Host) ->
- gen_mod:get_module_opt(Host, ?MODULE, store_current_id, false).
+ gen_mod:get_module_opt(binary_to_list(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 = exmpp_xml:element(?NS_ROSTER_VER, 'ver', [],
+ [exmpp_xml:element(?NS_ROSTER_VER, 'optional')]),
[Feature | Acc];
false -> []
end.
@@ -168,24 +169,28 @@ roster_version(LServer ,LUser) ->
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},
-
+process_iq_get(From, To, IQ_Rec) ->
+ US = {LUser, LServer} = {exmpp_jid:prep_node(From), exmpp_jid:prep_domain(From)},
try
{ItemsToSend, VersionToSend} =
- case {xml:get_tag_attr("ver", SubEl),
+ case {exmpp_xml:get_attribute_as_list(exmpp_iq:get_request(IQ_Rec), ver, not_found),
roster_versioning_enabled(LServer),
roster_version_on_db(LServer)} of
- {{value, RequestedVersion}, true, true} ->
+ {not_found, _ , _} ->
+ {lists:map(fun item_to_xml/1,
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), false};
+ {_, false, _} ->
+ {lists:map(fun item_to_xml/1,
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), false};
+
+ {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
@@ -193,40 +198,38 @@ process_iq_get(From, To, #iq{sub_el = SubEl} = IQ) ->
{false, false};
{selected, ["version"], [{NewVersion}]} ->
{lists:map(fun item_to_xml/1,
- ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [], [US])), NewVersion};
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), NewVersion};
{selected, ["version"], []} ->
RosterVersion = sha:sha(term_to_binary(now())),
- {atomic, {updated,1}} = odbc_queries:sql_transaction(LServer, fun() ->
+ {atomic, {updated,1}} = odbc_queries:sql_transaction(binary_to_list(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}
+ ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [], [US])), RosterVersion}
end;
- {{value, RequestedVersion}, true, false} ->
- RosterItems = ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [] , [US]),
+ {RequestedVersion, true, false} ->
+ RosterItems = ejabberd_hooks:run_fold(roster_get, exmpp_jid:prep_domain(To), [] , [US]),
case roster_hash(RosterItems) of
RequestedVersion ->
{false, false};
New ->
{lists:map(fun item_to_xml/1, RosterItems), New}
- end;
+ 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}
+ case {ItemsToSend, VersionToSend} of
+ {false, false} ->
+ exmpp_iq:result(IQ_Rec);
+ {Items, false} ->
+ exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [] , Items));
+ {Items, Version} ->
+ exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [?XMLATTR('ver', Version)], Items))
+ end
catch
_:_ ->
- IQ#iq{type =error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
- end.
-
+ exmpp_iq:error(IQ_Rec, 'internal-server-error')
+ end.
get_user_roster(Acc, {LUser, LServer}) ->
Items = get_roster(LUser, LServer),
@@ -236,16 +239,17 @@ get_user_roster(Acc, {LUser, LServer}) ->
true
end, Items) ++ Acc.
-get_roster(LUser, LServer) ->
+get_roster(LUser, LServer) when is_binary(LUser), is_binary(LServer)->
Username = ejabberd_odbc:escape(LUser),
- case catch odbc_queries:get_roster(LServer, Username) of
+ DomainString = binary_to_list(LServer),
+ case catch odbc_queries:get_roster(DomainString, 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
+ JIDGroups = case catch odbc_queries:get_roster_jid_groups(DomainString, Username) of
{selected, ["jid","grp"], JGrps}
when is_list(JGrps) ->
- JGrps;
+ [{list_to_binary(S), list_to_binary(G)} || {S, G} <- JGrps];
_ ->
[]
end,
@@ -256,7 +260,8 @@ get_roster(LUser, LServer) ->
error ->
[];
R ->
- SJID = jlib:jid_to_string(R#roster.jid),
+ {U2, S2, R2} = R#roster.jid,
+ SJID = exmpp_jid:to_binary(U2, S2, R2),
Groups = lists:flatmap(
fun({S, G}) when S == SJID ->
[G];
@@ -273,140 +278,157 @@ get_roster(LUser, LServer) ->
item_to_xml(Item) ->
- Attrs1 = [{"jid", jlib:jid_to_string(Item#roster.jid)}],
+ {U, S, R} = Item#roster.jid,
+ Attrs1 = exmpp_xml:set_attribute_in_list([],
+ 'jid', exmpp_jid:to_binary(U, S, R)),
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]
+ exmpp_xml:set_attribute_in_list(Attrs1, 'name', Name)
end,
+ Attrs3 = exmpp_xml:set_attribute_in_list(Attrs2,
+ 'subscription', Item#roster.subscription),
Attrs = case ask_to_pending(Item#roster.ask) of
out ->
- [{"ask", "subscribe"} | Attrs3];
+ exmpp_xml:set_attribute_in_list(Attrs3,
+ 'ask', <<"subscribe">>);
both ->
- [{"ask", "subscribe"} | Attrs3];
+ exmpp_xml:set_attribute_in_list(Attrs3,
+ 'ask', <<"subscribe">>);
_ ->
Attrs3
end,
SubEls = lists:map(fun(G) ->
- {xmlelement, "group", [], [{xmlcdata, G}]}
+ exmpp_xml:set_cdata(
+ #xmlel{ns = ?NS_ROSTER, name = 'group'}, G)
end, Item#roster.groups),
- {xmlelement, "item", Attrs, SubEls}.
+ #xmlel{ns = ?NS_ROSTER, name = 'item', attrs = Attrs, children = 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;
+process_iq_set(From, To, #iq{payload = Request} = IQ_Rec) ->
+ case Request of
+ #xmlel{children = Els} ->
+ lists:foreach(fun(El) -> process_item_set(From, To, El) end, Els);
_ ->
- 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 ->
- io:format("del_roster: ~p ~p ~p \n", [LServer, Username, SJID]),
- 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
+ ok
+ end,
+ exmpp_iq:result(IQ_Rec).
+
+process_item_set(From, To, #xmlel{} = El) ->
+ try
+ JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, 'jid', <<>>)),
+ User = exmpp_jid:prep_node(From),
+ Server = exmpp_jid:prep_domain(From),
+ LServer = binary_to_list(Server),
+ {U0, S0, R0} = LJID = jlib:short_prepd_jid(JID1),
+ Username = ejabberd_odbc:escape(User),
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_binary(U0, S0, R0)),
+ 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 = {User, Server, LJID},
+ us = {User, Server},
+ jid = LJID};
+ [I] ->
+ R = raw_to_record(exmpp_jid:prep_domain(From), I),
+ case R of
+ %% Bad JID in database:
+ error ->
+ #roster{usj = {User, Server, LJID},
+ us = {User, Server},
+ jid = LJID};
+ _ ->
+ R#roster{
+ usj = {User, Server, LJID},
+ us = {User, Server},
+ jid = LJID,
+ name = <<>>}
+ end
+ end,
+ Item1 = process_item_attrs(Item, El#xmlel.attrs),
+ Item2 = process_item_els(Item1, El#xmlel.children),
+ case Item2#roster.subscription of
remove ->
- send_unsubscribing_presence(From, OldItem),
- ok;
+ odbc_queries:del_roster(LServer, Username, SJID);
_ ->
- ok
- end;
- E ->
- ?DEBUG("ROSTER: roster item set error: ~p~n", [E]),
- ok
- end
+ 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,
+ exmpp_jid:prep_domain(From), Item2, [exmpp_jid:prep_domain(From)]),
+ case roster_version_on_db(Server) of
+ true -> odbc_queries:set_roster_version(Username, 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(exmpp_jid:node(From), exmpp_jid:prep_domain(From), To, Item),
+ case Item#roster.subscription of
+ remove ->
+ IsTo = case OldItem#roster.subscription of
+ both -> true;
+ to -> true;
+ _ -> false
+ end,
+ IsFrom = case OldItem#roster.subscription of
+ both -> true;
+ from -> true;
+ _ -> false
+ end,
+ {U, S, R} = OldItem#roster.jid,
+ if IsTo ->
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ exmpp_jid:make(U, S, R),
+ exmpp_presence:unsubscribe());
+ true -> ok
+ end,
+ if IsFrom ->
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ exmpp_jid:make(U, S, R),
+ exmpp_presence:unsubscribed());
+ true -> ok
+ end,
+ ok;
+ _ ->
+ ok
+ end;
+ E ->
+ ?DEBUG("ROSTER: roster item set error: ~p~n", [E]),
+ ok
+ end
+ catch
+ _ ->
+ ok
end;
process_item_set(_From, _To, _) ->
ok.
-process_item_attrs(Item, [{Attr, Val} | Attrs]) ->
+process_item_attrs(Item, [#xmlattr{name = Attr, value = 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" ->
+ 'name' ->
process_item_attrs(Item#roster{name = Val}, Attrs);
- "subscription" ->
+ 'subscription' ->
case Val of
- "remove" ->
+ <<"remove">> ->
process_item_attrs(Item#roster{subscription = remove},
Attrs);
_ ->
process_item_attrs(Item, Attrs)
end;
- "ask" ->
+ 'ask' ->
process_item_attrs(Item, Attrs);
_ ->
process_item_attrs(Item, Attrs)
@@ -415,47 +437,47 @@ process_item_attrs(Item, []) ->
Item.
-process_item_els(Item, [{xmlelement, Name, _Attrs, SEls} | Els]) ->
+process_item_els(Item, [#xmlel{name = Name} = El | Els]) ->
case Name of
- "group" ->
- Groups = [xml:get_cdata(SEls) | Item#roster.groups],
+ 'group' ->
+ Groups = [exmpp_xml:get_cdata(El) | 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, 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", [],
+push_item(User, Server, From, Item) when is_binary(User), is_binary(Server) ->
+ ejabberd_sm:route(exmpp_jid:make(),
+ exmpp_jid:make(User, Server),
+ #xmlel{name = 'broadcast', children =
[{item,
Item#roster.jid,
Item#roster.subscription}]}),
case roster_versioning_enabled(Server) of
- true ->
+ true ->
push_item_version(Server, User, From, Item, roster_version(Server, User));
false ->
lists:foreach(fun(Resource) ->
- push_item(User, Server, Resource, From, Item)
+ 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)]}]},
+ Request = #xmlel{ns = ?NS_ROSTER, name = 'query',
+ children = [item_to_xml(Item)]},
+ ResIQ = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
+ "push" ++ randoms:get_string()),
ejabberd_router:route(
From,
- jlib:make_jid(User, Server, Resource),
- jlib:iq_to_xml(ResIQ)).
+ exmpp_jid:make(User, Server, Resource),
+ ResIQ).
%% @doc Roster push, calculate and include the version attribute.
%% TODO: don't push to those who didn't load roster
@@ -465,26 +487,29 @@ push_item_version(Server, User, 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)]}]},
+ Request = #xmlel{ns = ?NS_ROSTER, name = 'query', attrs = [?XMLATTR('ver', RosterVersion)],
+ children = [mod_roster:item_to_xml(Item)]},
+ ResIQ = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
+ "push" ++ randoms:get_string()),
ejabberd_router:route(
From,
- jlib:make_jid(User, Server, Resource),
- jlib:iq_to_xml(IQPush)).
+ exmpp_jid:make(User, Server, Resource),
+ ResIQ).
-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, [], []);
+get_subscription_lists(_, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LServer = binary_to_list(Server),
+ Username = ejabberd_odbc:escape(User),
+ 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(Server, Items, [], []);
+ _ ->
+ {[], []}
+ end
+ catch
_ ->
{[], []}
end.
@@ -521,111 +546,116 @@ 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(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];
- _ ->
- []
+process_subscription(Direction, User, Server, JID1, Type, Reason)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LServer = binary_to_list(Server),
+ {N0,D0,R0} = LJID = jlib:short_prepd_jid(JID1),
+ Username = ejabberd_odbc:escape(User),
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_binary(N0,D0,R0)),
+ 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(list_to_binary(LServer), I),
+ Groups =
+ case odbc_queries:get_roster_groups(LServer, Username, SJID) of
+ {selected, ["grp"], JGrps} when is_list(JGrps) ->
+ [list_to_binary(JGrp) || {JGrp} <- JGrps];
+ _ ->
+ []
+ end,
+ R#roster{groups = Groups};
+ {selected,
+ ["username", "jid", "nick", "subscription", "ask",
+ "askmessage", "server", "subscribe", "type"],
+ []} ->
+ #roster{usj = {User, Server, LJID},
+ us = {User, Server},
+ 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,
- 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())));
+ 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} ->
+ AskBinary = case AskMessage of
+ undefined -> <<>>;
+ B -> B
+ end,
+ NewItem = Item#roster{subscription = Subscription,
+ ask = Pending,
+ askmessage = AskBinary},
+ ItemVals = record_to_string(NewItem),
+ odbc_queries:roster_subscribe(LServer, Username, SJID, ItemVals),
+ case roster_version_on_db(Server) of
+ true -> odbc_queries:set_roster_version(Username, 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,
+ {{push, NewItem}, AutoReply}
+ end
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;
+ case odbc_queries:sql_transaction(LServer, F) of
+ {atomic, {Push, AutoReply}} ->
+ case AutoReply of
+ none ->
+ ok;
+ _ ->
+ ejabberd_router:route(
+ exmpp_jid:make(User, Server), JID1,
+ exmpp_presence:AutoReply())
+ end,
+ case Push of
+ {push, Item} ->
+ if
+ Item#roster.subscription == none,
+ Item#roster.ask == in ->
+ ok;
+ true ->
+ push_item(User, Server,
+ exmpp_jid:make(User, Server), Item)
+ end,
+ true;
+ none ->
+ false
+ end;
+ _ ->
+ false
+ end
+ catch
_ ->
false
end.
@@ -727,13 +757,18 @@ 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.
+remove_user(User, Server) when is_binary(User), is_binary(Server) ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = binary_to_list(exmpp_stringprep:nameprep(Server)),
+ Username = ejabberd_odbc:escape(LUser),
+ send_unsubscription_to_rosteritems(LUser, LServer),
+ odbc_queries:del_user_roster_t(LServer, Username),
+ ok
+ catch
+ _ ->
+ ok
+ end.
%% For each contact with Subscription:
%% Both or From, send a "unsubscribed" presence stanza;
@@ -758,99 +793,88 @@ send_unsubscribing_presence(From, Item) ->
from -> true;
_ -> false
end,
+ {INode, IDom, IRes} = Item#roster.jid,
+ SendToJID = exmpp_jid:make(INode, IDom, IRes),
if IsTo ->
- send_presence_type(
- jlib:jid_remove_resource(From),
- jlib:make_jid(Item#roster.jid), "unsubscribe");
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ SendToJID,
+ exmpp_presence:unsubscribe());
true -> ok
end,
if IsFrom ->
- send_presence_type(
- jlib:jid_remove_resource(From),
- jlib:make_jid(Item#roster.jid), "unsubscribed");
+ ejabberd_router:route(
+ exmpp_jid:bare(From),
+ SendToJID,
+ exmpp_presence: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),
+set_items(User, Server, #xmlel{children = Els}) when is_binary(User), is_binary(Server) ->
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep: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 ->
- [];
+process_item_set_t(LUser, LServer, #xmlel{} = El) ->
+ try
+ JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, 'jid', <<>>)),
+ {U0, S0, R0} = LJID = jlib:short_prepd_jid(JID1),
+ Username = ejabberd_odbc:escape(LUser),
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_binary(U0, S0, R0)),
+ Item = #roster{usj = {LUser, LServer, LJID},
+ us = {LUser, LServer},
+ jid = LJID},
+ Item1 = process_item_attrs_ws(Item, El#xmlel.attrs),
+ Item2 = process_item_els(Item1, El#xmlel.children),
+ 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
+ catch
_ ->
- 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]) ->
+process_item_attrs_ws(Item, [#xmlattr{name = Attr, value = 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" ->
+ 'name' ->
process_item_attrs_ws(Item#roster{name = Val}, Attrs);
- "subscription" ->
+ 'subscription' ->
case Val of
- "remove" ->
+ <<"remove">> ->
process_item_attrs_ws(Item#roster{subscription = remove},
Attrs);
- "none" ->
+ <<"none">> ->
process_item_attrs_ws(Item#roster{subscription = none},
Attrs);
- "both" ->
+ <<"both">> ->
process_item_attrs_ws(Item#roster{subscription = both},
Attrs);
- "from" ->
+ <<"from">> ->
process_item_attrs_ws(Item#roster{subscription = from},
Attrs);
- "to" ->
+ <<"to">> ->
process_item_attrs_ws(Item#roster{subscription = to},
Attrs);
_ ->
process_item_attrs_ws(Item, Attrs)
end;
- "ask" ->
+ 'ask' ->
process_item_attrs_ws(Item, Attrs);
_ ->
process_item_attrs_ws(Item, Attrs)
@@ -858,10 +882,11 @@ process_item_attrs_ws(Item, [{Attr, Val} | Attrs]) ->
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,
+get_in_pending_subscriptions(Ls, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ JID = exmpp_jid:make(User, Server),
+ LUser = exmpp_jid:prep_node(JID),
+ LServer = exmpp_jid:prep_domain_as_list(JID),
Username = ejabberd_odbc:escape(LUser),
case catch odbc_queries:get_roster(LServer, Username) of
{selected, ["username", "jid", "nick", "subscription", "ask",
@@ -870,16 +895,16 @@ get_in_pending_subscriptions(Ls, User, Server) ->
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}]}]}
+ {U0, S0, R0} = R#roster.jid,
+ Pres1 = exmpp_presence:subscribe(),
+ Pres2 = exmpp_stanza:set_jids(Pres1,
+ exmpp_jid:to_binary(U0, S0, R0),
+ exmpp_jid:to_binary(JID)),
+ exmpp_presence:set_status(Pres2, Message)
end,
lists:flatmap(
fun(I) ->
- case raw_to_record(LServer, I) of
+ case raw_to_record(exmpp_jid:prep_domain(JID), I) of
%% Bad JID in database:
error ->
[];
@@ -898,86 +923,94 @@ get_in_pending_subscriptions(Ls, User, Server) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-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};
+%% JID is jid() record, because it's used latter on for both short_prepd_jid
+%% and short_prepd_bare_jid
+get_jid_info(_, User, Server, JID) when is_binary(User), is_binary(Server) ->
+ try
+ LServer = binary_to_list(Server),
+ LJID = {N, D, R} = jlib:short_prepd_jid(JID),
+ Username = ejabberd_odbc:escape(User),
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_binary(N, D, R)),
+ 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) ->
+ [list_to_binary(JGrp) || {JGrp} <- JGrps];
+ _ ->
+ []
+ end,
+ {Subscription, Groups};
+ _ ->
+ LRJID = jlib:short_prepd_bare_jid(JID),
+ if
+ LRJID == LJID ->
+ {none, []};
+ true ->
+ {LR_N, LR_D, LR_R} = LRJID,
+ SRJID = ejabberd_odbc:escape(exmpp_jid:to_binary(LR_N, LR_D, LR_R)),
+ 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) ->
+ [list_to_binary(JGrp) || {JGrp} <- JGrps];
+ _ ->
+ []
+ end,
+ {Subscription, Groups};
+ _ ->
+ {none, []}
+ end
+ end
+ end
+ catch
_ ->
- 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
+ {none, []}
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}
+ _SServer, _SSubscribe, _SType}) when is_binary(LServer) ->
+ try
+ JID = exmpp_jid:parse(SJID),
+ LJID = jlib:short_prepd_jid(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,
+ UserB = list_to_binary(User),
+ #roster{usj = {UserB, LServer, LJID},
+ us = {UserB, LServer},
+ jid = LJID,
+ name = list_to_binary(Nick),
+ subscription = Subscription,
+ ask = Ask,
+ askmessage = list_to_binary(SAskMessage)}
+ catch
+ _ ->
+ error
end.
record_to_string(#roster{us = {User, _Server},
@@ -987,7 +1020,8 @@ record_to_string(#roster{us = {User, _Server},
ask = Ask,
askmessage = AskMessage}) ->
Username = ejabberd_odbc:escape(User),
- SJID = ejabberd_odbc:escape(jlib:jid_to_string(jlib:jid_tolower(JID))),
+ {U, S, R} = JID,
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_binary(U, S, R)),
Nick = ejabberd_odbc:escape(Name),
SSubscription = case Subscription of
both -> "B";
@@ -1010,7 +1044,8 @@ 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))),
+ {U, S, R} = JID,
+ SJID = ejabberd_odbc:escape(exmpp_jid:to_binary(U, S, R)),
%% Empty groups do not need to be converted to string to be inserted in
%% the database
@@ -1031,92 +1066,105 @@ webadmin_page(_, Host,
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")
- ])].
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep: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", [?XMLATTR('class', <<"valign">>)],
+ binary_to_list(R#roster.name)),
+ ?XAC("td", [?XMLATTR('class', <<"valign">>)],
+ atom_to_list(R#roster.subscription)),
+ ?XAC("td", [?XMLATTR('class', <<"valign">>)],
+ atom_to_list(Pending)),
+ ?XAE("td", [?XMLATTR('class', <<"valign">>)], Groups),
+ if
+ Pending == in ->
+ ?XAE("td", [?XMLATTR('class', <<"valign">>)],
+ [?INPUTT("submit",
+ "validate" ++
+ ejabberd_web_admin:term_to_id(R#roster.jid),
+ "Validate")]);
+ true ->
+ ?X("td")
+ end,
+ ?XAE("td", [?XMLATTR('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", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
+ FItems ++
+ [?P,
+ ?INPUT("text", "newjid", ""), ?C(" "),
+ ?INPUTT("submit", "addjid", "Add Jabber ID")
+ ])]
+ catch
+ _ ->
+ [?XC("h1", ?T("Roster of ") ++ us_to_list({User, Server}))] ++
+ [?CT("Bad format"), ?P] ++
+ [?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
+ [?P,
+ ?INPUT("text", "newjid", ""), ?C(" "),
+ ?INPUTT("submit", "addjid", "Add Jabber ID")
+ ])]
+ end.
-build_contact_jid_td(RosterJID) ->
+build_contact_jid_td({U, S, R}) ->
%% 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
- {"", _} -> "";
+ ContactJID = exmpp_jid:make(U, S, R),
+ JIDURI = case {exmpp_jid:prep_node(ContactJID), exmpp_jid:prep_domain(ContactJID)} of
+ {undefined, _} -> "";
{CUser, CServer} ->
- case lists:member(CServer, ?MYHOSTS) of
+ CUser_S = binary_to_list(CUser),
+ CServer_S = binary_to_list(CServer),
+ case lists:member(CServer_S, ?MYHOSTS) of
false -> "";
- true -> "/admin/server/" ++ CServer ++ "/user/" ++ CUser ++ "/"
+ true -> "/admin/server/" ++ CServer_S ++ "/user/" ++ CUser_S ++ "/"
end
end,
case JIDURI of
[] ->
- ?XAC("td", [{"class", "valign"}], jlib:jid_to_string(RosterJID));
+ ?XAC('td', [?XMLATTR('class', <<"valign">>)], exmpp_jid:to_list(ContactJID));
URI when is_list(URI) ->
- ?XAE("td", [{"class", "valign"}], [?AC(JIDURI, jlib:jid_to_string(RosterJID))])
+ ?XAE('td', [?XMLATTR('class', <<"valign">>)], [?AC(JIDURI, exmpp_jid:to_list(ContactJID))])
end.
user_roster_parse_query(User, Server, Items, Query) ->
@@ -1126,11 +1174,12 @@ user_roster_parse_query(User, Server, Items, Query) ->
{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 ->
+ try
+ JID = exmpp_jid:parse(SJID),
+ user_roster_subscribe_jid(User, Server, JID),
+ ok
+ catch
+ _ ->
error
end;
false ->
@@ -1151,9 +1200,9 @@ user_roster_parse_query(User, Server, Items, Query) ->
user_roster_subscribe_jid(User, Server, JID) ->
out_subscription(User, Server, JID, subscribe),
- UJID = jlib:make_jid(User, Server, ""),
+ UJID = exmpp_jid:make(User, Server),
ejabberd_router:route(
- UJID, JID, {xmlelement, "presence", [{"type", "subscribe"}], []}).
+ UJID, JID, exmpp_presence:subscribe()).
user_roster_item_parse_query(User, Server, Items, Query) ->
lists:foreach(
@@ -1162,28 +1211,32 @@ user_roster_item_parse_query(User, Server, Items, Query) ->
case lists:keysearch(
"validate" ++ ejabberd_web_admin:term_to_id(JID), 1, Query) of
{value, _} ->
- JID1 = jlib:make_jid(JID),
+ {U, S, R} = JID,
+ JID1 = exmpp_jid:make(U, S, R),
out_subscription(
User, Server, JID1, subscribed),
- UJID = jlib:make_jid(User, Server, ""),
+ UJID = exmpp_jid:make(User, Server),
ejabberd_router:route(
- UJID, JID1, {xmlelement, "presence",
- [{"type", "subscribed"}], []}),
+ UJID, JID1, exmpp_presence: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, ""),
+ UJID = exmpp_jid:make(User, Server),
+ Attrs1 = exmpp_xml:set_attribute_in_list([],
+ 'jid', exmpp_jid:to_list(JID)),
+ Attrs2 = exmpp_xml:set_attribute_in_list(Attrs1,
+ 'subscription', "remove"),
+ Item = #xmlel{ns = ?NS_ROSTER, name = 'item',
+ attrs = Attrs2},
+ Request = #xmlel{
+ ns = ?NS_ROSTER,
+ name = 'query',
+ children = [Item]},
process_iq(
UJID, UJID,
- #iq{type = set,
- sub_el = {xmlelement, "query",
- [{"xmlns", ?NS_ROSTER}],
- [{xmlelement, "item",
- [{"jid", jlib:jid_to_string(JID)},
- {"subscription", "remove"}],
- []}]}}),
+ exmpp_iq:set(?NS_JABBER_CLIENT, Request)),
throw(submitted);
false ->
ok
@@ -1194,7 +1247,7 @@ user_roster_item_parse_query(User, Server, Items, Query) ->
nothing.
us_to_list({User, Server}) ->
- jlib:jid_to_string({User, Server, ""}).
+ exmpp_jid:bare_to_list(User, Server).
webadmin_user(Acc, _User, _Server, Lang) ->
Acc ++ [?XE("h3", [?ACT("roster/", "Roster")])].
diff --git a/src/mod_service_log.erl b/src/mod_service_log.erl
index da2219d86..66d2599b9 100644
--- a/src/mod_service_log.erl
+++ b/src/mod_service_log.erl
@@ -34,44 +34,42 @@
log_user_send/3,
log_user_receive/4]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
start(Host, _Opts) ->
- ejabberd_hooks:add(user_send_packet, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:add(user_send_packet, HostB,
?MODULE, log_user_send, 50),
- ejabberd_hooks:add(user_receive_packet, Host,
+ ejabberd_hooks:add(user_receive_packet, HostB,
?MODULE, log_user_receive, 50),
ok.
stop(Host) ->
- ejabberd_hooks:delete(user_send_packet, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(user_send_packet, HostB,
?MODULE, log_user_send, 50),
- ejabberd_hooks:delete(user_receive_packet, Host,
+ ejabberd_hooks:delete(user_receive_packet, HostB,
?MODULE, log_user_receive, 50),
ok.
log_user_send(From, To, Packet) ->
- log_packet(From, To, Packet, From#jid.lserver).
+ log_packet(From, To, Packet, exmpp_jid:prep_domain_as_list(From)).
log_user_receive(_JID, From, To, Packet) ->
- log_packet(From, To, Packet, To#jid.lserver).
+ log_packet(From, To, Packet, exmpp_jid:prep_domain_as_list(To)).
-log_packet(From, To, {xmlelement, Name, Attrs, Els}, Host) ->
+log_packet(From, To, Packet, 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},
+ ServerJID = exmpp_jid:make(Host),
+ FixedPacket = exmpp_stanza:set_jids(Packet, From, To),
lists:foreach(
fun(Logger) ->
ejabberd_router:route(
ServerJID,
- #jid{user = "", server = Logger, resource = "",
- luser = "", lserver = Logger, lresource = ""},
- {xmlelement, "route", [], [FixedPacket]})
+ exmpp_jid:make(Logger),
+ #xmlel{name = 'route', children = [FixedPacket]})
end, Loggers).
diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl
index 4d323b7ee..6d577be58 100644
--- a/src/mod_shared_roster.erl
+++ b/src/mod_shared_roster.erl
@@ -51,8 +51,9 @@
add_user_to_group/3,
remove_user_from_group/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("mod_roster.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
@@ -61,6 +62,7 @@
-record(sr_user, {us, group_host}).
start(Host, _Opts) ->
+ HostB = list_to_binary(Host),
mnesia:create_table(sr_group,
[{disc_copies, [node()]},
{attributes, record_info(fields, sr_group)}]),
@@ -69,51 +71,52 @@ start(Host, _Opts) ->
{type, bag},
{attributes, record_info(fields, sr_user)}]),
mnesia:add_table_index(sr_user, group_host),
- ejabberd_hooks:add(webadmin_menu_host, Host,
+ ejabberd_hooks:add(webadmin_menu_host, HostB,
?MODULE, webadmin_menu, 70),
- ejabberd_hooks:add(webadmin_page_host, Host,
+ ejabberd_hooks:add(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:add(roster_get, Host,
+ ejabberd_hooks:add(roster_get, HostB,
?MODULE, get_user_roster, 70),
- ejabberd_hooks:add(roster_in_subscription, Host,
+ ejabberd_hooks:add(roster_in_subscription, HostB,
?MODULE, in_subscription, 30),
- ejabberd_hooks:add(roster_out_subscription, Host,
+ ejabberd_hooks:add(roster_out_subscription, HostB,
?MODULE, out_subscription, 30),
- ejabberd_hooks:add(roster_get_subscription_lists, Host,
+ ejabberd_hooks:add(roster_get_subscription_lists, HostB,
?MODULE, get_subscription_lists, 70),
- ejabberd_hooks:add(roster_get_jid_info, Host,
+ ejabberd_hooks:add(roster_get_jid_info, HostB,
?MODULE, get_jid_info, 70),
- ejabberd_hooks:add(roster_process_item, Host,
+ ejabberd_hooks:add(roster_process_item, HostB,
?MODULE, process_item, 50),
- ejabberd_hooks:add(register_user, Host,
+ ejabberd_hooks:add(register_user, HostB,
?MODULE, register_user, 50),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50).
-%%ejabberd_hooks:add(remove_user, Host,
+%%ejabberd_hooks:add(remove_user, HostB,
%% ?MODULE, remove_user, 50),
stop(Host) ->
- ejabberd_hooks:delete(webadmin_menu_host, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(webadmin_menu_host, HostB,
?MODULE, webadmin_menu, 70),
- ejabberd_hooks:delete(webadmin_page_host, Host,
+ ejabberd_hooks:delete(webadmin_page_host, HostB,
?MODULE, webadmin_page, 50),
- ejabberd_hooks:delete(roster_get, Host,
+ ejabberd_hooks:delete(roster_get, HostB,
?MODULE, get_user_roster, 70),
- ejabberd_hooks:delete(roster_in_subscription, Host,
+ ejabberd_hooks:delete(roster_in_subscription, HostB,
?MODULE, in_subscription, 30),
- ejabberd_hooks:delete(roster_out_subscription, Host,
+ ejabberd_hooks:delete(roster_out_subscription, HostB,
?MODULE, out_subscription, 30),
- ejabberd_hooks:delete(roster_get_subscription_lists, Host,
+ ejabberd_hooks:delete(roster_get_subscription_lists, HostB,
?MODULE, get_subscription_lists, 70),
- ejabberd_hooks:delete(roster_get_jid_info, Host,
+ ejabberd_hooks:delete(roster_get_jid_info, HostB,
?MODULE, get_jid_info, 70),
- ejabberd_hooks:delete(roster_process_item, Host,
+ ejabberd_hooks:delete(roster_process_item, HostB,
?MODULE, process_item, 50),
- ejabberd_hooks:delete(register_user, Host,
+ ejabberd_hooks:delete(register_user, HostB,
?MODULE, register_user, 50),
- ejabberd_hooks:delete(remove_user, Host,
+ ejabberd_hooks:delete(remove_user, HostB,
?MODULE, remove_user, 50).
-%%ejabberd_hooks:delete(remove_user, Host,
+%%ejabberd_hooks:delete(remove_user, HostB,
%% ?MODULE, remove_user, 50),
@@ -151,9 +154,9 @@ get_user_roster(Items, US) ->
end, SRUsers, Items),
%% Export items in roster format:
- SRItems = [#roster{usj = {U, S, {U1, S1, ""}},
+ SRItems = [#roster{usj = {U, S, {U1, S1, undefined}},
us = US,
- jid = {U1, S1, ""},
+ jid = {U1, S1, undefined},
name = "",
subscription = both,
ask = none,
@@ -196,12 +199,12 @@ process_item(RosterItem, Host) ->
%% Remove pending out subscription
Mod:out_subscription(UserTo, ServerTo,
- jlib:make_jid(UserFrom, ServerFrom, ""),
+ exmpp_jid:make(UserFrom, ServerFrom),
unsubscribe),
%% Remove pending in subscription
Mod:in_subscription(aaaa, UserFrom, ServerFrom,
- jlib:make_jid(UserTo, ServerTo, ""),
+ exmpp_jid:make(UserTo, ServerTo),
unsubscribe, ""),
%% But we're still subscribed, so respond as such.
@@ -217,7 +220,7 @@ process_item(RosterItem, Host) ->
end.
build_roster_record(User1, Server1, User2, Server2, Name2, Groups) ->
- USR2 = {User2, Server2, ""},
+ USR2 = {User2, Server2, undefined},
#roster{usj = {User1, Server1, USR2},
us = {User1, Server1},
jid = USR2,
@@ -234,12 +237,12 @@ set_new_rosteritems(UserFrom, ServerFrom,
RIFrom = build_roster_record(UserFrom, ServerFrom,
UserTo, ServerTo, NameTo, GroupsFrom),
set_item(UserFrom, ServerFrom, ResourceTo, RIFrom),
- JIDTo = jlib:make_jid(UserTo, ServerTo, ""),
+ JIDTo = exmpp_jid:make(UserTo, ServerTo),
- JIDFrom = jlib:make_jid(UserFrom, ServerFrom, ""),
+ JIDFrom = exmpp_jid:make(UserFrom, ServerFrom),
RITo = build_roster_record(UserTo, ServerTo,
UserFrom, ServerFrom, UserFrom,[]),
- set_item(UserTo, ServerTo, "", RITo),
+ set_item(UserTo, ServerTo, undefined, RITo),
%% From requests
Mod:out_subscription(UserFrom, ServerFrom, JIDTo, subscribe),
@@ -260,56 +263,67 @@ set_new_rosteritems(UserFrom, ServerFrom,
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)]}]},
+ Request = #xmlel{ns = ?NS_ROSTER, name = 'query',
+ children = [mod_roster:item_to_xml(Item)]},
+ ResIQ = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
+ "push" ++ randoms:get_string()),
ejabberd_router:route(
- jlib:make_jid(User, Server, Resource),
- jlib:make_jid("", Server, ""),
- jlib:iq_to_xml(ResIQ)).
+ exmpp_jid:make(User, Server, Resource),
+ exmpp_jid:make(Server),
+ 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_subscription_lists({F, T}, User, Server)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(User),
+ LServer = binary_to_list(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, undefined} || {U1, S1} <- SRUsers],
+ {lists:usort(SRJIDs ++ F), lists:usort(SRJIDs ++ T)}
+ catch
+ _ ->
+ {[], []}
+ end.
-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}
+get_jid_info({Subscription, Groups}, User, Server, JID)
+ when is_binary(User), is_binary(Server) ->
+ try
+ LUser = binary_to_list(User),
+ LServer = binary_to_list(Server),
+ US = {LUser, LServer},
+ {U1, S1, _} = jlib:short_prepd_jid(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
+ catch
+ _ ->
+ {[], []}
end.
in_subscription(Acc, User, Server, JID, Type, _Reason) ->
@@ -319,8 +333,8 @@ 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, ""),
+ {UserTo, ServerTo, _} = jlib:short_prepd_bare_jid(JIDTo),
+ JIDFrom = exmpp_jid:make(UserFrom, UserTo),
Mod:out_subscription(UserTo, ServerTo, JIDFrom, unsubscribe),
%% Remove pending in subscription
@@ -331,27 +345,32 @@ 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 ->
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {LUser, LServer},
+ {U1, S1, _} = jlib:short_prepd_bare_jid(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
+ catch
+ _ ->
Acc
end.
@@ -542,8 +561,8 @@ is_user_in_group({_U, S} = US, Group, Host) ->
%% @spec (Host::string(), {User::string(), Server::string()}, Group::string()) -> {atomic, ok}
add_user_to_group(Host, US, Group) ->
{LUser, LServer} = US,
- case regexp:match(LUser, "^@.+@$") of
- {match,_,_} ->
+ case re:run(LUser, "^@.+@$", [{capture, none}]) of
+ match ->
GroupOpts = mod_shared_roster:get_group_opts(Host, Group),
AllUsersOpt =
case LUser == "@all@" of
@@ -574,8 +593,8 @@ push_displayed_to_user(LUser, LServer, Group, Host, Subscription) ->
remove_user_from_group(Host, US, Group) ->
GroupHost = {Group, Host},
{LUser, LServer} = US,
- case regexp:match(LUser, "^@.+@$") of
- {match,_,_} ->
+ case re:run(LUser, "^@.+@$", [{capture, none}]) of
+ match ->
GroupOpts = mod_shared_roster:get_group_opts(Host, Group),
NewGroupOpts =
case LUser of
@@ -617,20 +636,25 @@ 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) ->
- 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(LUser, LServer, Group, GroupOpts))
- end, lists:usort(SpecialGroups++UserGroups)).
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep: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) ->
+ 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(LUser, LServer, Group, GroupOpts))
+ end, lists:usort(SpecialGroups++UserGroups))
+ catch
+ _ ->
+ ok
+ end.
push_user_to_displayed(LUser, LServer, Group, Subscription) ->
GroupsOpts = groups_with_opts(LServer),
@@ -660,22 +684,20 @@ push_item(User, Server, From, Item) ->
%% 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,
+ ejabberd_sm:route(From, exmpp_jid:make(User, Server),
+ #xmlel{name = 'broadcast', children =
+ [{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)]}]}),
+ Request = #xmlel{ns = ?NS_ROSTER, name = 'query',
+ children = [item_to_xml(Item)]},
+ Stanza = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
+ "push" ++ randoms:get_string()),
lists:foreach(
fun(Resource) ->
- JID = jlib:make_jid(User, Server, Resource),
+ JID = exmpp_jid:make(User, Server, Resource),
ejabberd_router:route(JID, JID, Stanza)
- end, ejabberd_sm:get_user_resources(User, Server)).
+ end, ejabberd_sm:get_user_resources(list_to_binary(User), list_to_binary(Server))).
push_roster_item(User, Server, ContactU, ContactS, GroupName, Subscription) ->
Item = #roster{usj = {User, Server, {ContactU, ContactS, ""}},
@@ -685,41 +707,36 @@ push_roster_item(User, Server, ContactU, ContactS, GroupName, Subscription) ->
subscription = Subscription,
ask = none,
groups = [GroupName]},
- push_item(User, Server, jlib:make_jid("", Server, ""), Item).
+ push_item(User, Server, exmpp_jid:make(Server), Item).
item_to_xml(Item) ->
- Attrs1 = [{"jid", jlib:jid_to_string(Item#roster.jid)}],
+ {U, S, R} = Item#roster.jid,
+ Attrs1 = exmpp_xml:set_attribute_in_list([],
+ 'jid', exmpp_jid:to_list(U, S, R)),
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]
+ exmpp_xml:set_attribute_in_list(Attrs1, 'name', Name)
end,
+ Attrs3 = exmpp_xml:set_attribute_in_list(Attrs2,
+ 'subscription', Item#roster.subscription),
Attrs4 = case ask_to_pending(Item#roster.ask) of
out ->
- [{"ask", "subscribe"} | Attrs3];
+ exmpp_xml:set_attribute_in_list(Attrs3,
+ 'ask', "subscribe");
both ->
- [{"ask", "subscribe"} | Attrs3];
+ exmpp_xml:set_attribute_in_list(Attrs3,
+ 'ask', "subscribe");
_ ->
Attrs3
end,
SubEls1 = lists:map(fun(G) ->
- {xmlelement, "group", [], [{xmlcdata, G}]}
+ exmpp_xml:set_cdata(
+ #xmlel{ns = ?NS_ROSTER, name = 'group'}, G)
end, Item#roster.groups),
SubEls = SubEls1 ++ Item#roster.xs,
- {xmlelement, "item", Attrs4, SubEls}.
+ #xmlel{ns = ?NS_ROSTER, name = 'item', attrs = Attrs4, children = SubEls}.
ask_to_pending(subscribe) -> out;
ask_to_pending(unsubscribe) -> none;
@@ -779,7 +796,7 @@ list_shared_roster_groups(Host, Query, Lang) ->
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
[FGroups,
?BR,
?INPUTT("submit", "delete", "Delete Selected")
@@ -839,9 +856,9 @@ shared_roster_group(Host, Group, Query, Lang) ->
[]
end ++ [[us_to_list(Member), $\n] || Member <- Members],
FDisplayedGroups = [[DG, $\n] || DG <- DisplayedGroups],
- DescNL = length(element(2, regexp:split(Description, "\n"))),
+ DescNL = length(re:split(Description, "\n", [{return, list}])),
FGroup =
- ?XAE("table", [{"class", "withtextareas"}],
+ ?XAE("table", [?XMLATTR('class', <<"withtextareas">>)],
[?XE("tbody",
[?XE("tr",
[?XCT("td", "Name:"),
@@ -880,7 +897,7 @@ shared_roster_group(Host, Group, Query, Lang) ->
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
[FGroup,
?BR,
?INPUTT("submit", "submit", "Submit")
@@ -922,10 +939,11 @@ shared_roster_group_parse_query(Host, Group, Query) ->
"@all@" ->
USs;
_ ->
- case jlib:string_to_jid(SJID) of
- JID when is_record(JID, jid) ->
- [{JID#jid.luser, JID#jid.lserver} | USs];
- error ->
+ try
+ JID = exmpp_jid:parse(SJID),
+ [{exmpp_jid:prep_node_as_list(JID), exmpp_jid:prep_domain_as_list(JID)} | USs]
+ catch
+ _ ->
error
end
end
@@ -978,4 +996,4 @@ get_opt(Opts, Opt, Default) ->
end.
us_to_list({User, Server}) ->
- jlib:jid_to_string({User, Server, ""}).
+ exmpp_jid:bare_to_list(User, Server).
diff --git a/src/mod_stats.erl b/src/mod_stats.erl
index af01ba1c8..928b8de47 100644
--- a/src/mod_stats.erl
+++ b/src/mod_stats.erl
@@ -33,46 +33,39 @@
stop/1,
process_local_iq/3]).
--include("jlib.hrl").
+-include_lib("exmpp/include/exmpp.hrl").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_STATS,
+ gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_STATS_s,
?MODULE, process_local_iq, IQDisc).
stop(Host) ->
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_STATS).
+ gen_iq_handler:remove_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_STATS_s).
-process_local_iq(_From, To, #iq{id = _ID, type = Type,
- xmlns = XMLNS, sub_el = SubEl} = IQ) ->
- %%Lang = xml:get_tag_attr_s("xml:lang", SubEl),
- case Type of
- set ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
- get ->
- {xmlelement, _, _Attrs, Els} = SubEl,
- Node = string:tokens(xml:get_tag_attr_s("node", SubEl), "/"),
- Names = get_names(Els, []),
+process_local_iq(_From, To, #iq{type = get,
+ ns = XMLNS, payload = SubEl} = IQ_Rec) ->
+ Node = string:tokens(exmpp_xml:get_attribute_as_list(SubEl, 'node', ""), "/"),
+ Names = get_names(exmpp_xml:get_child_elements(SubEl), []),
- case get_local_stats(To#jid.server, Node, Names) of
- {result, Res} ->
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", XMLNS}],
- Res}]};
- {error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
- end
- end.
+ case get_local_stats(exmpp_jid:domain(To), Node, Names) of
+ {result, Res} ->
+ Result = #xmlel{ns = XMLNS, name = 'query', children = Res},
+ exmpp_iq:result(IQ_Rec, Result);
+ {error, Error} ->
+ exmpp_iq:error(IQ_Rec, Error)
+ end;
+process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
get_names([], Res) ->
Res;
-get_names([{xmlelement, "stat", Attrs, _} | Els], Res) ->
- Name = xml:get_attr_s("name", Attrs),
+get_names([#xmlel{name = "stat", attrs = Attrs} | Els], Res) ->
+ Name = exmpp_xml:get_attribute_from_list_as_binary(Attrs, 'name', <<>>),
case Name of
- "" ->
+ <<>> ->
get_names(Els, Res);
_ ->
get_names(Els, [Name | Res])
@@ -81,14 +74,14 @@ get_names([_ | Els], Res) ->
get_names(Els, Res).
--define(STAT(Name), {xmlelement, "stat", [{"name", Name}], []}).
+-define(STAT(Name), #xmlel{ns = ?NS_STATS_s, name = 'stat', attrs = [?XMLATTR('name', Name)]}).
get_local_stats(_Server, [], []) ->
{result,
- [?STAT("users/online"),
- ?STAT("users/total"),
- ?STAT("users/all-hosts/online"),
- ?STAT("users/all-hosts/total")
+ [?STAT(<<"users/online">>),
+ ?STAT(<<"users/total">>),
+ ?STAT(<<"users/all-hosts/online">>),
+ ?STAT(<<"users/all-hosts/total">>)
]};
get_local_stats(Server, [], Names) ->
@@ -98,142 +91,142 @@ get_local_stats(Server, [], Names) ->
get_local_stats(_Server, ["running nodes", _], []) ->
{result,
- [?STAT("time/uptime"),
- ?STAT("time/cputime"),
- ?STAT("users/online"),
- ?STAT("transactions/committed"),
- ?STAT("transactions/aborted"),
- ?STAT("transactions/restarted"),
- ?STAT("transactions/logged")
+ [?STAT(<<"time/uptime">>),
+ ?STAT(<<"time/cputime">>),
+ ?STAT(<<"users/online">>),
+ ?STAT(<<"transactions/committed">>),
+ ?STAT(<<"transactions/aborted">>),
+ ?STAT(<<"transactions/restarted">>),
+ ?STAT(<<"transactions/logged">>)
]};
get_local_stats(_Server, ["running nodes", ENode], Names) ->
case search_running_node(ENode) of
false ->
- {error, ?ERR_ITEM_NOT_FOUND};
+ {error, 'item-not-found'};
Node ->
{result,
lists:map(fun(Name) -> get_node_stat(Node, Name) end, Names)}
end;
get_local_stats(_Server, _, _) ->
- {error, ?ERR_FEATURE_NOT_IMPLEMENTED}.
+ {error, 'feature-not-implemented'}.
-define(STATVAL(Val, Unit),
- {xmlelement, "stat",
- [{"name", Name},
- {"units", Unit},
- {"value", Val}
- ], []}).
+ #xmlel{ns = ?NS_STATS_s, name = 'stat', attrs =
+ [?XMLATTR('name', Name),
+ ?XMLATTR('units', Unit),
+ ?XMLATTR('value', Val)
+ ]}).
-define(STATERR(Code, Desc),
- {xmlelement, "stat",
- [{"name", Name}],
- [{xmlelement, "error",
- [{"code", Code}],
- [{xmlcdata, Desc}]}]}).
+ #xmlel{ns = ?NS_STATS_s, name = 'stat', attrs=
+ [?XMLATTR('name', Name)], children =
+ [#xmlel{ns = ?NS_STATS_s, name = 'error', attrs =
+ [?XMLATTR('code', Code)], children =
+ [#xmlcdata{cdata = Desc}]}]}).
-get_local_stat(Server, [], Name) when Name == "users/online" ->
+get_local_stat(Server, [], Name) when Name == <<"users/online">> ->
case catch ejabberd_sm:get_vh_session_list(Server) of
{'EXIT', _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Users ->
- ?STATVAL(integer_to_list(length(Users)), "users")
+ ?STATVAL(list_to_binary(integer_to_list(length(Users))), <<"users">>)
end;
-get_local_stat(Server, [], Name) when Name == "users/total" ->
+get_local_stat(Server, [], Name) when Name == <<"users/total">> ->
%%LServer = jlib:nameprep(Server),
- case catch ejabberd_auth:get_vh_registered_users_number(Server) of
+ case catch ejabberd_auth:get_vh_registered_users_number(binary_to_list(Server)) of
{'EXIT', _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
NUsers ->
- ?STATVAL(integer_to_list(NUsers), "users")
+ ?STATVAL(list_to_binary(integer_to_list(NUsers)), <<"users">>)
end;
-get_local_stat(_Server, [], Name) when Name == "users/all-hosts/online" ->
+get_local_stat(_Server, [], Name) when Name == <<"users/all-hosts/online">> ->
case catch mnesia:table_info(session, size) of
{'EXIT', _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Users ->
- ?STATVAL(integer_to_list(Users), "users")
+ ?STATVAL(list_to_binary(integer_to_list(Users)), <<"users">>)
end;
-get_local_stat(_Server, [], Name) when Name == "users/all-hosts/total" ->
+get_local_stat(_Server, [], Name) when Name == <<"users/all-hosts/total">> ->
case catch mnesia:table_info(passwd, size) of
{'EXIT', _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Users ->
- ?STATVAL(integer_to_list(Users), "users")
+ ?STATVAL(list_to_binary(integer_to_list(Users)), <<"users">>)
end;
get_local_stat(_Server, _, Name) ->
- ?STATERR("404", "Not Found").
+ ?STATERR(<<"404">>, <<"Not Found">>).
-get_node_stat(Node, Name) when Name == "time/uptime" ->
+get_node_stat(Node, Name) when Name == <<"time/uptime">> ->
case catch rpc:call(Node, erlang, statistics, [wall_clock]) of
{badrpc, _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
CPUTime ->
- ?STATVAL(
- io_lib:format("~.3f", [element(1, CPUTime)/1000]), "seconds")
+ ?STATVAL(list_to_binary(
+ io_lib:format("~.3f", [element(1, CPUTime)/1000])), "seconds")
end;
-get_node_stat(Node, Name) when Name == "time/cputime" ->
+get_node_stat(Node, Name) when Name == <<"time/cputime">> ->
case catch rpc:call(Node, erlang, statistics, [runtime]) of
{badrpc, _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
RunTime ->
- ?STATVAL(
- io_lib:format("~.3f", [element(1, RunTime)/1000]), "seconds")
+ ?STATVAL(list_to_binary(
+ io_lib:format("~.3f", [element(1, RunTime)/1000])), "seconds")
end;
-get_node_stat(Node, Name) when Name == "users/online" ->
+get_node_stat(Node, Name) when Name == <<"users/online">> ->
case catch rpc:call(Node, ejabberd_sm, dirty_get_my_sessions_list, []) of
{badrpc, _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Users ->
- ?STATVAL(integer_to_list(length(Users)), "users")
+ ?STATVAL(list_to_binary(integer_to_list(length(Users))), <<"users">>)
end;
-get_node_stat(Node, Name) when Name == "transactions/committed" ->
+get_node_stat(Node, Name) when Name == <<"transactions/committed">> ->
case catch rpc:call(Node, mnesia, system_info, [transaction_commits]) of
{badrpc, _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Transactions ->
- ?STATVAL(integer_to_list(Transactions), "transactions")
+ ?STATVAL(list_to_binary(integer_to_list(Transactions)), <<"transactions">>)
end;
-get_node_stat(Node, Name) when Name == "transactions/aborted" ->
+get_node_stat(Node, Name) when Name == <<"transactions/aborted">> ->
case catch rpc:call(Node, mnesia, system_info, [transaction_failures]) of
{badrpc, _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Transactions ->
- ?STATVAL(integer_to_list(Transactions), "transactions")
+ ?STATVAL(list_to_binary(integer_to_list(Transactions)), <<"transactions">>)
end;
-get_node_stat(Node, Name) when Name == "transactions/restarted" ->
+get_node_stat(Node, Name) when Name == <<"transactions/restarted">> ->
case catch rpc:call(Node, mnesia, system_info, [transaction_restarts]) of
{badrpc, _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Transactions ->
- ?STATVAL(integer_to_list(Transactions), "transactions")
+ ?STATVAL(list_to_binary(integer_to_list(Transactions)), <<"transactions">>)
end;
-get_node_stat(Node, Name) when Name == "transactions/logged" ->
+get_node_stat(Node, Name) when Name == <<"transactions/logged">> ->
case catch rpc:call(Node, mnesia, system_info, [transaction_log_writes]) of
{badrpc, _Reason} ->
- ?STATERR("500", "Internal Server Error");
+ ?STATERR(<<"500">>, <<"Internal Server Error">>);
Transactions ->
- ?STATVAL(integer_to_list(Transactions), "transactions")
+ ?STATVAL(list_to_binary(integer_to_list(Transactions)), <<"transactions">>)
end;
get_node_stat(_, Name) ->
- ?STATERR("404", "Not Found").
+ ?STATERR(<<"404">>, <<"Not Found">>).
search_running_node(SNode) ->
diff --git a/src/mod_time.erl b/src/mod_time.erl
index 0b4133692..84efda45e 100644
--- a/src/mod_time.erl
+++ b/src/mod_time.erl
@@ -34,42 +34,25 @@
process_local_iq90/3, % TODO: Remove once XEP-0090 is Obsolete
process_local_iq/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-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,
+ gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_TIME_OLD,
?MODULE, process_local_iq90, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_TIME,
+ gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(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 the next two lines once XEP-0090 is Obsolete
+ gen_iq_handler:remove_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_TIME_OLD),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, list_to_binary(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 ->
+process_local_iq(_From, _To, #iq{type = get} = IQ_Rec) ->
Now = now(),
Now_universal = calendar:now_to_universal_time(Now),
Now_local = calendar:now_to_local_time(Now),
@@ -78,13 +61,25 @@ process_local_iq(_From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
- calendar:datetime_to_gregorian_seconds(Now_universal),
{Hd, Md, _} = calendar:seconds_to_time(Seconds_diff),
{_, TZO_diff} = jlib:timestamp_to_iso({{0, 0, 0}, {0, 0, 0}}, {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.
-
+ Result = #xmlel{ns = ?NS_TIME, name = 'time', children = [
+ #xmlel{ns = ?NS_TIME, name = 'tzo', children = [
+ #xmlcdata{cdata = list_to_binary(TZO_diff)}]},
+ #xmlel{ns = ?NS_TIME, name = 'utc', children = [
+ #xmlcdata{cdata = list_to_binary(UTC ++ UTC_diff)}]}
+ ]},
+ exmpp_iq:result(IQ_Rec, Result);
+process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
+%% TODO: Remove this function once XEP-0090 is Obsolete
+process_local_iq90(_From, _To, #iq{type = get} = IQ_Rec) ->
+ UTC = jlib:timestamp_to_iso(calendar:universal_time()),
+ Result = #xmlel{ns = ?NS_TIME_OLD, name = 'query',
+ children = [#xmlel{ns = ?NS_TIME_OLD, name = 'utc',
+ children=[#xmlcdata{cdata =
+ list_to_binary(UTC)}
+ ]}
+ ]},
+ exmpp_iq:result(IQ_Rec, Result);
+process_local_iq90(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl
index ee109e598..4aedf18d2 100644
--- a/src/mod_vcard.erl
+++ b/src/mod_vcard.erl
@@ -36,8 +36,9 @@
reindex_vcards/0,
remove_user/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-define(JUD_MATCHES, 30).
@@ -61,6 +62,7 @@
-define(PROCNAME, ejabberd_mod_vcard).
start(Host, Opts) ->
+ HostB = list_to_binary(Host),
mnesia:create_table(vcard, [{disc_only_copies, [node()]},
{attributes, record_info(fields, vcard)}]),
mnesia:create_table(vcard_search,
@@ -80,14 +82,14 @@ start(Host, Opts) ->
mnesia:add_table_index(vcard_search, lorgname),
mnesia:add_table_index(vcard_search, lorgunit),
- ejabberd_hooks:add(remove_user, Host,
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_VCARD,
?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_VCARD,
?MODULE, process_sm_iq, IQDisc),
- ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:add(disco_sm_features, HostB, ?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),
@@ -121,11 +123,14 @@ loop(Host, ServerHost) ->
end.
stop(Host) ->
- ejabberd_hooks:delete(remove_user, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(remove_user, HostB,
?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),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB,
+ ?NS_VCARD),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB,
+ ?NS_VCARD),
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
Proc ! stop,
{wait, Proc}.
@@ -138,79 +143,88 @@ get_sm_features(Acc, _From, _To, Node, _Lang) ->
[] ->
case Acc of
{result, Features} ->
- {result, [?NS_DISCO_INFO, ?NS_VCARD | Features]};
+ {result, [?NS_DISCO_INFO_s, ?NS_VCARD_s | Features]};
empty ->
- {result, [?NS_DISCO_INFO, ?NS_VCARD]}
+ {result, [?NS_DISCO_INFO_s, ?NS_VCARD_s]}
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-2009 ProcessOne"}]},
- {xmlelement, "BDAY", [],
- [{xmlcdata, "2002-11-16"}]}
- ]}]}
- end.
+process_local_iq(_From, _To, #iq{type = get, lang = Lang} = IQ_Rec) ->
+ Result = #xmlel{ns = ?NS_VCARD, name = 'vCard', children = [
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'FN'},
+ "ejabberd"),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'URL'},
+ ?EJABBERD_URI),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'DESC'},
+ translate:translate(Lang, "Erlang Jabber Server") ++
+ "\nCopyright (c) 2002-2009 ProcessOne"),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'BDAY'},
+ "2002-11-16")
+ ]},
+ exmpp_iq:result(IQ_Rec, Result);
+process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
-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,
- US = {LUser, LServer},
- F = fun() ->
- mnesia:read({vcard, US})
- end,
- Els = case mnesia:transaction(F) of
- {atomic, Rs} ->
- lists:map(fun(R) ->
- R#vcard.vcard
- end, Rs);
- {aborted, _Reason} ->
- []
- end,
- IQ#iq{type = result, sub_el = Els}
+process_sm_iq(_From, To, #iq{type = get} = IQ_Rec) ->
+ LUser = exmpp_jid:prep_node_as_list(To),
+ LServer = exmpp_jid:prep_domain_as_list(To),
+ US = {LUser, LServer},
+ F = fun() ->
+ mnesia:read({vcard, US})
+ end,
+ Els = case mnesia:transaction(F) of
+ {atomic, Rs} ->
+ lists:map(fun(R) ->
+ R#vcard.vcard
+ end, Rs);
+ {aborted, _Reason} ->
+ []
+ end,
+ case Els of
+ [VCard | _] ->
+ exmpp_iq:result(IQ_Rec, VCard);
+ _ ->
+ exmpp_iq:result(IQ_Rec)
+ end;
+process_sm_iq(From, _To, #iq{type = set, payload = Request} = IQ_Rec) ->
+ User = exmpp_jid:node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case lists:member(LServer, ?MYHOSTS) of
+ true ->
+ set_vcard(User, LServer, Request),
+ exmpp_iq:result(IQ_Rec);
+ false ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed')
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]),
+ FN = exmpp_xml:get_path(VCARD,
+ [{element, 'FN'}, cdata_as_list]),
+ Family = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'FAMILY'}, cdata_as_list]),
+ Given = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'GIVEN'}, cdata_as_list]),
+ Middle = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'MIDDLE'}, cdata_as_list]),
+ Nickname = exmpp_xml:get_path(VCARD,
+ [{element, 'NICKNAME'}, cdata_as_list]),
+ BDay = exmpp_xml:get_path(VCARD,
+ [{element, 'BDAY'}, cdata_as_list]),
+ CTRY = exmpp_xml:get_path(VCARD,
+ [{element, 'ADR'}, {element, 'CTRY'}, cdata_as_list]),
+ Locality = exmpp_xml:get_path(VCARD,
+ [{element, 'ADR'}, {element, 'LOCALITY'}, cdata_as_list]),
+ EMail1 = exmpp_xml:get_path(VCARD,
+ [{element, 'EMAIL'}, {element, 'USERID'}, cdata_as_list]),
+ EMail2 = exmpp_xml:get_path(VCARD,
+ [{element, 'EMAIL'}, cdata_as_list]),
+ OrgName = exmpp_xml:get_path(VCARD,
+ [{element, 'ORG'}, {element, 'ORGNAME'}, cdata_as_list]),
+ OrgUnit = exmpp_xml:get_path(VCARD,
+ [{element, 'ORG'}, {element, 'ORGUNIT'}, cdata_as_list]),
EMail = case EMail1 of
"" ->
EMail2;
@@ -218,285 +232,257 @@ set_vcard(User, LServer, VCARD) ->
EMail1
end,
- LUser = jlib:nodeprep(User),
- 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),
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LFN = exmpp_stringprep:to_lower(FN),
+ LFamily = exmpp_stringprep:to_lower(Family),
+ LGiven = exmpp_stringprep:to_lower(Given),
+ LMiddle = exmpp_stringprep:to_lower(Middle),
+ LNickname = exmpp_stringprep:to_lower(Nickname),
+ LBDay = exmpp_stringprep:to_lower(BDay),
+ LCTRY = exmpp_stringprep:to_lower(CTRY),
+ LLocality = exmpp_stringprep:to_lower(Locality),
+ LEMail = exmpp_stringprep:to_lower(EMail),
+ LOrgName = exmpp_stringprep:to_lower(OrgName),
+ LOrgUnit = exmpp_stringprep:to_lower(OrgUnit),
- US = {LUser, LServer},
+ US = {LUser, LServer},
- 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 ->
- F = fun() ->
- mnesia:write(#vcard{us = US, vcard = VCARD}),
- mnesia:write(
- #vcard_search{us = US,
- user = {User, LServer},
- 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,
- mnesia:transaction(F)
+ F = fun() ->
+ mnesia:write(#vcard{us = US, vcard = VCARD}),
+ mnesia:write(
+ #vcard_search{us = US,
+ user = {User, LServer},
+ 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,
+ mnesia:transaction(F)
+ catch
+ _ ->
+ {error, badarg}
end.
-define(TLFIELD(Type, Label, Var),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}], []}).
+ #xmlel{ns = ?NS_VCARD, name = 'field', attrs = [
+ ?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('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")
+ [#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "You need an x:data capable client to search"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"form">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Search users in ") ++ exmpp_jid:to_list(JID))}]},
+ #xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(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,
+ User = exmpp_jid:node(To),
+ Resource = exmpp_jid:resource(To),
if
- (User /= "") or (Resource /= "") ->
- Err = jlib:make_error_reply(Packet, ?ERR_SERVICE_UNAVAILABLE),
+ (User /= undefined) or (Resource /= undefined) ->
+ Err = exmpp_stanza:reply_with_error(Packet, '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_DISCO_INFO}], []},
- {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));
+ try
+ Request = exmpp_iq:get_request(Packet),
+ Type = exmpp_iq:get_type(Packet),
+ Lang = exmpp_stanza:get_lang(Packet),
+ case {Type, Request#xmlel.ns} of
+ {set, ?NS_SEARCH} ->
+ XDataEl = find_xdata_el(Request),
+ case XDataEl of
+ false ->
+ Err = exmpp_iq:error(Packet, 'bad-request'),
+ ejabberd_router:route(To, From, Err);
+ _ ->
+ XData = jlib:parse_xdata_submit(XDataEl),
+ case XData of
+ invalid ->
+ Err = exmpp_iq:error(Packet,
+ 'bad-request'),
+ ejabberd_router:route(To, From,
+ Err);
+ _ ->
+ Result = #xmlel{
+ ns = ?NS_SEARCH,
+ name = 'query',
+ children = [
+ #xmlel{
+ ns = ?NS_DATA_FORMS,
+ name = 'x',
+ attrs = [?XMLATTR('type',
+ <<"result">>)],
+ children = search_result(Lang,
+ To, ServerHost, XData)}]},
+ ResIQ = exmpp_iq:result(Packet,
+ Result),
+ ejabberd_router:route(
+ To, From, ResIQ)
+ end
+ end;
+ {get, ?NS_SEARCH} ->
+ Result = #xmlel{ns = ?NS_SEARCH, name = 'query',
+ children = ?FORM(To)},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {set, ?NS_DISCO_INFO} ->
+ Err = exmpp_iq:error(Packet, 'not-allowed'),
+ ejabberd_router:route(To, From, Err);
+ {get, ?NS_DISCO_INFO} ->
+ ServerHostB = list_to_binary(ServerHost),
+ Info = ejabberd_hooks:run_fold(
+ disco_info, ServerHostB, [],
+ [ServerHost, ?MODULE, <<>>, ""]),
+ Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
+ children = Info ++ [
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
+ attrs = [
+ ?XMLATTR('category', <<"directory">>),
+ ?XMLATTR('type', <<"user">>),
+ ?XMLATTR('name', translate:translate(Lang,
+ "vCard User Search"))]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [
+ ?XMLATTR('var', ?NS_DISCO_INFO_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [
+ ?XMLATTR('var', ?NS_SEARCH_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [
+ ?XMLATTR('var', ?NS_VCARD_s)]}
+ ]},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {set, ?NS_DISCO_ITEMS} ->
+ Err = exmpp_iq:error(Packet, 'not-allowed'),
+ ejabberd_router:route(To, From, Err);
+ {get, ?NS_DISCO_ITEMS} ->
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS, name = 'query'},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {get, ?NS_VCARD} ->
+ Result = #xmlel{ns = ?NS_VCARD, name = 'vCard',
+ children = iq_get_vcard(Lang)},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ _ ->
+ Err = exmpp_iq:error(Packet, 'service-unavailable'),
+ ejabberd_router:route(To, From, Err)
+ end
+ catch
_ ->
- Err = jlib:make_error_reply(Packet,
- ?ERR_SERVICE_UNAVAILABLE),
- ejabberd_router:route(To, From, Err)
+ Err1 = exmpp_iq:error(Packet, 'service-unavailable'),
+ ejabberd_router:route(To, From, Err1)
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-2009 ProcessOne"}]}].
+ [
+ #xmlel{ns = ?NS_SEARCH, name = 'FN', children = [
+ #xmlcdata{cdata = <<"ejabberd/mod_vcard">>}]},
+ #xmlel{ns = ?NS_SEARCH, name = 'URL', children = [
+ #xmlcdata{cdata = list_to_binary(?EJABBERD_URI)}]},
+ #xmlel{ns = ?NS_SEARCH, name ='DESC', children = [
+ #xmlcdata{cdata = list_to_binary(
+ translate:translate(Lang, "ejabberd vCard module") ++
+ "\nCopyright (c) 2003-2009 ProcessOne")}]}
+ ].
-find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) ->
+find_xdata_el(#xmlel{children = 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([#xmlel{ns = ?NS_DATA_FORMS} = El | _Els]) ->
+ El;
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")
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(
+ translate:translate(Lang, "Search Results for ") ++
+ exmpp_jid:to_list(JID))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'reported', children =
+ [?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 record_to_item/1, search(ServerHost, Data)).
-define(FIELD(Var, Val),
- {xmlelement, "field", [{"var", Var}],
- [{xmlelement, "value", [],
- [{xmlcdata, Val}]}]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', Var)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = Val}]}]}).
record_to_item(R) ->
{User, Server} = R#vcard_search.user,
- {xmlelement, "item", [],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'item', children =
[
- ?FIELD("jid", User ++ "@" ++ Server),
- ?FIELD("fn", R#vcard_search.fn),
- ?FIELD("last", R#vcard_search.family),
- ?FIELD("first", R#vcard_search.given),
- ?FIELD("middle", R#vcard_search.middle),
- ?FIELD("nick", R#vcard_search.nickname),
- ?FIELD("bday", R#vcard_search.bday),
- ?FIELD("ctry", R#vcard_search.ctry),
- ?FIELD("locality", R#vcard_search.locality),
- ?FIELD("email", R#vcard_search.email),
- ?FIELD("orgname", R#vcard_search.orgname),
- ?FIELD("orgunit", R#vcard_search.orgunit)
+ ?FIELD(<<"jid">>, list_to_binary(User ++ "@" ++ Server)),
+ ?FIELD(<<"fn">>, list_to_binary(R#vcard_search.fn)),
+ ?FIELD(<<"last">>, list_to_binary(R#vcard_search.family)),
+ ?FIELD(<<"first">>, list_to_binary(R#vcard_search.given)),
+ ?FIELD(<<"middle">>, list_to_binary(R#vcard_search.middle)),
+ ?FIELD(<<"nick">>, list_to_binary(R#vcard_search.nickname)),
+ ?FIELD(<<"bday">>, list_to_binary(R#vcard_search.bday)),
+ ?FIELD(<<"ctry">>, list_to_binary(R#vcard_search.ctry)),
+ ?FIELD(<<"locality">>, list_to_binary(R#vcard_search.locality)),
+ ?FIELD(<<"email">>, list_to_binary(R#vcard_search.email)),
+ ?FIELD(<<"orgname">>, list_to_binary(R#vcard_search.orgname)),
+ ?FIELD(<<"orgunit">>, list_to_binary(R#vcard_search.orgunit))
]
}.
@@ -540,7 +526,7 @@ filter_fields([], Match, _LServer) ->
Match;
filter_fields([{SVar, [Val]} | Ds], Match, LServer)
when is_list(Val) and (Val /= "") ->
- LVal = stringprep:tolower(Val),
+ LVal = exmpp_stringprep:to_lower(Val),
NewMatch = case SVar of
"user" ->
case gen_mod:get_module_opt(LServer, ?MODULE,
@@ -604,61 +590,60 @@ set_vcard_t(R, _) ->
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]),
+ FN = exmpp_xml:get_path(VCARD,
+ [{element, 'FN'}, cdata_as_list]),
+ Family = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'FAMILY'}, cdata_as_list]),
+ Given = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'GIVEN'}, cdata_as_list]),
+ Middle = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'MIDDLE'}, cdata_as_list]),
+ Nickname = exmpp_xml:get_path(VCARD,
+ [{element, 'NICKNAME'}, cdata_as_list]),
+ BDay = exmpp_xml:get_path(VCARD,
+ [{element, 'BDAY'}, cdata_as_list]),
+ CTRY = exmpp_xml:get_path(VCARD,
+ [{element, 'ADR'}, {element, 'CTRY'}, cdata_as_list]),
+ Locality = exmpp_xml:get_path(VCARD,
+ [{element, 'ADR'}, {element, 'LOCALITY'},cdata_as_list]),
+ EMail = exmpp_xml:get_path(VCARD,
+ [{element, 'EMAIL'}, cdata_as_list]),
+ OrgName = exmpp_xml:get_path(VCARD,
+ [{element, 'ORG'}, {element, 'ORGNAME'}, cdata_as_list]),
+ OrgUnit = exmpp_xml:get_path(VCARD,
+ [{element, 'ORG'}, {element, 'ORGUNIT'}, cdata_as_list]),
- {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
- })
+ try
+ {LUser, _LServer} = US,
+ LFN = exmpp_stringprep:to_lower(FN),
+ LFamily = exmpp_stringprep:to_lower(Family),
+ LGiven = exmpp_stringprep:to_lower(Given),
+ LMiddle = exmpp_stringprep:to_lower(Middle),
+ LNickname = exmpp_stringprep:to_lower(Nickname),
+ LBDay = exmpp_stringprep:to_lower(BDay),
+ LCTRY = exmpp_stringprep:to_lower(CTRY),
+ LLocality = exmpp_stringprep:to_lower(Locality),
+ LEMail = exmpp_stringprep:to_lower(EMail),
+ LOrgName = exmpp_stringprep:to_lower(OrgName),
+ LOrgUnit = exmpp_stringprep:to_lower(OrgUnit),
+ 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
+ })
+ catch
+ _ ->
+ {error, badarg}
end.
@@ -669,9 +654,9 @@ reindex_vcards() ->
mnesia:transaction(F).
-remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+remove_user(User, Server) when is_binary(User), is_binary(Server) ->
+ LUser = exmpp_stringprep:nodeprep(User),
+ LServer = exmpp_stringprep:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
mnesia:delete({vcard, US}),
@@ -688,7 +673,7 @@ update_vcard_table() ->
Fields = record_info(fields, vcard),
case mnesia:table_info(vcard, attributes) of
Fields ->
- ok;
+ convert_to_exmpp();
[user, vcard] ->
?INFO_MSG("Converting vcard table from "
"{user, vcard} format", []),
@@ -727,6 +712,29 @@ update_vcard_table() ->
end.
+convert_to_exmpp() ->
+ Fun = fun() ->
+ case mnesia:first(vcard) of
+ '$end_of_table' ->
+ none;
+ Key ->
+ case mnesia:read({vcard, Key}) of
+ [#vcard{vcard = #xmlel{}}] ->
+ none;
+ [#vcard{vcard = #xmlelement{}}] ->
+ mnesia:foldl(fun convert_to_exmpp2/2,
+ done, vcard, write)
+ end
+ end
+ end,
+ mnesia:transaction(Fun).
+
+convert_to_exmpp2(#vcard{vcard = ElOld} = VCard, Acc) ->
+ El0 = exmpp_xml:xmlelement_to_xmlel(ElOld, [?NS_VCARD], []),
+ El = exmpp_xml:remove_whitespaces_deeply(El0),
+ mnesia:write(VCard#vcard{vcard = El}),
+ Acc.
+
update_vcard_search_table() ->
Fields = record_info(fields, vcard_search),
case mnesia:table_info(vcard_search, attributes) of
diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl
index 48a2874b5..a5177344e 100644
--- a/src/mod_vcard_ldap.erl
+++ b/src/mod_vcard_ldap.erl
@@ -49,9 +49,10 @@
route/4
]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
-include("eldap/eldap.hrl").
--include("jlib.hrl").
-define(PROCNAME, ejabberd_mod_vcard_ldap).
@@ -153,9 +154,10 @@ stop(Host) ->
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),
+ HostB = list_to_binary(Host),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_VCARD),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_VCARD),
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 50),
case State#state.search of
true ->
ejabberd_router:unregister_route(State#state.myhost);
@@ -168,13 +170,15 @@ start_link(Host, Opts) ->
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
init([Host, Opts]) ->
+ HostB = list_to_binary(Host),
State = parse_options(Host, Opts),
IQDisc = gen_mod:get_opt(iqdisc, Opts, parallel),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_VCARD,
?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_VCARD,
?MODULE, process_sm_iq, IQDisc),
- ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:add(disco_sm_features,
+ list_to_binary(Host), ?MODULE, get_sm_features, 50),
eldap_pool:start_link(State#state.eldap_id,
State#state.servers,
State#state.backups,
@@ -195,7 +199,8 @@ handle_info({route, From, To, Packet}, State) ->
Pid when is_pid(Pid) ->
ok;
_ ->
- Err = jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR),
+ Err = exmpp_stanza:reply_with_error(Packet,
+ 'internal-server-error'),
ejabberd_router:route(To, From, Err)
end,
{noreply, State};
@@ -210,53 +215,46 @@ get_sm_features(Acc, _From, _To, Node, _Lang) ->
[] ->
case Acc of
{result, Features} ->
- {result, [?NS_VCARD | Features]};
+ {result, [?NS_VCARD_s | Features]};
empty ->
- {result, [?NS_VCARD]}
+ {result, [?NS_VCARD_s]}
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-2009 ProcessOne"}]},
- {xmlelement, "BDAY", [],
- [{xmlcdata, "2002-11-16"}]}
- ]}]}
- end.
+process_local_iq(_From, _To, #iq{type = get, lang = Lang} = IQ_Rec) ->
+ Result = #xmlel{ns = ?NS_VCARD, name = 'vCard', children = [
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'FN'},
+ "ejabberd"),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'URL'},
+ ?EJABBERD_URI),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'DESC'},
+ translate:translate(Lang, "Erlang Jabber Server") ++
+ "\nCopyright (c) 2002-2009 ProcessOne"),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'BDAY'},
+ "2002-11-16")
+ ]},
+ exmpp_iq:result(IQ_Rec, Result);
+process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
-process_sm_iq(_From, #jid{lserver=LServer} = To, #iq{sub_el = SubEl} = IQ) ->
- case catch process_vcard_ldap(To, IQ, LServer) of
+process_sm_iq(_From, To, #iq{} = IQ_Rec) ->
+ LServer = exmpp_jid:prep_domain_as_list(To),
+ case catch process_vcard_ldap(To, IQ_Rec, LServer) of
{'EXIT', _} ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]};
+ exmpp_iq:error(IQ_Rec, 'internal-server-error');
Other ->
Other
end.
-process_vcard_ldap(To, IQ, Server) ->
+process_vcard_ldap(To, IQ_Rec, Server) ->
{ok, State} = eldap_utils:get_state(Server, ?PROCNAME),
- #iq{type = Type, sub_el = SubEl} = IQ,
- case Type of
+ case IQ_Rec#iq.type of
set ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+ exmpp_iq:error(IQ_Rec, 'not-allowed');
get ->
- #jid{luser = LUser} = To,
+ LUser = exmpp_jid:prep_node_as_list(To),
LServer = State#state.serverhost,
case ejabberd_auth:is_user_exists(LUser, LServer) of
true ->
@@ -264,12 +262,12 @@ process_vcard_ldap(To, IQ, Server) ->
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};
+ exmpp_iq:result(IQ_Rec, Vcard);
_ ->
- IQ#iq{type = result, sub_el = []}
+ exmpp_iq:result(IQ_Rec)
end;
_ ->
- IQ#iq{type = result, sub_el = []}
+ exmpp_iq:result(IQ_Rec)
end
end.
@@ -302,254 +300,241 @@ find_ldap_user(User, State) ->
ldap_attributes_to_vcard(Attributes, VCardMap, UD) ->
Attrs = lists:map(
fun({VCardName, _, _}) ->
- {stringprep:tolower(VCardName),
+ {exmpp_stringprep:to_lower(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}],
+ [#xmlel{ns = ?NS_VCARD, name = 'vCard', children =
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]}])
+ [#xmlel{ns = ?NS_VCARD, name = 'N', children = [X || X <- NElts, X /= none]},
+ #xmlel{ns = ?NS_VCARD, name = 'ORG', children = [X || X <- OElts, X /= none]},
+ #xmlel{ns = ?NS_VCARD, name = 'ADR', children = [X || X <- AElts, X /= none]}])
}].
ldap_attribute_to_vcard(vCard, {"fn", Value}) ->
- {xmlelement,"FN",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'FN'}, Value);
ldap_attribute_to_vcard(vCard, {"nickname", Value}) ->
- {xmlelement,"NICKNAME",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'NICKNAME'}, Value);
ldap_attribute_to_vcard(vCard, {"title", Value}) ->
- {xmlelement,"TITLE",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'TITLE'}, Value);
ldap_attribute_to_vcard(vCard, {"bday", Value}) ->
- {xmlelement,"BDAY",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'BDAY'}, Value);
ldap_attribute_to_vcard(vCard, {"url", Value}) ->
- {xmlelement,"URL",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'URL'}, Value);
ldap_attribute_to_vcard(vCard, {"desc", Value}) ->
- {xmlelement,"DESC",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'DESC'}, Value);
ldap_attribute_to_vcard(vCard, {"role", Value}) ->
- {xmlelement,"ROLE",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'ROLE'}, Value);
ldap_attribute_to_vcard(vCard, {"tel", Value}) ->
- {xmlelement,"TEL",[],[{xmlelement,"VOICE",[],[]},
- {xmlelement,"WORK",[],[]},
- {xmlelement,"NUMBER",[],[{xmlcdata,Value}]}]};
+ #xmlel{ns = ?NS_VCARD, name = 'TEL', children = [
+ #xmlel{ns = ?NS_VCARD, name = 'VOICE'},
+ #xmlel{ns = ?NS_VCARD, name = 'WORK'},
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'NUMBER'}, Value)]};
ldap_attribute_to_vcard(vCard, {"email", Value}) ->
- {xmlelement,"EMAIL",[],[{xmlelement,"INTERNET",[],[]},
- {xmlelement,"PREF",[],[]},
- {xmlelement,"USERID",[],[{xmlcdata,Value}]}]};
+ #xmlel{ns = ?NS_VCARD, name = 'EMAIL', children = [
+ #xmlel{ns = ?NS_VCARD, name = 'INTERNET'},
+ #xmlel{ns = ?NS_VCARD, name = 'PREF'},
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'USERID'}, Value)]};
ldap_attribute_to_vcard(vCard, {"photo", Value}) ->
- {xmlelement,"PHOTO",[],[
- {xmlelement,"BINVAL",[],[{xmlcdata, jlib:encode_base64(Value)}]}]};
+ #xmlel{ns = ?NS_VCARD, name = 'PHOTO', children = [
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'BINVAL'},
+ jlib:encode_base64(Value))]};
ldap_attribute_to_vcard(vCardN, {"family", Value}) ->
- {xmlelement,"FAMILY",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'FAMILY'}, Value);
ldap_attribute_to_vcard(vCardN, {"given", Value}) ->
- {xmlelement,"GIVEN",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'GIVEN'}, Value);
ldap_attribute_to_vcard(vCardN, {"middle", Value}) ->
- {xmlelement,"MIDDLE",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'MIDDLE'}, Value);
ldap_attribute_to_vcard(vCardO, {"orgname", Value}) ->
- {xmlelement,"ORGNAME",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'ORGNAME'}, Value);
ldap_attribute_to_vcard(vCardO, {"orgunit", Value}) ->
- {xmlelement,"ORGUNIT",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'ORGUNIT'}, Value);
ldap_attribute_to_vcard(vCardA, {"locality", Value}) ->
- {xmlelement,"LOCALITY",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'LOCALITY'}, Value);
ldap_attribute_to_vcard(vCardA, {"street", Value}) ->
- {xmlelement,"STREET",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'STREET'}, Value);
ldap_attribute_to_vcard(vCardA, {"ctry", Value}) ->
- {xmlelement,"CTRY",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'CTRY'}, Value);
ldap_attribute_to_vcard(vCardA, {"region", Value}) ->
- {xmlelement,"REGION",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'REGION'}, Value);
ldap_attribute_to_vcard(vCardA, {"pcode", Value}) ->
- {xmlelement,"PCODE",[],[{xmlcdata,Value}]};
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'PCODE'}, Value);
ldap_attribute_to_vcard(_, _) ->
none.
-define(TLFIELD(Type, Label, Var),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}], []}).
+ #xmlel{ns = ?NS_VCARD, name = 'field', attrs = [
+ ?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('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)}]).
+ [#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "You need an x:data capable client to search"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"form">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Search users in ") ++
+ exmpp_jid:to_list(JID))}]},
+ #xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Fill in fields to search "
+ "for any matching Jabber User"))}]}
+ ] ++ lists:map(fun({X,Y}) -> ?TLFIELD(<<"text-single">>, X, list_to_binary(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,
+ User = exmpp_jid:node(To),
+ Resource = exmpp_jid:resource(To),
ServerHost = State#state.serverhost,
if
- (User /= "") or (Resource /= "") ->
- Err = jlib:make_error_reply(Packet, ?ERR_SERVICE_UNAVAILABLE),
+ (User /= undefined) or (Resource /= undefined) ->
+ Err = exmpp_stanza:reply_with_error(Packet, '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));
+ try
+ Request = exmpp_iq:get_request(Packet),
+ Type = exmpp_iq:get_type(Packet),
+ Lang = exmpp_stanza:get_lang(Packet),
+ case {Type, Request#xmlel.ns} of
+ {set, ?NS_SEARCH} ->
+ XDataEl = find_xdata_el(Request),
+ case XDataEl of
+ false ->
+ Err = exmpp_iq:error(Packet, 'bad-request'),
+ ejabberd_router:route(To, From, Err);
+ _ ->
+ XData = jlib:parse_xdata_submit(XDataEl),
+ case XData of
+ invalid ->
+ Err = exmpp_iq:error(Packet,
+ 'bad-request'),
+ ejabberd_router:route(To, From,
+ Err);
+ _ ->
+ Result = #xmlel{
+ ns = ?NS_SEARCH,
+ name = 'query',
+ children = [
+ #xmlel{
+ ns = ?NS_DATA_FORMS,
+ name = 'x',
+ attrs = [?XMLATTR('type',
+ <<"result">>)],
+ children = search_result(Lang, To, State, XData)}]},
+ ResIQ = exmpp_iq:result(Packet,
+ Result),
+ ejabberd_router:route(
+ To, From, ResIQ)
+ end
+ end;
+ {get, ?NS_SEARCH} ->
+ SearchFields = State#state.search_fields,
+ Result = #xmlel{ns = ?NS_SEARCH, name = 'query',
+ children = ?FORM(To, SearchFields)},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {set, ?NS_DISCO_INFO} ->
+ Err = exmpp_iq:error(Packet, 'not-allowed'),
+ ejabberd_router:route(To, From, Err);
+ {get, ?NS_DISCO_INFO} ->
+ ServerHostB = list_to_binary(ServerHost),
+ Info = ejabberd_hooks:run_fold(
+ disco_info, ServerHostB, [],
+ [ServerHost, ?MODULE, <<>>, ""]),
+ Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
+ children = Info ++ [
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
+ attrs = [
+ ?XMLATTR('category', <<"directory">>),
+ ?XMLATTR('type', <<"user">>),
+ ?XMLATTR('name', translate:translate(Lang,
+ "vCard User Search"))]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [
+ ?XMLATTR('var', ?NS_SEARCH_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [
+ ?XMLATTR('var', ?NS_VCARD_s)]}
+ ]},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {set, ?NS_DISCO_ITEMS} ->
+ Err = exmpp_iq:error(Packet, 'not-allowed'),
+ ejabberd_router:route(To, From, Err);
+ {get, ?NS_DISCO_ITEMS} ->
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS, name = 'query'},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {get, ?NS_VCARD} ->
+ Result = #xmlel{ns = ?NS_VCARD, name = 'vCard',
+ children = iq_get_vcard(Lang)},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ _ ->
+ Err = exmpp_iq:error(Packet, 'service-unavailable'),
+ ejabberd_router:route(To, From, Err)
+ end
+ catch
_ ->
- Err = jlib:make_error_reply(Packet,
- ?ERR_SERVICE_UNAVAILABLE),
- ejabberd_router:route(To, From, Err)
+ Err1 = exmpp_iq:error(Packet, 'service-unavailable'),
+ ejabberd_router:route(To, From, Err1)
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-2009 ProcessOne"}]}].
-
--define(LFIELD(Label, Var),
- {xmlelement, "field", [{"label", translate:translate(Lang, Label)},
- {"var", Var}], []}).
+ [
+ #xmlel{ns = ?NS_SEARCH, name = 'FN', children = [
+ #xmlcdata{cdata = <<"ejabberd/mod_vcard">>}]},
+ #xmlel{ns = ?NS_SEARCH, name = 'URL', children = [
+ #xmlcdata{cdata = list_to_binary(?EJABBERD_URI)}]},
+ #xmlel{ns = ?NS_SEARCH, name ='DESC', children = [
+ #xmlcdata{cdata = list_to_binary(
+ translate:translate(Lang, "ejabberd vCard module") ++
+ "\nCopyright (c) 2003-2009 ProcessOne")}]}
+ ].
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")] ++
+ Header = [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Search Results for ") ++
+ exmpp_jid:to_list(JID))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'reported', children =
+ [?TLFIELD(<<"text-single">>, "Jabber ID", <<"jid">>)] ++
lists:map(
- fun({Name, Value}) -> ?TLFIELD("text-single", Name, Value) end,
+ fun({Name, Value}) -> ?TLFIELD(<<"text-single">>, Name, list_to_binary(Value)) end,
SearchReported)
}],
case search(State, Data) of
@@ -560,9 +545,10 @@ search_result(Lang, JID, State, Data) ->
end.
-define(FIELD(Var, Val),
- {xmlelement, "field", [{"var", Var}],
- [{xmlelement, "value", [],
- [{xmlcdata, Val}]}]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', Var)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = Val}]}]}).
search(State, Data) ->
Base = State#state.base,
@@ -609,9 +595,9 @@ search_items(Entries, State) ->
VCardMap,
{Username, ?MYNAME})}
end, SearchReported),
- Result = [?FIELD("jid", Username ++ "@" ++ LServer)] ++
- [?FIELD(Name, Value) || {Name, Value} <- RFields],
- [{xmlelement, "item", [], Result}];
+ Result = [?FIELD(<<"jid">>, list_to_binary(Username ++ "@" ++ LServer))] ++
+ [?FIELD(list_to_binary(Name), list_to_binary(Value)) || {Name, Value} <- RFields],
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'item', children = Result}];
_ ->
[]
end;
@@ -653,13 +639,8 @@ find_xdata_el({xmlelement, _Name, _Attrs, 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([#xmlel{ns = ?NS_DATA_FORMS} = El | _Els]) ->
+ El;
find_xdata_el1([_ | Els]) ->
find_xdata_el1(Els).
diff --git a/src/mod_vcard_odbc.erl b/src/mod_vcard_odbc.erl
index 44d8eacd6..71b7aa21e 100644
--- a/src/mod_vcard_odbc.erl
+++ b/src/mod_vcard_odbc.erl
@@ -36,22 +36,24 @@
%reindex_vcards/0,
remove_user/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-define(JUD_MATCHES, 30).
-define(PROCNAME, ejabberd_mod_vcard).
start(Host, Opts) ->
- ejabberd_hooks:add(remove_user, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:add(remove_user, HostB,
?MODULE, remove_user, 50),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
+ gen_iq_handler:add_iq_handler(ejabberd_local, HostB, ?NS_VCARD,
?MODULE, process_local_iq, IQDisc),
- gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD,
+ gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_VCARD,
?MODULE, process_sm_iq, IQDisc),
- ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
+ ejabberd_hooks:add(disco_sm_features, HostB, ?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),
@@ -85,11 +87,12 @@ loop(Host, ServerHost) ->
end.
stop(Host) ->
- ejabberd_hooks:delete(remove_user, Host,
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:delete(remove_user, HostB,
?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),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_VCARD),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_VCARD),
+ ejabberd_hooks:delete(disco_sm_features, HostB, ?MODULE, get_sm_features, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
Proc ! stop,
{wait, Proc}.
@@ -102,82 +105,88 @@ get_sm_features(Acc, _From, _To, Node, _Lang) ->
[] ->
case Acc of
{result, Features} ->
- {result, [?NS_VCARD | Features]};
+ {result, [?NS_VCARD_s | Features]};
empty ->
- {result, [?NS_VCARD]}
+ {result, [?NS_VCARD_s]}
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-2009 ProcessOne"}]},
- {xmlelement, "BDAY", [],
- [{xmlcdata, "2002-11-16"}]}
- ]}]}
- end.
+process_local_iq(_From, _To, #iq{type = get, lang = Lang} = IQ_Rec) ->
+ Result = #xmlel{ns = ?NS_VCARD, name = 'vCard', children = [
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'FN'},
+ "ejabberd"),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'URL'},
+ ?EJABBERD_URI),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'DESC'},
+ translate:translate(Lang, "Erlang Jabber Server") ++
+ "\nCopyright (c) 2002-2009 ProcessOne"),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_VCARD, name = 'BDAY'},
+ "2002-11-16")
+ ]},
+ exmpp_iq:result(IQ_Rec, Result);
+process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed').
-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
+process_sm_iq(_From, To, #iq{type = get} = IQ_Rec) ->
+ LUser = exmpp_jid:prep_node_as_list(To),
+ LServer = exmpp_jid:prep_domain_as_list(To),
+ Username = ejabberd_odbc:escape(LUser),
+ case catch odbc_queries:get_vcard(LServer, Username) of
+ {selected, ["vcard"], [{SVCARD}]} ->
+ try exmpp_xml:parse_document(SVCARD,
+ [names_as_atom, {check_elems, xmpp},
+ {check_nss,xmpp}, {check_attrs,xmpp}]) of
+ [VCARD] ->
+ exmpp_iq:result(IQ_Rec, VCARD)
+ catch
+ _Type:_Error ->
+ ?ERROR_MSG("Error parsing vCard: ~s", [SVCARD]),
+ exmpp_iq:error(IQ_Rec, 'service-unavailable')
+ end;
+ {selected, ["vcard"], []} ->
+ exmpp_iq:result(IQ_Rec);
+ _ ->
+ exmpp_iq:error(IQ_Rec, 'internal-server-error')
+ end;
+process_sm_iq(From, _To, #iq{type = set, payload = Request} = IQ_Rec) ->
+ User = exmpp_jid:node_as_list(From),
+ LServer = exmpp_jid:prep_domain_as_list(From),
+ case lists:member(LServer, ?MYHOSTS) of
+ true ->
+ set_vcard(User, LServer, Request),
+ exmpp_iq:result(IQ_Rec);
+ false ->
+ exmpp_iq:error(IQ_Rec, 'not-allowed')
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]),
+ FN = exmpp_xml:get_path(VCARD,
+ [{element, 'FN'}, cdata_as_list]),
+ Family = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'FAMILY'}, cdata_as_list]),
+ Given = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'GIVEN'}, cdata_as_list]),
+ Middle = exmpp_xml:get_path(VCARD,
+ [{element, 'N'}, {element, 'MIDDLE'}, cdata_as_list]),
+ Nickname = exmpp_xml:get_path(VCARD,
+ [{element, 'NICKNAME'}, cdata_as_list]),
+ BDay = exmpp_xml:get_path(VCARD,
+ [{element, 'BDAY'}, cdata_as_list]),
+ CTRY = exmpp_xml:get_path(VCARD,
+ [{element, 'ADR'}, {element, 'CTRY'}, cdata_as_list]),
+ Locality = exmpp_xml:get_path(VCARD,
+ [{element, 'ADR'}, {element, 'LOCALITY'}, cdata_as_list]),
+ EMail1 = exmpp_xml:get_path(VCARD,
+ [{element, 'EMAIL'}, {element, 'USERID'}, cdata_as_list]),
+ EMail2 = exmpp_xml:get_path(VCARD,
+ [{element, 'EMAIL'}, cdata_as_list]),
+ OrgName = exmpp_xml:get_path(VCARD,
+ [{element, 'ORG'}, {element, 'ORGNAME'}, cdata_as_list]),
+ OrgUnit = exmpp_xml:get_path(VCARD,
+ [{element, 'ORG'}, {element, 'ORGUNIT'}, cdata_as_list]),
EMail = case EMail1 of
"" ->
EMail2;
@@ -185,296 +194,262 @@ set_vcard(User, LServer, VCARD) ->
EMail1
end,
- LUser = jlib:nodeprep(User),
- 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),
+ try
+ LUser = exmpp_stringprep:nodeprep(User),
+ LFN = exmpp_stringprep:to_lower(FN),
+ LFamily = exmpp_stringprep:to_lower(Family),
+ LGiven = exmpp_stringprep:to_lower(Given),
+ LMiddle = exmpp_stringprep:to_lower(Middle),
+ LNickname = exmpp_stringprep:to_lower(Nickname),
+ LBDay = exmpp_stringprep:to_lower(BDay),
+ LCTRY = exmpp_stringprep:to_lower(CTRY),
+ LLocality = exmpp_stringprep:to_lower(Locality),
+ LEMail = exmpp_stringprep:to_lower(EMail),
+ LOrgName = exmpp_stringprep:to_lower(OrgName),
+ LOrgUnit = exmpp_stringprep:to_lower(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(
- lists:flatten(xml:element_to_string(VCARD))),
+ Username = ejabberd_odbc:escape(User),
+ LUsername = ejabberd_odbc:escape(LUser),
+ SVCARD = ejabberd_odbc:escape(exmpp_xml:document_to_list(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),
+ 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)
+ 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)
+ catch
+ _ ->
+ {error, badarg}
end.
-define(TLFIELD(Type, Label, Var),
- {xmlelement, "field", [{"type", Type},
- {"label", translate:translate(Lang, Label)},
- {"var", Var}], []}).
+ #xmlel{ns = ?NS_VCARD, name = 'field', attrs = [
+ ?XMLATTR('type', Type),
+ ?XMLATTR('label', translate:translate(Lang, Label)),
+ ?XMLATTR('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")
+ [#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "You need an x:data capable client to search"))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
+ [?XMLATTR('type', <<"form">>)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Search users in ") ++ exmpp_jid:to_list(JID))}]},
+ #xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
+ [#xmlcdata{cdata = list_to_binary(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,
+ User = exmpp_jid:node(To),
+ Resource = exmpp_jid:resource(To),
if
- (User /= "") or (Resource /= "") ->
- Err = jlib:make_error_reply(Packet, ?ERR_SERVICE_UNAVAILABLE),
+ (User /= undefined) or (Resource /= undefined) ->
+ Err = exmpp_stanza:reply_with_error(Packet, '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));
+ try
+ Request = exmpp_iq:get_request(Packet),
+ Type = exmpp_iq:get_type(Packet),
+ Lang = exmpp_stanza:get_lang(Packet),
+ case {Type, Request#xmlel.ns} of
+ {set, ?NS_SEARCH} ->
+ XDataEl = find_xdata_el(Request),
+ case XDataEl of
+ false ->
+ Err = exmpp_iq:error(Packet, 'bad-request'),
+ ejabberd_router:route(To, From, Err);
+ _ ->
+ XData = jlib:parse_xdata_submit(XDataEl),
+ case XData of
+ invalid ->
+ Err = exmpp_iq:error(Packet, 'bad-request'),
+ ejabberd_router:route(To, From, Err);
+ _ ->
+ Result = #xmlel{ns = ?NS_SEARCH,
+ name = 'query',
+ children = [
+ #xmlel{ns = ?NS_DATA_FORMS,
+ name = 'x',
+ attrs = [
+ ?XMLATTR('type',
+ <<"result">>)],
+ children = search_result(Lang,
+ To, ServerHost, XData)}]},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(
+ To, From, ResIQ)
+ end
+ end;
+ {get, ?NS_SEARCH} ->
+ Result = #xmlel{ns = ?NS_SEARCH, name = 'query',
+ children = ?FORM(To)},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {set, ?NS_DISCO_INFO} ->
+ Err = exmpp_iq:error(Packet, 'not-allowed'),
+ ejabberd_router:route(To, From, Err);
+ {get, ?NS_DISCO_INFO} ->
+ ServerHostB = list_to_binary(ServerHost),
+ Info = ejabberd_hooks:run_fold(
+ disco_info, ServerHostB, [],
+ [ServerHost, ?MODULE, <<>>, ""]),
+ Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
+ children = Info ++ [
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
+ attrs = [
+ ?XMLATTR('category', <<"directory">>),
+ ?XMLATTR('type', <<"user">>),
+ ?XMLATTR('name', translate:translate(Lang,
+ "vCard User Search"))]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [
+ ?XMLATTR('var', ?NS_SEARCH_s)]},
+ #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
+ attrs = [
+ ?XMLATTR('var', ?NS_VCARD_s)]}
+ ]},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {set, ?NS_DISCO_ITEMS} ->
+ Err = exmpp_iq:error(Packet, 'not-allowed'),
+ ejabberd_router:route(To, From, Err);
+ {get, ?NS_DISCO_ITEMS} ->
+ Result = #xmlel{ns = ?NS_DISCO_ITEMS, name = 'query'},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ {get, ?NS_VCARD} ->
+ Result = #xmlel{ns = ?NS_VCARD, name = 'vCard',
+ children = iq_get_vcard(Lang)},
+ ResIQ = exmpp_iq:result(Packet, Result),
+ ejabberd_router:route(To,
+ From,
+ ResIQ);
+ _ ->
+ Err = exmpp_iq:error(Packet, 'service-unavailable'),
+ ejabberd_router:route(To, From, Err)
+ end
+ catch
_ ->
- Err = jlib:make_error_reply(Packet,
- ?ERR_SERVICE_UNAVAILABLE),
- ejabberd_router:route(To, From, Err)
+ Err1 = exmpp_iq:error(Packet, 'service-unavailable'),
+ ejabberd_router:route(To, From, Err1)
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-2009 ProcessOne"}]}].
+ [
+ #xmlel{ns = ?NS_SEARCH, name = 'FN', children = [
+ #xmlcdata{cdata = <<"ejabberd/mod_vcard">>}]},
+ #xmlel{ns = ?NS_SEARCH, name = 'URL', children = [
+ #xmlcdata{cdata = list_to_binary(?EJABBERD_URI)}]},
+ #xmlel{ns = ?NS_SEARCH, name ='DESC', children = [
+ #xmlcdata{cdata = list_to_binary(
+ translate:translate(Lang, "ejabberd vCard module") ++
+ "\nCopyright (c) 2003-2009 ProcessOne")}]}
+ ].
-find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) ->
+find_xdata_el(#xmlel{children = 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([#xmlel{ns = ?NS_DATA_FORMS} = El | _Els]) ->
+ El;
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")
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
+ [#xmlcdata{cdata = list_to_binary(
+ translate:translate(Lang, "Search Results for ") ++
+ exmpp_jid:to_list(JID))}]},
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'reported', children =
+ [?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}]}]}).
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
+ [?XMLATTR('var', Var)], children =
+ [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
+ [#xmlcdata{cdata = Val}]}]}).
record_to_item(LServer, {Username, FN, Family, Given, Middle,
Nickname, BDay, CTRY, Locality,
EMail, OrgName, OrgUnit}) ->
- {xmlelement, "item", [],
+ #xmlel{ns = ?NS_DATA_FORMS, name = 'item', children =
[
- ?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)
+ ?FIELD(<<"jid">>, list_to_binary(Username ++ "@" ++ LServer)),
+ ?FIELD(<<"fn">>, list_to_binary(FN)),
+ ?FIELD(<<"last">>, list_to_binary(Family)),
+ ?FIELD(<<"first">>, list_to_binary(Given)),
+ ?FIELD(<<"middle">>, list_to_binary(Middle)),
+ ?FIELD(<<"nick">>, list_to_binary(Nickname)),
+ ?FIELD(<<"bday">>, list_to_binary(BDay)),
+ ?FIELD(<<"ctry">>, list_to_binary(CTRY)),
+ ?FIELD(<<"locality">>, list_to_binary(Locality)),
+ ?FIELD(<<"email">>, list_to_binary(EMail)),
+ ?FIELD(<<"orgname">>, list_to_binary(OrgName)),
+ ?FIELD(<<"orgunit">>, list_to_binary(OrgUnit))
]
}.
@@ -529,7 +504,7 @@ filter_fields([], Match, _LServer) ->
end;
filter_fields([{SVar, [Val]} | Ds], Match, LServer)
when is_list(Val) and (Val /= "") ->
- LVal = stringprep:tolower(Val),
+ LVal = exmpp_stringprep:to_lower(Val),
NewMatch = case SVar of
"user" -> make_val(Match, "lusername", LVal);
"fn" -> make_val(Match, "lfn", LVal);
@@ -641,9 +616,9 @@ make_val(Match, Field, Val) ->
% mnesia:transaction(F).
-remove_user(User, Server) ->
- LUser = jlib:nodeprep(User),
- LServer = jlib:nameprep(Server),
+remove_user(User, Server) when is_binary(User), is_binary(Server) ->
+ LUser = binary_to_list(exmpp_stringprep:nodeprep(User)),
+ LServer = binary_to_list(exmpp_stringprep:nameprep(Server)),
Username = ejabberd_odbc:escape(LUser),
ejabberd_odbc:sql_transaction(
LServer,
diff --git a/src/mod_version.erl b/src/mod_version.erl
index 6606bb7a7..23d49a6c7 100644
--- a/src/mod_version.erl
+++ b/src/mod_version.erl
@@ -33,40 +33,39 @@
stop/1,
process_local_iq/3]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VERSION,
+ gen_iq_handler:add_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_SOFT_VERSION,
?MODULE, process_local_iq, IQDisc).
stop(Host) ->
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_VERSION).
+ gen_iq_handler:remove_iq_handler(ejabberd_local, list_to_binary(Host), ?NS_SOFT_VERSION).
-process_local_iq(_From, To, #iq{id = _ID, type = Type,
- xmlns = _XMLNS, sub_el = SubEl} = IQ) ->
+process_local_iq(_From, To, #iq{type = Type} = IQ_Rec) ->
case Type of
set ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+ exmpp_iq:error(IQ_Rec, 'not-allowed');
get ->
- Host = To#jid.server,
+ Host = exmpp_jid:domain_as_list(To),
OS = case gen_mod:get_module_opt(Host, ?MODULE, show_os, true) of
true -> [get_os()];
false -> []
end,
- IQ#iq{type = result,
- sub_el = [{xmlelement, "query",
- [{"xmlns", ?NS_VERSION}],
- [{xmlelement, "name", [],
- [{xmlcdata, "ejabberd"}]},
- {xmlelement, "version", [],
- [{xmlcdata, ?VERSION}]}
- ] ++ OS
- }]}
+ R = #xmlel{ns = ?NS_SOFT_VERSION, name = 'query',
+ children = [ exmpp_xml:set_cdata(#xmlel{ns = ?NS_SOFT_VERSION,
+ name = 'name'},
+ <<"ejabberd">>),
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_SOFT_VERSION,
+ name = 'version'},
+ ?VERSION) | OS]},
+ exmpp_iq:result(IQ_Rec, R)
end.
@@ -87,4 +86,4 @@ get_os() ->
VersionString
end,
OS = OSType ++ " " ++ OSVersion,
- {xmlelement, "os", [], [{xmlcdata, OS}]}.
+ exmpp_xml:set_cdata(#xmlel{ns = ?NS_SOFT_VERSION, name = 'os'}, OS).
diff --git a/src/msgs/ca.msg b/src/msgs/ca.msg
index 6cc871f21..f227aa851 100644
--- a/src/msgs/ca.msg
+++ b/src/msgs/ca.msg
@@ -14,8 +14,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Permetre que aquesta JID es puga subscriure a aquest node pubsub"}.
+{"Allow users to change subject","Permetre que els usuaris canvien 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"}.
@@ -24,7 +24,6 @@
{"All Users","Tots els usuaris"}.
{"Announcements","Anuncis"}.
{"anyone","qualsevol"}.
-{"A password is required to enter this room","Es necessita password per a entrar en aquesta sala"}.
{"April","Abril"}.
{"August","Agost"}.
{"Backup","Guardar còpia de seguretat"}.
@@ -45,16 +44,15 @@
{"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"}.
+{"Configuration for ","Configuració per a "}.
{"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"}.
+{"Default users as participants","Els usuaris per defecte són els participants"}.
{"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"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","Mòdul ejabberd vCard"}.
{"ejabberd virtual hosts","Hosts virtuals del ejabberd"}.
{"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"}.
+{"Encodings","Codificacions"}.
{"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"}.
@@ -86,14 +83,9 @@
{"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 textque 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 contrassenyes per a utilitzar al connectar als servidors de IRC "}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Introdueix el nom d'usuari i les codificacions de caràcters per a utilitzar 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Exemple: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Cognom"}.
{"February","Febrer"}.
{"Fill in fields to search for any matching Jabber User","Emplena camps per a buscar usuaris Jabber que concorden"}.
@@ -116,13 +108,10 @@
{"has been kicked","Has sigut expulsat"}.
{" has set the subject to: "," ha posat l'assumpte: "}.
{"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.","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, \"contrassenya\"}'. Aquest servei utilitza per defecte la codificació \"~s\", port ~p, no contrassenya."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Si vols especificar codificacions de caràcters distints per a cada servidor IRC emplena aquesta llista amb els valors amb el format '{\"servidor irc\", \"codificació\"}'. Aquest servei utilitza per defecte la codificació \"~s\"."}.
{"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"}.
@@ -130,24 +119,16 @@
{"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 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"}.
+{"Jabber ID ~s is invalid","El JID ~s no és vàlid"}.
{"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"}.
@@ -160,8 +141,7 @@
{"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 members-only","Crear una sala de \"soles membres\""}.
{"Make room moderated","Crear una sala moderada"}.
{"Make room password protected","Crear una sala amb password"}.
{"Make room persistent","Crear una sala persistent"}.
@@ -171,14 +151,13 @@
{"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"}.
+{"Membership required to enter this room","Necessites ser membre d'aquesta sala per a poder entrar"}.
{"Members:","Membre:"}.
{"Memory","Memòria"}.
{"Message body","Missatge"}.
{"Middle Name","Segon nom"}.
{"Moderator privileges required","Es necessita tenir privilegis de moderador"}.
-{"moderators only","només moderadors"}.
-{"Modified modules","Mòduls modificats"}.
+{"moderators only","sols moderadors"}.
{"Module","Mòdul"}.
{"Modules at ","Mòduls en "}.
{"Modules","Mòduls"}.
@@ -186,6 +165,8 @@
{"Name:","Nom:"}.
{"Name","Nom"}.
{"Never","Mai"}.
+{"Nickname is already in use by another occupant","El Nickname està siguent utilitzat per una altra persona"}.
+{"Nickname is registered by another person","El Nickname ja està registrat per una altra persona"}.
{"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"}.
@@ -198,7 +179,6 @@
{"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"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Sols els moderadors i participants poden canviar l'assumpte d'aquesta sala"}.
+{"Only moderators are allowed to change subject in this room","Sols els moderadors poden canviar l'assumpte d'aquesta sala"}.
{"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 solicituts 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"}.
@@ -227,9 +207,9 @@
{"Outgoing s2s Servers:","Servidors d'eixida de s2s"}.
{"Owner privileges required","Es requerixen privilegis de propietari de la sala"}.
{"Packet","Paquet"}.
-{"Password ~b","Password ~b"}.
{"Password:","Password:"}.
{"Password","Password"}.
+{"Password required to enter this room","Es necessita password per a entrar en aquesta sala"}.
{"Password Verification","Verificació del Password"}.
{"Path to Dir","Ruta al directori"}.
{"Path to File","Ruta al fitxer"}.
@@ -237,26 +217,24 @@
{"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."}.
{"Pong","Pong"}.
-{"Port ~b","Port ~b"}.
{"Port","Port"}.
-{"Present real Jabber IDs to","Presentar Jabber ID's reals a"}.
+{"Present real Jabber IDs to","Presentar JID's reals a"}.
{"private, ","privat"}.
-{"Protocol","Protocol"}.
{"Publish-Subscribe","Publicar-subscriure't"}.
-{"PubSub subscriber request","Petició de subscriptor PubSub"}.
+{"PubSub subscriber request","Petició de PubSub subscriure"}.
{"Queries to the conference members are not allowed in this room"," En aquesta sala no es permeten solicituts als membres de la sala"}.
{"RAM and disc copy","Còpia en RAM i disc"}.
{"RAM copy","Còpia en RAM"}.
+{"(Raw)","(en format text)"}.
{"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"}.
{"Registered Users:","Usuaris registrats:"}.
{"Registered Users","Usuaris registrats"}.
{"Registration in mod_irc for ","Registre en mod_irc per a"}.
+{"Remark 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.","Recordar que estes opcions sols 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."}.
{"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ó"}.
@@ -270,8 +248,6 @@
{"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"}.
@@ -289,14 +265,15 @@
{"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"}.
{"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"}.
+{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i envia 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"}.
+{"Size","Tamany"}.
+{"Specified nickname is already registered","El Nickname especificat ja està registrat, busca-te'n un altre"}.
{"Specify the access model","Especificar el model d'accés"}.
{"Specify the publisher model","Especificar el model del publicant"}.
{"~s's Offline Messages Queue","~s's cua de missatges offline"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","Les col.leccions amb les que un node està afiliat"}.
{"the password is","el password és"}.
{"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"}.
@@ -329,7 +302,7 @@
{"This room is not anonymous","Aquesta sala no és anònima"}.
{"Thursday","Dijous"}.
{"Time","Data"}.
-{"Time delay","Temps de retard"}.
+{"Time delay","Temps de retràs"}.
{"To","Per a"}.
{"To ~s","A ~s"}.
{"Traffic rate limit is exceeded","El llímit de tràfic ha sigut sobrepassat"}.
@@ -338,10 +311,9 @@
{"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"}.
{"Update ","Actualitzar"}.
{"Update","Actualitzar"}.
+{"Updated modules","Mòduls actualitzats"}.
{"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ó"}.
@@ -349,13 +321,14 @@
{"Uptime:","Temps en marxa"}.
{"Use of STARTTLS required","És obligatori utilitzar STARTTLS"}.
{"User Management","Gestió d'Usuaris"}.
-{"Users are not allowed to register accounts so quickly","Els usuaris no tenen permís per a crear comptes tan depresa"}.
+{"Users are not allowed to register accounts so fast","Els usuarios no tenen permis per a crear comptes tan apresa"}.
{"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"}.
{"Wednesday","Dimecres"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Necessites un client amb suport x:data per a poder registrar el Nickname"}.
{"You need an x:data capable client to search","Necesites un client amb suport x:data per a poder buscar"}.
{"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 messages to ~s are being blocked. To unblock them, visit ~s","Els teus missatges per ~s s'estan bloquejant. Per desbloquejar-los, visita ~s"}.
diff --git a/src/msgs/ca.po b/src/msgs/ca.po
index 4e794a1d5..661a6085e 100644
--- a/src/msgs/ca.po
+++ b/src/msgs/ca.po
@@ -1,38 +1,24 @@
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
-"Last-Translator: Jan Kusanagi\n"
+"Last-Translator: Vicent Alberola Canet\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"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "És obligatori utilitzar STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Recurs no disponible"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Reemplaçat per una nova connexió"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Introdueix el textque veus"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -49,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Segur que vols eliminar el missatge del dia?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Assumpte"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Missatge"
@@ -77,7 +63,7 @@ msgstr "Enviar anunci a tots els usuaris de tots els hosts"
msgid "Send announcement to all online users"
msgstr "Enviar anunci a tots els usuaris connectats"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anunci a tots els usuaris connectats a tots els hosts"
@@ -88,8 +74,7 @@ msgstr "Configurar el missatge del dia i enviar a tots els usuaris"
#: mod_announce.erl:645
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"
+"Escriure missatge del dia en tots els hosts i envia als usuaris connectats"
#: mod_announce.erl:647
msgid "Update message of the day (don't send)"
@@ -108,629 +93,572 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Configuració"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Base de dades"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Iniciar mòduls"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Parar mòduls"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Guardar còpia de seguretat"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Restaurar"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Exportar a fitxer de text"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importar fitxer"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importar directori"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Reiniciar el Servei"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Apager el Servei"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Afegir usuari"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Eliminar Usuari"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Finalitzar Sesió d'Usuari"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Obtenir Password d'usuari"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Canviar Password d'Usuari"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Obtenir la última connexió d'Usuari"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Obtenir Estadístiques d'Usuari"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Obtenir Número d'Usuaris Registrats"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Obtenir Número d'Usuaris Connectats"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Llista de Control d'Accés"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Regles d'Accés"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Gestió d'Usuaris"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Usuaris conectats"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Tots els usuaris"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Connexions s2s d'eixida"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nodes funcionant"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nodes parats"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Mòduls"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Gestió de còpia de seguretat"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuaris de jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "A ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "De ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Configuració de la base de dades en "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Selecciona el tipus d'almacenament de les taules"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Còpia sols en disc"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Còpia en RAM i disc"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Còpia en RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Còpia remota"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Detindre mòduls en "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Selecciona mòduls a detindre"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Iniciar mòduls en "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Introdueix llista de {mòdul, [opcions]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Llista de mòduls a iniciar"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Desar còpia de seguretat a fitxer en "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Introdueix ruta al fitxer de còpia de seguretat"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Ruta al fitxer"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Restaura còpia de seguretat des del fitxer en "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Exporta còpia de seguretat a fitxer de text en "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Introdueix ruta al fitxer de text"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importa usuari des de fitxer en "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Introdueix ruta al fitxer jabberd14 spool"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importar usuaris des del directori en "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Introdueix la ruta al directori de jabberd14 spools"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Ruta al directori"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
-msgstr "Temps de retard"
+msgstr "Temps de retràs"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Configuració de la Llista de Control d'Accés"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Llistes de Control de Accés"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Configuració d'accesos"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Regles d'accés"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "ID Jabber"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Password"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Verificació del Password"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Número d'Usuaris Registrats"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Número d'usuaris connectats"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Mai"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Connectat"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Últim login"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Tamany de la llista"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Adreça IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Recursos"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administració de "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Acció en l'usuari"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Editar propietats"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Eliminar usuari"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Accés denegat per la política del servei"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Transport a IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "mòdul ejabberd IRC"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registre en mod_irc per a"
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-"Introdueix el nom d'usuari, les codificacions de caràcters, els ports i "
-"contrassenyes per a utilitzar al connectar als servidors de IRC "
+"Introdueix el nom d'usuari i les codificacions de caràcters per a utilitzar "
+"als servidors de IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nom d'usuari al IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"Si vols especificar codificacions de caràcters diferents per a cada servidor "
+"Si vols especificar codificacions de caràcters distints per a cada servidor "
"IRC emplena aquesta llista amb els valors amb el format '{\"servidor irc\", "
-"\"codificació\", port, \"contrassenya\"}'. Aquest servei utilitza per "
-"defecte la codificació \"~s\", port ~p, no contrassenya."
+"\"codificació\"}'. Aquest servei utilitza per defecte la codificació \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Exemple: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Exemple: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Paràmetres de connexió"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Codificacions"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Entra a canal d'IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Canal d'IRC (no posis la primera #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Servidor d'IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Entra al canal d'IRC aquí."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "Configuració d'IRC."
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Nom d'usuari al IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Password ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Codificació pel servidor ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Servidor ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
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:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "La sala de conferències no existeix"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Sales de xat"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"Necessites un client amb suport x:data per a poder registrar el Nickname"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registre del Nickname en "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Introdueix el nickname que vols registrar"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Nickname"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "El nickname ja està registrat per una altra persona"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "El Nickname especificat ja està registrat, busca-te'n un altre"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Deus d'omplir el camp \"Nickname\" al formulari"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "mòdul ejabberd MUC"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Configuració de la sala de xat modificada"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "Entrar a la sala"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "Deixar la sala"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "Has sigut banejat"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "Has sigut expulsat"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
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:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "ara es conegut com"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " ha posat l'assumpte: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Dilluns"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Dimarts"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Dimecres"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Dijous"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Divendres"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Dissabte"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Diumenge"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Gener"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Febrer"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Març"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Abril"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Maig"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Juny"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Juliol"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Agost"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Setembre"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Octubre"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Novembre"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Decembre"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Configuració de la sala"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Nombre d'ocupants"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Títol de la sala"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "El llímit de tràfic ha sigut sobrepassat"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Tipus de missatge incorrecte"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -738,491 +666,478 @@ 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:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
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:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "No està permés enviar missatges privats"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Sols els ocupants poden enviar solicituts a la sala"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr " En aquesta sala no es permeten solicituts als membres de la sala"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privat"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr ""
-"Només els moderadors i participants poden canviar l'assumpte d'aquesta sala"
+"Sols els moderadors i participants poden canviar l'assumpte d'aquesta sala"
-#: mod_muc/mod_muc_room.erl:806
-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:853
+msgid "Only moderators are allowed to change subject in this room"
+msgstr "Sols els moderadors poden canviar l'assumpte d'aquesta sala"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr "El Nickname està siguent utilitzat per una altra persona"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "El Nickname ja està registrat per una altra persona"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Has sigut bloquejat en aquesta sala"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Necessites ser membre d'aquesta sala per a poder entrar"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Aquesta sala no és anònima"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Es necessita password per a entrar en aquesta sala"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "No s'ha pogut generar un captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Password incorrecte"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Es necessita tenir privilegis d'administrador"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Es necessita tenir privilegis de moderador"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "El Jabber ID ~s no és vàlid"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "El Nickname ~s no existeix a la sala"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Afiliació invàlida: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Rol invàlid: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Es requerixen privilegis de propietari de la sala"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Configuració de la sala ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Configuració per a "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Descripció de la sala:"
+msgstr "Descripció:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Crear una sala persistent"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Crear una sala pública"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Crear una llista de participants pública"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Crear una sala amb password"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Número màxim d'ocupants"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Sense Llímit"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Presentar Jabber ID's reals a"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
-msgstr "només moderadors"
+msgstr "sols moderadors"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "qualsevol"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
-msgstr "Crear una sala de \"només membres\""
+msgstr "Crear una sala de \"soles membres\""
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Crear una sala moderada"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
-msgstr "Els usuaris són participants per defecte"
+msgstr "Els usuaris per defecte són els participants"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
-msgstr "Permetre que els usuaris canviin el tema"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
+msgstr "Permetre que els usuaris canvien el tema"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Permetre que els usuaris envien missatges privats"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Permetre que els usuaris fagen peticions a altres usuaris"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Permetre que els usuaris envien invitacions"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Permetre als visitants canviar el Nickname"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Crear una sala protegida per captcha"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Habilitar el registre de la conversa"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Número d'ocupants"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s et convida a la sala ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "el password és"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s's cua de missatges offline"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Enviat"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Data"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "De"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Per a"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paquet"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Eliminar els seleccionats"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Missatges fora de línia:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Eliminar tots els missatges offline"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "mòdul ejabberd SOCKS5 Bytestreams"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publicar-subscriure't"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Mòdul ejannerd Publicar-Subscriure"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
-msgstr "Petició de subscriptor PubSub"
+msgstr "Petició de PubSub subscriure"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Tria si aprova aquesta entitat de subscripció"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID del Node"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Adreça del Subscriptor"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Enviar payloads junt a les notificacions d'events"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Entrega de notificacions d'events"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscriptors quan canvia la configuració del node"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscriptors quan el node és eliminat"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Persistir elements al guardar"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Un nom per al node"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Màxim # d'elements que persistixen"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Permetre subscripcions"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Especificar el model d'accés"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Llista de grups que tenen permés subscriures"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Especificar el model del publicant"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Màxim tamany del payload en bytes"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Quan s'ha enviat l'última publicació"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Sols enviar notificacions als usuaris disponibles"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Les col.leccions amb les que un node està afiliat"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr "Tria nom d'usuari i password per a registrar-te en aquest servidor"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "Els usuaris no tenen permís per a crear comptes tan depresa"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
+msgstr "Els usuarios no tenen permis per a crear comptes tan apresa"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Cap"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Subscripció"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Pendent"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grups"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validar"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Borrar"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Llista de contactes de "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Format erroni"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Afegir Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Llista de contactes"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Grups de contactes compartits"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Afegir nou"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Nom:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Descripció:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Membre:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Mostrar grups:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Grup "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Enviar"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Erlang Jabber"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Aniversari"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Ciutat"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Pais"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Email"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Cognom"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1230,381 +1145,353 @@ msgstr ""
"Emplena el formulari per a buscar usuaris Jabber. Afegix * al final d'un "
"camp per a buscar subcadenes."
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Nom complet"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Segon nom"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nom"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Nom de la organizació"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unitat de la organizació"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Cerca usuaris en "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Usuari"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "Necesites un client amb suport x:data per a poder buscar"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Recerca de vCard d'usuari"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Mòdul ejabberd vCard"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Resultat de la búsqueda"
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "No autoritzat"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Web d'administració del ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administració"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "en format text"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Hosts Virtuals"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Configuració de les Regles d'Accés ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Hosts virtuals del ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Usuaris"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Última activitat d'usuari"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Període: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Últim mes"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Últim any"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Tota l'activitat"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Mostrar Taula Ordinaria"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Mostrar Taula Integral"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Estadístiques"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "No Trobat"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Node no trobat"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Host"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Usuaris registrats"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Missatges offline"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Última activitat"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Usuaris registrats:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Usuaris en línia:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Connexions d'eixida s2s"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Servidors d'eixida de s2s"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Canviar password"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Usuari "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Recursos connectats:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Password:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "No hi ha dades"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nodes"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Estadístiques"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Usuaris"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Última activitat"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(en format text)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "en format text"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Configuració de les Regles d'Accés ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Hosts virtuals del ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Última activitat d'usuari"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Període: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Últim mes"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Últim any"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Tota l'activitat"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Mostrar Taula Ordinaria"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Mostrar Taula Integral"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Node no trobat"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Host"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Usuaris registrats"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Missatges offline"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Usuaris registrats:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Usuaris en línia:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Connexions d'eixida s2s"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Servidors d'eixida de s2s"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Canviar password"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Usuari "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Recursos connectats:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Password:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "No hi ha dades"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Node "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Ports a l'escolta"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Actualitzar"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Reiniciar"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Detindre"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Error de cridada RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Taules de la base de dades en "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Tipus d'emmagatzematge"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elements"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Tamany"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memòria"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Error"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Còpia de seguretat de "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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."
+"Recordar que estes opcions sols 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Guardar una còpia de seguretat binària:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "Acceptar"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Restaurar una còpia de seguretat binària ara mateix."
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Guardar una còpia de seguretat en format de text pla:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
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:1999
-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:2006
-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:2013
-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:2021
-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:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importar dades d'usuaris del directori de spool de jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Ports a la escolta en "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Mòduls en "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Estadístiques de ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Temps en marxa"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Temps de CPU"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transaccions Realitzades:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transaccions Avortades"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transaccions reiniciades"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transaccions registrades"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Actualitzar"
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Pla d'actualització"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Mòduls modificats"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Mòduls actualitzats"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Script d'actualització"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Script d'actualització de baix nivell"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Comprovar script"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protocol"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Mòdul"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opcions"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Eliminar"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Iniciar"
diff --git a/src/msgs/cs.msg b/src/msgs/cs.msg
index 850f6f221..b78f67ecb 100644
--- a/src/msgs/cs.msg
+++ b/src/msgs/cs.msg
@@ -11,11 +11,11 @@
{"Add User","Přidat uživatele"}.
{"Administration","Administrace"}.
{"Administration of ","Administrace "}.
-{"Administrator privileges required","Potřebujete práva administrátora"}.
+{"Administrator privileges required","Jsou potřebná 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 this Jabber ID to subscribe to this pubsub node?","Povolit tomuto JID odebírat tento pubsub uzel?"}.
+{"Allow users to change 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"}.
@@ -24,7 +24,6 @@
{"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í"}.
@@ -32,7 +31,7 @@
{"Backup to File at ","Záloha do souboru na "}.
{"Backup","Zálohovat"}.
{"Bad format","Nesprávný formát"}.
-{"Birthday","Datum narození"}.
+{"Birthday","Datum narození: "}.
{"Change Password","Změnit heslo"}.
{"Change User Password","Změnit heslo uživatele"}.
{"Chatroom configuration modified","Nastavení diskuzní místnosti bylo změněno"}.
@@ -41,14 +40,13 @@
{"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"}.
+{"City","Město: "}.
{"Commands","Příkazy"}.
{"Conference room does not exist","Konferenční místnost neexistuje"}.
+{"Configuration for ","Konfigurace pro "}.
{"Configuration","Konfigurace"}.
-{"Configuration of room ~s","Konfigurace místnosti ~s"}.
{"Connected Resources:","Připojené zdroje:"}.
-{"Connections parameters","Parametry spojení"}.
-{"Country","Země"}.
+{"Country","Země: "}.
{"CPU Time:","Čas procesoru"}.
{"Database","Databáze"}.
{"Database Tables at ","Databázové tabulky na "}.
@@ -68,17 +66,16 @@
{"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"}.
-{"ejabberd IRC module","ejabberd IRC modul"}.
-{"ejabberd MUC module","ejabberd MUC modul"}.
+{"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 virtual hosts","Virtuální hostitelé ejabberd"}.
{"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"}.
+{"Encodings","Kódování"}.
{"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"}.
@@ -86,22 +83,17 @@
{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Vložte jméno uživatele a kódování, které chcete používat při připojení na IRC server"}.
{"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\"}]."}.
-{"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):"}.
-{"Family Name","Příjmení"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Příklad: [{\"irc.freenode.net\",\"utf-8\"}, {\"irc.freenode.net\", \"iso8859-2\"}]."}.
+{"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)"}.
+{"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ář (přidejte znak * na konec, pro vyhledání podřetězce)"}.
{"Friday","Pátek"}.
{"From","Od"}.
{"From ~s","Od ~s"}.
-{"Full Name","Celé jméno"}.
+{"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"}.
@@ -116,13 +108,10 @@
{"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 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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Pokud chcete zadat jiné kódování pro IRC servery, vyplňte seznam s hodnotami ve formátu '{\"irc server\",\"encoding\"}'. Předvolené kódování pro tuto službu je \"~s\"."}.
{"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"}.
@@ -130,24 +119,16 @@
{"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 ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s je neplatné"}.
{"January",". ledna"}.
-{"Join IRC channel","Vstoupit do IRC kanálu"}.
+{"Jabber ID ~s is invalid","JID ~s je neplatné"}.
{"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"}.
@@ -160,8 +141,7 @@
{"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 members-only","Nastavit místnost jen pro členy"}.
{"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"}.
@@ -172,13 +152,12 @@
{"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"}.
+{"Membership required to enter this room","Pro vstup do místnosti musíte být členem"}.
{"Memory","Paměť"}.
{"Message body","Tělo zprávy"}.
-{"Middle Name","Druhé jméno"}.
-{"Moderator privileges required","Potřebujete práva moderátora"}.
+{"Middle Name","Druhé jméno: "}.
+{"Moderator privileges required","Jsou potřebná práva moderátora"}.
{"moderators only","moderátorům"}.
-{"Modified modules","Aktualizované moduly"}.
{"Module","Modul"}.
{"Modules at ","Moduly na "}.
{"Modules","Moduly"}.
@@ -186,8 +165,10 @@
{"Name:","Jméno:"}.
{"Name","Jméno"}.
{"Never","Nikdy"}.
-{"Nickname","Přezdívka"}.
-{"Nickname Registration at ","Registrace přezdívky na "}.
+{"Nickname is already in use by another occupant","Přezdívka je již používána jiným členem"}.
+{"Nickname is registered by another person","Přezdívka je zaregistrována jinou osobou"}.
+{"Nickname","Prezdívka"}.
+{"Nickname Registration at ","Registrace prezdívky na "}.
{"Nickname ~s does not exist in the room","Přezdívka ~s v místnosti neexistuje"}.
{"No body provided for announce message","Zpráva neobsahuje text"}.
{"No Data","Žádná data"}.
@@ -198,7 +179,6 @@
{"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"}.
@@ -207,56 +187,54 @@
{"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"}.
{"Offline Messages","Offline zprávy"}.
{"OK","OK"}.
{"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 occupants are allowed to send messages to the conference","Jen členové mají povolené zasílat zprávy do konference"}.
+{"Only moderators and participants are allowed to change 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 subject in this room","Jen moderátoři mají povoleno měnit téma místnosti"}.
+{"Only occupants are allowed to send messages to the conference","Jen členové mají povolené zasílat sprá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"}.
+{"Only service administrators are allowed to send service messages","Pouze správci služby mají povolené odesílání servisních zpráv"}.
{"Options","Nastavení"}.
-{"Organization Name","Název firmy"}.
-{"Organization Unit","Oddělení"}.
+{"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 required to enter this room","Pro vstup do místnosti musíte zadat heslo"}.
{"Password Verification","Ověření hesla"}.
{"Path to Dir","Cesta k adresáři"}.
{"Path to File","Cesta k souboru"}.
{"Pending","Čekající"}.
-{"Period: ","Čas: "}.
+{"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ě."}.
{"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"}.
{"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)"}.
{"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"}.
{"Registered Users","Registrovaní uživatelé"}.
{"Registered Users:","Registrovaní živatelé:"}.
{"Registration in mod_irc for ","Registrace do mod_irc na "}.
+{"Remark 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ě."}.
{"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"}.
@@ -270,8 +248,6 @@
{"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ů "}.
@@ -289,7 +265,6 @@
{"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"}.
{"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ů"}.
@@ -297,6 +272,8 @@
{"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"}.
+{"Size","Velikost"}.
+{"Specified nickname is already registered","Zadaná přezdívka je již zaregistrována"}.
{"Specify the access model","Uveďte přístupový model"}.
{"Specify the publisher model","Specifikovat model pro publikování"}.
{"~s's Offline Messages Queue","Fronta offline zpráv uživatele ~s"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","Kolekce, se kterými je uzel spřízněn"}.
{"the password is","heslo je"}.
{"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"}.
@@ -338,34 +311,33 @@
{"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í"}.
{"Update ","Aktualizovat "}.
{"Update","Aktualizovat"}.
+{"Updated modules","Aktualizované moduly"}.
{"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:"}.
+{"Uptime:","Čas běhu"}.
{"Use of STARTTLS required","Je vyžadováno STARTTLS."}.
{"User Management","Správa uživatelů"}.
-{"Users are not allowed to register accounts so quickly","Je zakázáno registrovat účty v tak rychlém sledu"}.
+{"Users are not allowed to register accounts so fast","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"}.
+{"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"}.
+{"Visitors are not allowed to send messages to all occupants","Návštevníci nemají povoleno zasílat zprávy všem přihlášeným do konference"}.
{"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 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 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 mod_irc settings","Pro konfiguraci mod_irc potřebujete klienta podporujícího 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 register nickname","K registraci přezdívky potřebujete klienta s podporou x:data"}.
+{"You need an x:data capable client to register nickname","K registraci přezdívky 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 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 messages to ~s are being blocked. To unblock them, visit ~s","Nesmíte posílat zprávy na ~s. Pro povolení navštivte ~s"}.
diff --git a/src/msgs/cs.po b/src/msgs/cs.po
index 2f2aa191d..7f1e857b2 100644
--- a/src/msgs/cs.po
+++ b/src/msgs/cs.po
@@ -8,30 +8,18 @@ msgstr ""
"X-Language: Czech (čeština)\n"
"X-Additional-Translator: Milos Svasek [DuxforD] from openheads.net\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Je vyžadováno STARTTLS."
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Nebyl poskytnut žádný zdroj"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Nahrazeno novým spojením"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Zadejte text, který vidíte"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -48,11 +36,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Skutečně smazat zprávu dne?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Předmět"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Tělo zprávy"
@@ -76,7 +64,7 @@ msgstr "Odeslat oznámení všem uživatelům na všech hostitelích"
msgid "Send announcement to all online users"
msgstr "Odeslat oznámení všem online uživatelům"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
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"
@@ -105,621 +93,565 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Konfigurace"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Databáze"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Spustit moduly"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Zastavit moduly"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Zálohovat"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Obnovit"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Uložit do textového souboru"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Import souboru"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Import adresáře"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Restartovat službu"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Vypnout službu"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Přidat uživatele"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Smazat uživatele"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Ukončit sezení uživatele"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Získat heslo uživatele"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Změnit heslo uživatele"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Získat čas podleního přihlášení uživatele"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Získat statistiky uživatele"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Získat počet registrovaných uživatelů"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Získat počet online uživatelů"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Seznamy přístupových práv (ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Pravidla přístupů"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Správa uživatelů"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Online uživatelé"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Všichni uživatelé"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Odchozí s2s spojení"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Běžící uzly"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Zastavené uzly"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Moduly"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Správa zálohování"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importovat uživatele z jabberd14 spool souborů"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Pro ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Od ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Konfigurace databázových tabulek "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Vyberte typ úložiště pro tabulky"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Jen kopie disku"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Kopie RAM a disku"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Kopie RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Vzdálená kopie"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Zastavit moduly na "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Vyberte moduly, které mají být zastaveny"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Spustit moduly na "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Vložte seznam modulů {Modul, [Parametry]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Seznam modulů, které mají být spuštěné"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Záloha do souboru na "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Zadajte cestu k souboru se zálohou"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Cesta k souboru"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Obnovit zálohu ze souboru na "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Uložit zálohu do textového souboru na "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Zadajte cestu k textovému souboru"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importovat uživatele ze souboru na "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Zadejte cestu k spool souboru jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importovat uživatele z adresáře na "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Zadejte cestu k jabberd14 spool adresáři"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Cesta k adresáři"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Časový posun"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Konfigurace seznamu přístupových práv (ACL)"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Seznamy přístupových práv (ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Konfigurace přístupů"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Pravidla přístupů"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Heslo"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Ověření hesla"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Počet registrovaných uživatelů"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Počet online uživatelů"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nikdy"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Online"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Poslední přihlášení"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Velikost seznamu kontaktů"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP adresy"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Zdroje"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administrace "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Akce aplikovaná na uživatele"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Upravit vlastnosti"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Odstranit uživatele"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Přístup byl zamítnut nastavením služby"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC transport"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
-msgstr "ejabberd IRC modul"
+msgstr "Ejabberd IRC modul"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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"
+msgstr "Pro konfiguraci mod_irc potřebujete klienta podporujícího x:data"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registrace do mod_irc na "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Vložte jméno uživatele a kódování, které chcete používat při připojení na "
+"IRC server"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRC přezdívka"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"ve formátu '{\"irc server\",\"encoding\"}'. Předvolené kódování pro tuto "
+"službu je \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Příklad: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].2\"}]."
+"Příklad: [{\"irc.freenode.net\",\"utf-8\"}, {\"irc.freenode.net\", \"iso8859-"
+"2\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Parametry spojení"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Kódování"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Vstoupit do IRC kanálu"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC kanál (bez počátečního #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC přezdívka"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Vstoupit do tohoto IRC kanálu."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "Nastavení IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRC přezdívka"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Heslo ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Kódování pro server ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Server ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
-msgstr "Pouze správci služby smí odesílat servisní zprávy"
+msgstr "Pouze správci služby mají povolené odesílání servisních zpráv"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Pravidla služby nepovolují vytvořit místnost"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Konferenční místnost neexistuje"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Konference"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
-msgstr "K registraci přezdívky potřebujete klienta s podporou x:data"
+msgstr "K registraci přezdívky potřebujete klienta podporujícího x:data"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
-msgstr "Registrace přezdívky na "
+msgstr "Registrace prezdívky na "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Zadejte přezdívku, kterou chcete zaregistrovat"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
-msgstr "Přezdívka"
+msgstr "Prezdívka"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Přezdívka je zaregistrována jinou osobou"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Zadaná přezdívka je již zaregistrována"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
-msgstr "ejabberd MUC modul"
+msgstr "Ejabberd MUC modul"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Nastavení diskuzní místnosti bylo změněno"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "vstoupil(a) do místnosti"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "opustil(a) místnost"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "byl(a) zablokován(a)"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "byl(a) vyhozen(a) z místnosti"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
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:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "se přejmenoval(a) na"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " změnil(a) téma na: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Pondělí"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Úterý"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Středa"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Čtvrtek"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Pátek"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Sobota"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Neděle"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr ". ledna"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr ". února"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr ". března"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr ". dubna"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr ". května"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr ". června"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr ". července"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr ". srpna"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr ". září"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr ". října"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr ". listopadu"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr ". prosince"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Nastavení místnosti"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Počet účastníků"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Název místnosti"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Byl překročen limit"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Nesprávný typ zprávy"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -727,869 +659,829 @@ msgstr ""
"Tento účastník byl vyhozen, protože odeslal chybovou zprávu jinému "
"účastníkovi"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
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:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
-msgstr "Jen členové mají povolené zasílat zprávy do konference"
+msgstr "Jen členové mají povolené zasílat správy do konference"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
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:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "soukromá, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change 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:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Jen moderátoři mají povoleno měnit téma místnosti"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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"
+msgstr ""
+"Návštevníci nemají povoleno zasílat zprávy všem přihlášeným do konference"
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "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:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Přezdívka je zaregistrována jinou osobou"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Byl jste vyloučen z této místnosti"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Pro vstup do místnosti musíte být členem"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Tato místnost není anonymní"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Pro vstup do místnosti musíte zadat heslo"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Nebylo možné vygenerovat CAPTCHA"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Nesprávné heslo"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
-msgstr "Potřebujete práva administrátora"
+msgstr "Jsou potřebná práva administrátora"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
-msgstr "Potřebujete práva moderátora"
+msgstr "Jsou potřebná práva moderátora"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s je neplatné"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Přezdívka ~s v místnosti neexistuje"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Neplatné přiřazení: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Neplatná role: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Jsou vyžadována práva vlastníka"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Konfigurace místnosti ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Konfigurace pro "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Popis místnosti"
+msgstr "Popis:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Nastavit místnost jako stálou"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Nastavit místnost jako veřejnou"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Nastavit seznam účastníků jako veřejný"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Chránit místnost heslem"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Počet účastníků"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Bez limitu"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Odhalovat skutečná Jabber ID"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "moderátorům"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "každému"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
-msgstr "Zpřístupnit místnost jen členům"
+msgstr "Nastavit místnost jen pro členy"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Nastavit místnost jako moderovanou"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Uživatelé jsou implicitně členy"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Povolit uživatelům měnit téma místnosti"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Povolit uživatelům odesílat soukromé zprávy"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
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:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Povolit uživatelům posílání pozvánek"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
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:2917
-msgid "Make room captcha protected"
-msgstr "Chránit místnost pomocí CAPTCHA"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Zaznamenávat konverzace"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Počet účastníků"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s vás zve do místnosti ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "heslo je"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "Fronta offline zpráv uživatele ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Odeslané"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Čas"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Od"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Pro"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paket"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Smazat vybrané"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
-msgstr "Offline zprávy:"
+msgstr "Offline zprávy"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Odstranit všechny offline zprávy"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams modul"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe modul"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Žádost odběratele PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
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:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID uzlu"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Adresa odběratele"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Doručovat náklad s upozorněním na událost"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Doručovat upozornění na události"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Upozornit odběratele na změnu nastavení uzlu"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Upozornit odběratele na smazání uzlu"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Uložit položky natrvalo do úložiště"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Přívětivé jméno pro uzel"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
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:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Povolit odebírání"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Uveďte přístupový model"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Skupiny kontaktů, které mohou odebírat"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Specifikovat model pro publikování"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Maximální náklad v bajtech"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Kdy odeslat poslední publikovanou položku"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
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:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Kolekce, se kterými je uzel spřízněn"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Je zakázáno registrovat účty v tak rychlém sledu"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Nic"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Přihlášení"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Čekající"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Skupiny"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Ověřit"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Odstranit"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Seznam kontaktů "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Nesprávný formát"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Přidat Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Seznam kontaktů"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Skupiny pro sdílený seznam kontaktů"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Přidat nový"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Jméno:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Popis:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Členové:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Zobrazené skupiny:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Skupina "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Odeslat"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
-msgstr "Datum narození"
+msgstr "Datum narození: "
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
-msgstr "Město"
+msgstr "Město: "
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
-msgstr "Země"
+msgstr "Země: "
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "E-mail"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
-msgstr "Příjmení"
+msgstr "Příjmení: "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
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í uživatele Jabberu vyplňte formulář (přidejte znak * na konec, "
"pro vyhledání podřetězce)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
-msgstr "Celé jméno"
+msgstr "Celé jméno: "
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
-msgstr "Druhé jméno"
+msgstr "Druhé jméno: "
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Jméno"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
-msgstr "Název firmy"
+msgstr "Název firmy: "
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
-msgstr "Oddělení"
+msgstr "Oddělení: "
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Hledat uživatele v "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
-msgstr "Uživatel"
+msgstr "Uživatel: "
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Hledání uživatelů podle vizitek"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard modul"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Výsledky hledání pro "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Nemáte oprávnění"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Webová administrace ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administrace"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Zdroj"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Virtuální hostitelé"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s konfigurace pravidla přístupu"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Virtuální hostitelé ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Uživatelé"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Poslední aktivita uživatele"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Čas: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Poslední měsíc"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Poslední rok"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Všechny aktivity"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Zobrazit běžnou tabulku"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Zobrazit kompletní tabulku"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistiky"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Nenalezeno"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Uzel nenalezen"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Hostitel"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Registrovaní uživatelé"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Offline zprávy"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Poslední aktivita"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Registrovaní živatelé:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Online uživatelé:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Odchozí s2s spojení:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Odchozí s2s servery:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Změnit heslo"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Uživatel "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Připojené zdroje:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Heslo:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Žádná data"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Uzly"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistiky"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Uživatelé"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Poslední aktivita"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Zdroj)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Zdroj"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s konfigurace pravidla přístupu"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Virtuální hostitelé ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Poslední aktivita uživatele"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Čas:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Poslední měsíc"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Poslední rok"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Všechny aktivity"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Zobrazit běžnou tabulku"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Zobrazit kompletní tabulku"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Uzel nenalezen"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Hostitel"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Registrovaní uživatelé"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Offline zprávy"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Registrovaní živatelé:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Online uživatelé:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Odchozí s2s spojení:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Odchozí s2s servery:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Změnit heslo"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Uživatel "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Připojené zdroje:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Heslo:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Žádná data"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Uzel "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Otevřené porty"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Aktualizovat"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Restart"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Stop"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Chyba RPC volání"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Databázové tabulky na "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Typ úložiště"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Položek"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Velikost"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Paměť"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Chyba"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Záloha na "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Uložit binární zálohu:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Okamžitě obnovit binární zálohu:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Uložit zálohu do textového souboru:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Okamžitě obnovit zálohu z textového souboru:"
-#: web/ejabberd_web_admin.erl:1999
-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:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importovat uživatele z jabberd14 spool souborů:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importovat uživatele z jabberd14 spool souborů:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Otevřené porty na "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Moduly na "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistiky ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
-msgstr "Čas běhu:"
+msgstr "Čas běhu"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Čas procesoru"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transakce potvrzena"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transakce zrušena"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transakce restartována"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transakce zaznamenána"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Aktualizovat "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Aktualizovat plán"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr "Aktualizované moduly"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Aktualizované skripty"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Nízkoúrovňový aktualizační skript"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Kontrola skriptu"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protokol"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modul"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Nastavení"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Smazat"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Start"
diff --git a/src/msgs/de.msg b/src/msgs/de.msg
index 17420cb02..f85b405da 100644
--- a/src/msgs/de.msg
+++ b/src/msgs/de.msg
@@ -9,13 +9,13 @@
{"Add Jabber ID","Jabber ID hinzufügen"}.
{"Add New","Neuen hinzufügen"}.
{"Add User","Benutzer hinzufügen"}.
-{"Administration of ","Administration von "}.
+{"Administration of ","Administration der "}.
{"Administration","Verwaltung"}.
{"Administrator privileges required","Administratorenrechte benötigt"}.
{"A friendly name for the node","Ein passender Name für den Knoten"}.
{"All activity","Alle Aktivitäten"}.
-{"Allow this Jabber ID to subscribe to this pubsub node?","Erlauben sie dieser Jabber ID das Abonnement dieses pubsub Knotens?"}.
-{"Allow users to change the subject","Erlaube Benutzern das Thema zu ändern"}.
+{"Allow this Jabber ID to subscribe to this pubsub node?","Erlauben Sie dieser JID das Abonnement dieses pubsub Knotens?"}.
+{"Allow users to change subject","Erlaube Benutzern das Thema zu ändern"}.
{"Allow users to query other users","Erlaube Benutzern 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"}.
@@ -24,7 +24,6 @@
{"All Users","Alle Benutzer"}.
{"Announcements","Ankündigungen"}.
{"anyone","jeder"}.
-{"A password is required to enter this room","Sie brauchen ein Passwort um diesen Raum zu betreten"}.
{"April","April"}.
{"August","August"}.
{"Backup","Datensicherung"}.
@@ -37,17 +36,16 @@
{"Change User Password","Benutzer Passwort ändern"}.
{"Chatroom configuration modified","Chatraum Konfiguration geändert"}.
{"Chatrooms","Chaträume"}.
-{"Choose a username and password to register with this server","Wählen sie zum Registrieren einen Benutzernamen und ein Passwort"}.
+{"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 ob dieses Abonnement bestätigt wird."}.
{"City","Stadt"}.
{"Commands","Befehle"}.
{"Conference room does not exist","Konferenzraum existiert nicht"}.
+{"Configuration for ","Konfiguration für "}.
{"Configuration","Konfiguration"}.
-{"Configuration of room ~s","Konfiguration für Raum ~s"}.
{"Connected Resources:","Verbundene Resourcen"}.
-{"Connections parameters","Verbindungsparameter"}.
{"Country","Land"}.
{"CPU Time:","CPU Zeit:"}.
{"Database","Datenbank"}.
@@ -60,8 +58,8 @@
{"Delete message of the day on all hosts","Lösche Nachricht des Tages auf allen Hosts"}.
{"Delete Selected","Markiertes löschen"}.
{"Delete User","Benutzer löschen"}.
-{"Deliver event notifications","Versende Ereignisbenachrichtigungen"}.
-{"Deliver payloads with event notifications","Versende Nutzlast mit Ereignisbenachrichtigungen"}.
+{"Deliver event notifications","Versende Ereignisbenachrichtigung"}.
+{"Deliver payloads with event notifications","Versende Nutzlast mit Ereignis Benachrichtigung"}.
{"Description:","Beschreibung:"}.
{"Disc only copy","Festplatten Kopie"}.
{"Displayed Groups:","Angezeigte Gruppen:"}.
@@ -75,33 +73,27 @@
{"ejabberd vCard module","ejabberd vCard Modul"}.
{"ejabberd virtual hosts","ejabberd virtuelle Hosts"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
-{"Elements","Elemente"}.
{"Email","E-Mail"}.
{"Enable logging","Log-Funktion aktivieren"}.
-{"Encoding for server ~b","Kodierung für Server ~b"}.
+{"Encodings","Kodierung"}.
{"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 Spitznamen 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, Kodierungen, Ports und Passwörter für die Verbindung zu IRC Servern an"}.
+{"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 Spitznamen 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 username and encodings you wish to use for connecting to IRC servers","Geben Sie Benutzernamen und Kodierung 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\"}]."}.
-{"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:"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Beispiel: [{\"irc.lucky.net\",\"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Nachname"}.
{"February","Februar"}.
{"Fill in fields to search for any matching Jabber User","Felder ausfüllen, 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)"}.
+{"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 ~s","Von ~s"}.
{"From","Von"}.
-{"Full Name","Gesamter Name"}.
+{"Full Name","Ganzer 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"}.
@@ -116,13 +108,10 @@
{"has been kicked","wurde gekickt"}.
{" has set the subject to: "," hat das Thema geändert auf: "}.
{"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.","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ässig benutzt dieser Dienst die \"~s\" Kodierung, den Port ~p und kein Passwort."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Wenn Sie verschiedene Kodierungen für IRC Server angeben, schreiben Sie diese im Format '{\"Irc Server\", \"Kodierung\"}'. Standardmässig benutzt der Dienst die \"~s\" Kodierung"}.
{"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 vom Verzeichnis importieren "}.
{"Import Users From jabberd14 Spool Files","Importiere Benutzer von jabberd14 Spool Dateien"}.
{"Improper message type","Unzulässiger Nachrichtentyp"}.
@@ -130,24 +119,16 @@
{"Invalid affiliation: ~s","Ungültige Mitgliedschaft: ~s"}.
{"Invalid role: ~s","Ungültige Rolle: ~s"}.
{"IP addresses","IP Addresse"}.
-{"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 ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s ist ungültig"}.
{"January","Januar"}.
-{"Join IRC channel","IRC Channel beitreten"}.
+{"Jabber ID ~s is invalid","JID ~s ist ungültig"}.
{"joins the room","kommt in 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 Aktion"}.
@@ -156,37 +137,37 @@
{"Last year","Letztes Jahr"}.
{"leaves the room","verlässt den Raum"}.
{"Listened Ports","Aktive Ports"}.
-{"Listened Ports at ","Aktive Ports bei"}.
+{"Listened Ports at ","aktive Ports "}.
{"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 modieriert machen"}.
{"Make room password protected","Raum passwortgeschützt machen"}.
{"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"}.
+{"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"}.
+{"Membership required to enter this room","Um diesen Raum zu betreten müssen sie Mitglied sein"}.
{"Members:","Mitglieder:"}.
{"Memory","Speicher"}.
{"Message body","Nachrichtentext"}.
{"Middle Name","Zweiter Vorname"}.
{"Moderator privileges required","Moderatorrechte benötigt"}.
{"moderators only","ausschliesslich Moderatoren"}.
-{"Modified modules","Geänderte Module"}.
{"Module","Modul"}.
-{"Modules at ","Module bei "}.
+{"Modules at ","Module auf "}.
{"Modules","Module"}.
{"Monday","Montag"}.
{"Name:","Name:"}.
{"Name","Vorname"}.
{"Never","Nie"}.
-{"Nickname Registration at ","Registrieren des Spitznamens bei"}.
+{"Nickname is already in use by another occupant","Spitzname wird bereits von einem Teilnehmer genutzt"}.
+{"Nickname is registered by another person","Spitzname wurde bereits von jemand anderem registriert"}.
+{"Nickname Registration at ","Registrieren des Spitznamens "}.
{"Nickname ~s does not exist in the room","Spitzname ~s existiert im Raum nicht"}.
{"Nickname","Spitzname"}.
{"No body provided for announce message","Kein Text für die Ankündigung angegeben"}.
@@ -195,10 +176,9 @@
{"Node ","Knoten "}.
{"Node not found","Knoten nicht gefunden"}.
{"Nodes","Knoten"}.
-{"No limit","Keine Begrenzung"}.
+{"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 die Knotenkonfiguration sich ändert"}.
{"Notify subscribers when the node is deleted","Abonnenten benachrichtigen, wenn der Knoten gelöscht wird"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Nur Moderatoren und Teilnehmer dürfen das Thema in diesem Raum ändern"}.
+{"Only moderators are allowed to change subject in this room","Nur Moderatoren dürfen das Thema in diesem Raum ändern"}.
{"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 berechtig Anfragen an die Konferenz zu senden"}.
{"Only service administrators are allowed to send service messages","Nur Service Administratoren sind berechtigt, Servicenachrichten zu senden"}.
@@ -227,9 +207,9 @@
{"Outgoing s2s Servers:","Ausgehende s2s Server:"}.
{"Owner privileges required","Besitzerrechte benötigt"}.
{"Packet","Paket"}.
-{"Password ~b","Passwort ~b"}.
{"Password:","Passwort:"}.
{"Password","Passwort"}.
+{"Password required to enter this room","Sie brauchen ein Passwort um diesen Raum zu betreten"}.
{"Password Verification","Passwort bestätigen"}.
{"Path to Dir","Pfad zum Verzeichnis"}.
{"Path to File","Pfad zur Datei"}.
@@ -237,30 +217,28 @@
{"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 sichert. Wenn sie das ODBC Modul verwenden müssen sie die SQL Datenbank zusätzlich manuell sichern."}.
{"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"}.
{"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 Festplatten Kopie"}.
{"RAM copy","RAM Kopie"}.
+{"(Raw)","(unformatiert)"}.
{"Raw","Unformatiert"}.
{"Really delete message of the day?","Wirklich die Nachricht des Tages löschen?"}.
{"Recipient is not in the conference room","Der Empfänger ist nicht im Raum"}.
{"Registered Users:","Registrierte Benutzer:"}.
{"Registered Users","Registrierte Benutzer"}.
{"Registration in mod_irc for ","Registrierung in mod_irc für "}.
+{"Remark 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 sichert. Wenn sie das ODBC Modul verwenden, müssen sie die SQL Datenbank manuell sichern."}.
{"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"}.
+{"Resources","Resource"}.
{"Restart","Neustart"}.
{"Restart Service","Dienst neustarten"}.
{"Restore Backup from File at ","Datenwiederherstellung aus der Datei "}.
@@ -270,13 +248,11 @@
{"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"}.
+{"Roster size","Kontaktlistengrösse"}.
{"RPC Call Error","RPC Abruf-Fehler"}.
{"Running Nodes","Aktive Knoten"}.
{"~s access rule configuration","~s Zugangsregel Konfiguration"}.
@@ -289,7 +265,6 @@
{"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"}.
{"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"}.
@@ -297,8 +272,10 @@
{"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"}.
-{"Specify the access model","Geben sie das Zugangsmodell an"}.
-{"Specify the publisher model","Geben sie das Publikationsmodell an"}.
+{"Size","Grösse"}.
+{"Specified nickname is already registered","Der angegebene Name ist bereits vergeben"}.
+{"Specify the access model","Geben Sie das Zugangsmodell an"}.
+{"Specify the publisher model","Geben Sie das Publikationsmodell an"}.
{"~s's Offline Messages Queue","~s's Offline Nachrichten Warteschlange"}.
{"Start","Anfang"}.
{"Start Modules at ","Starte Module bei "}.
@@ -318,10 +295,6 @@
{"Subscriber Address","Abonnenten Adresse"}.
{"Subscription","Abonnement"}.
{"Sunday","Sonntag"}.
-{"That nickname is already in use by another occupant","Dieser Spitzname wird bereits von einem Teilnehmer genutzt"}.
-{"That nickname is registered by another person","Dieser Spitzname wurde bereits von jemand anderem registriert"}.
-{"The captcha is valid.","Die Verifizierung ist gültig."}.
-{"The collections with which a node is affiliated","Sammlungen, mit denen ein Knoten verknüpft ist"}.
{"the password is","das Passwort ist"}.
{"This participant is kicked from the room because he sent an error message","Dieser Teilnehmer wurde aus dem Raum gekickt, da er eine Fehlernachricht gesendet hat"}.
{"This participant is kicked from the room because he sent an error message to another participant","Dieser Teilnehmer wurde aus dem Raum gekickt, da er eine Fehlernachricht an einen anderen Teilnehmer gesendet hat"}.
@@ -332,16 +305,15 @@
{"Time","Zeit"}.
{"To ~s","An ~s"}.
{"To","Zu"}.
-{"Traffic rate limit is exceeded","Datenratenlimit wurde überschritten"}.
+{"Traffic rate limit is exceeded","Datenrate ist zu hoch"}.
{"Transactions Aborted:","Vorgänge abgebrochen:"}.
{"Transactions Committed:","Vorgänge durchgeführt:"}.
{"Transactions Logged:","Vorgänge protokolliert:"}.
{"Transactions Restarted:","Vorgänge neu gestartet:"}.
{"Tuesday","Dienstag"}.
-{"Unable to generate a captcha","Konnte Verifizierung nicht erstellen"}.
-{"Unauthorized","Nicht berechtigt"}.
{"Update","Aktualisieren"}.
{"Update ","Aktualisierung "}.
+{"Updated modules","Aktualisierte Module"}.
{"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"}.
@@ -351,11 +323,12 @@
{"User ","Benutzer "}.
{"User","Benutzer"}.
{"User Management","Benutzer Verwaltung"}.
-{"Users are not allowed to register accounts so quickly","Benutzer dürfen Konten nicht so schnell registrieren"}.
+{"Users are not allowed to register accounts so fast","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 Spitznamen nicht ändern"}.
{"Visitors are not allowed to send messages to all occupants","Besucher dürfen nicht an alle Teilnehmer Nachrichten verschicken"}.
{"Wednesday","Mittwoch"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Sie benötigen einen Client, der x:data unterstützt, um Ihren Spitznamen zu registrieren"}.
{"You need an x:data capable client to search","Sie benötigen einen Client, der x:data unterstützt, um suchen zu können"}.
{"Your contact offline message queue is full. The message has been discarded.","Ihre offline Kontakt Warteschlange ist voll. Die Nachricht wurde verworfen."}.
-{"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"}.
diff --git a/src/msgs/de.po b/src/msgs/de.po
index fb1a186f1..6b5dab270 100644
--- a/src/msgs/de.po
+++ b/src/msgs/de.po
@@ -1,10 +1,7 @@
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"
+"Last-Translator: Nikolaus Polak\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -15,31 +12,18 @@ msgstr ""
"X-Additional-Translator: Torsten Werner\n"
"X-Additional-Translator: Marina Hahn\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Verwendung von STARTTLS erforderlich"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Keine Ressource angegeben"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Durch neue Verbindung ersetzt"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Geben sie den Text den sie sehen ein"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -56,11 +40,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Wirklich die Nachricht des Tages löschen?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Thema"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Nachrichtentext"
@@ -84,7 +68,7 @@ msgstr "Sende Ankündigung an alle Benutzer auf allen Hosts"
msgid "Send announcement to all online users"
msgstr "Sende Ankündigung an alle angemeldeten Benutzer"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Sende Ankündigung an alle angemeldeten Benutzer auf allen Hosts"
@@ -115,629 +99,571 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Konfiguration"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Datenbank"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Module starten"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Module stoppen"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Datensicherung"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Wiederherstellung"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Ausgabe in Textdatei"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Datei importieren"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Verzeichnis importieren"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Dienst neustarten"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Dienst herunterfahren"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Benutzer hinzufügen"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Benutzer löschen"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Benutzer Sitzung beenden"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Benutzer Passwort abrufen"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Benutzer Passwort ändern"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "letzte Anmeldezeit abrufen"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Benutzer Statistik abrufen"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Anzahl der registrierten Benutzer abrufen"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Anzahl der angemeldeten Benutzer abrufen"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Zugangskontroll-Listen (ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Zugangsregeln"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Benutzer Verwaltung"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Angemeldete Benutzer"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Alle Benutzer"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Ausgehende s2s Verbindungen"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Aktive Knoten"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Inaktive Knoten"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Module"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Datensicherungsmanagement"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importiere Benutzer von jabberd14 Spool Dateien"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "An ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
-msgstr "Von ~s"
+msgstr "Von ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Datenbank Tabellen Konfiguration bei "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Wähle Speichertyp der Tabellen"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Festplatten Kopie"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "RAM und Festplatten Kopie"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "RAM Kopie"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Fernkopie"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Stoppe Module bei "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Wähle zu stoppende Module"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Starte Module bei "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
-msgstr "Geben sie eine Liste bestehend aus {Modul, [Optionen]} ein"
+msgstr "Geben Sie eine Liste bestehend aus {Modul, [Optionen]} ein"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Liste der zu startenden Module"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Datensicherung in die Datei "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
-msgstr "Geben sie den Pfad zur Datensicherung ein"
+msgstr "Geben Sie den Pfad zur Datensicherung ein"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Pfad zur Datei"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Datenwiederherstellung aus der Datei "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Ausgabe der Sicherung in diese Textdatei "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
-msgstr "Geben sie den Pfad zur Textdatei ein"
+msgstr "Geben Sie den Pfad zur Textdatei ein"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Benutzer aus dieser Datei importieren "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
-msgstr "Geben sie den Pfad zur jabberd14 spool Datei ein"
+msgstr "Geben Sie den Pfad zur jabberd14 spool Datei ein"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Benutzer vom Verzeichnis importieren "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
-msgstr "Geben sie den Pfad zum jabberd14 spool Verzeichnis ein"
+msgstr "Geben Sie den Pfad zum jabberd14 spool Verzeichnis ein"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Pfad zum Verzeichnis"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Zeitverzögerung"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Zugangskontroll-Liste (ACL) Konfiguration"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Zugangskontroll-Listen (ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Zugangskonfiguration"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Zugangsregeln"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Passwort"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Passwort bestätigen"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Anzahl der registrierten Benutzer"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Anzahl der angemeldeten Benutzer"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nie"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Angemeldet"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Letzte Anmeldung"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
-msgstr "Kontaktlistengröße"
+msgstr "Kontaktlistengrösse"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP Addresse"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
-msgstr "Ressourcen"
+msgstr "Resource"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
-msgstr "Administration von "
+msgstr "Administration der "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Aktion auf Benutzer"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Einstellungen ändern"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Benutzer löschen"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Zugang aufgrund der Dienstrichtlinien verweigert"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Transport"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC Modul"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registrierung in mod_irc für "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-"Geben sie Benutzernamen, Kodierungen, Ports und Passwörter für die "
-"Verbindung zu IRC Servern an"
+"Geben Sie Benutzernamen und Kodierung für die Verbindung zum IRC Server an"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRC Benutzername"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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ässig benutzt dieser "
-"Dienst die \"~s\" Kodierung, den Port ~p und kein Passwort."
+"Wenn Sie verschiedene Kodierungen für IRC Server angeben, schreiben Sie "
+"diese im Format '{\"Irc Server\", \"Kodierung\"}'. Standardmässig benutzt "
+"der Dienst die \"~s\" Kodierung"
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Beispiel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta."
-"fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Beispiel: [{\"irc.lucky.net\",\"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Verbindungsparameter"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Kodierung"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "IRC Channel beitreten"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC Channel (ohne dem ersten #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC Server"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Hier den IRC Channel beitreten."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "IRC Einstellungen"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRC Benutzername"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Passwort ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Kodierung für Server ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Server ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Nur Service Administratoren sind berechtigt, Servicenachrichten zu senden"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Anlegen des Raumes aufgrund der Dienstrichtlinien verweigert"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Konferenzraum existiert nicht"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Chaträume"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"Sie benötigen einen Client, der x:data unterstützt, um Ihren Spitznamen zu "
"registrieren"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
-msgstr "Registrieren des Spitznamens bei"
+msgstr "Registrieren des Spitznamens "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
-msgstr "Geben sie den zu registrierenden Spitznamen ein"
+msgstr "Geben Sie den zu registrierenden Spitznamen ein"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Spitzname"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Dieser Spitzname wurde bereits von jemand anderem registriert"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Der angegebene Name ist bereits vergeben"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Sie müssen das Feld \"Spitzname\" ausfüllen"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC Modul"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Chatraum Konfiguration geändert"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "kommt in den Raum"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "verlässt den Raum"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "wurde gebannt"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "wurde gekickt"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "wurde wegen Änderung des Mitgliederstatus gekickt"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "wurde wegen Systemabschaltung gekickt"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "ist nun bekannt als"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " hat das Thema geändert auf: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Montag"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Dienstag"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Mittwoch"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Donnerstag"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Freitag"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Samstag"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Sonntag"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Januar"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Februar"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "März"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "April"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Mai"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Juni"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Juli"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "August"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "September"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Oktober"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "November"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Dezember"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Raum Konfiguration"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Teilnehmer in diesem Raum"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Raumname"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
-msgstr "Datenratenlimit wurde überschritten"
+msgstr "Datenrate ist zu hoch"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Dieser Teilnehmer wurde aus dem Raum gekickt, da er eine Fehlernachricht "
"gesendet hat"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Unzulässiger Nachrichtentyp"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -745,891 +671,834 @@ msgstr ""
"Dieser Teilnehmer wurde aus dem Raum gekickt, da er eine Fehlernachricht an "
"einen anderen Teilnehmer gesendet hat"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Der Empfänger ist nicht im Raum"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Es ist nicht erlaubt private Nachrichten zu senden"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Nur Teilnehmer sind berechtig Anfragen an die Konferenz zu senden"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privat, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
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"
+"Only moderators and participants are allowed to change subject in this room"
+msgstr "Nur Moderatoren und Teilnehmer dürfen das Thema in diesem Raum ändern"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Nur Moderatoren dürfen das Thema in diesem Raum ändern"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Besucher dürfen in diesem Raum ihren Spitznamen nicht ändern"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
-msgstr "Dieser Spitzname wird bereits von einem Teilnehmer genutzt"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "Spitzname wird bereits von einem Teilnehmer genutzt"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Spitzname wurde bereits von jemand anderem registriert"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Sie wurden aus diesem Raum verbannt"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Um diesen Raum zu betreten müssen sie Mitglied sein"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Dieser Raum ist nicht anonym"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Sie brauchen ein Passwort um diesen Raum zu betreten"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Konnte Verifizierung nicht erstellen"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Falsches Passwort"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Administratorenrechte benötigt"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Moderatorrechte benötigt"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s ist ungültig"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Spitzname ~s existiert im Raum nicht"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Ungültige Mitgliedschaft: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Ungültige Rolle: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Besitzerrechte benötigt"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Konfiguration für Raum ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Konfiguration für "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Raum Beschreibung"
+msgstr "Beschreibung:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Raum persistent machen"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Raum öffentlich suchbar machen"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Teilnehmerliste öffentlich machen"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Raum passwortgeschützt machen"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
-msgstr "Maximale Anzahl von Teilnehmern"
+msgstr "maximale Anzahl von Teilnehmern"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
-msgstr "Keine Begrenzung"
+msgstr "keine Begrenzung"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Echte Jabber IDs anzeigen für"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "ausschliesslich Moderatoren"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "jeder"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Raum nur für Mitglieder zugänglich machen"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Raum modieriert machen"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Standardbenutzer als Teilnehmer"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Erlaube Benutzern das Thema zu ändern"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Erlaube Benutzern private Nachrichten zu senden"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Erlaube Benutzern andere Benutzer abzufragen"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Erlaube Benutzern Einladungen zu senden"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr "Erlaube Besuchern einen Text bei Statusänderung zu setzen"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Erlaube Besuchern ihren Spitznamen zu ändern"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Raum mit Verifizierung (Captcha) versehen"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Log-Funktion aktivieren"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Anzahl der Teilnehmer"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s lädt sie in den Raum ~s ein"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "das Passwort ist"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Ihre offline Kontakt Warteschlange ist voll. Die Nachricht wurde verworfen."
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s's Offline Nachrichten Warteschlange"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Gesendet"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Zeit"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Von"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Zu"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paket"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Markiertes löschen"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Offline Nachrichten:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Alle Offline Nachrichten löschen"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams Modul"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe Modul"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "PubSub Abonnenten Anfrage"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Wähle ob dieses Abonnement bestätigt wird."
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Knoten ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Abonnenten Adresse"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
-msgstr "Erlauben sie dieser Jabber ID das Abonnement dieses pubsub Knotens?"
+msgstr "Erlauben Sie dieser Jabber ID das Abonnement dieses pubsub Knotens?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
-msgstr "Versende Nutzlast mit Ereignisbenachrichtigungen"
+msgstr "Versende Nutzlast mit Ereignis Benachrichtigung"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
-msgstr "Versende Ereignisbenachrichtigungen"
+msgstr "Versende Ereignisbenachrichtigung"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Abonnenten benachrichtigen, wenn die Knotenkonfiguration sich ändert"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Abonnenten benachrichtigen, wenn der Knoten gelöscht wird"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Einträge dauerhaft speichern"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Ein passender Name für den Knoten"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Maximale Anzahl dauerhaft zu speichernder Einträge"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Ob Abonnements erlaubt sind"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
-msgstr "Geben sie das Zugangsmodell an"
+msgstr "Geben Sie das Zugangsmodell an"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Kontaktlisten-Gruppen die abonnieren dürfen"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
-msgstr "Geben sie das Publikationsmodell an"
+msgstr "Geben Sie das Publikationsmodell an"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Maximale Nutzlastgrösse in Bytes"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Wann soll das letzte veröffentlichte Objekt gesendet werden"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Benachrichtigungen nur an verfügbare Benutzer schicken"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Sammlungen, mit denen ein Knoten verknüpft ist"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
-msgstr "Wählen sie zum Registrieren einen Benutzernamen und ein Passwort"
+msgstr "Wählen Sie zum Registrieren einen Benutzernamen und ein Passwort"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Benutzer dürfen Konten nicht so schnell registrieren"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Keine"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Abonnement"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "schwebend"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Gruppen"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validieren"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Entfernen"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Kontaktliste von "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Ungültiges Format"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Jabber ID hinzufügen"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Kontaktliste"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Gruppen der gemeinsamen Kontaktliste"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Neuen hinzufügen"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Name:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Beschreibung:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Mitglieder:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Angezeigte Gruppen:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Gruppe "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Senden"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Geburtsdatum"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Stadt"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Land"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "E-Mail"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Nachname"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
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)"
+"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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
-msgstr "Gesamter Name"
+msgstr "Ganzer Name"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Zweiter Vorname"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Vorname"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Firmenname"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Abteilung"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Benutzer suchen in "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Benutzer"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr ""
"Sie benötigen einen Client, der x:data unterstützt, um suchen zu können"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "vCard Benutzer Suche"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard Modul"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Suchergebnisse für "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Felder ausfüllen, um nach passenden Jabber Benutzern zu suchen"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Nicht berechtigt"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Verwaltung"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Unformatiert"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Virtuelle Hosts"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s Zugangsregel Konfiguration"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "ejabberd virtuelle Hosts"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Benutzer"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Letzte Benutzeraktivität"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Zeitraum: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Letzter Monat"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Letztes Jahr"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Alle Aktivitäten"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Normale Tabelle anzeigen"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Vollständige Tabelle anzeigen"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistik"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "nicht gefunden"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Knoten nicht gefunden"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Host"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Registrierte Benutzer"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Offline Nachrichten"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Letzte Aktion"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Registrierte Benutzer:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Angemeldete Benutzer:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Ausgehende s2s Verbindungen:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Ausgehende s2s Server:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Passwort ändern"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Benutzer "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Verbundene Resourcen"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Passwort:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Keine Daten"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Knoten"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistik"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Benutzer"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Letzte Aktion"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(unformatiert)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Unformatiert"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s Zugangsregel Konfiguration"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "ejabberd virtuelle Hosts"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Letzte Benutzeraktivität"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Zeitraum: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Letzter Monat"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Letztes Jahr"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Alle Aktivitäten"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Normale Tabelle anzeigen"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Vollständige Tabelle anzeigen"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Knoten nicht gefunden"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Host"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Registrierte Benutzer"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Offline Nachrichten"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Registrierte Benutzer:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Angemeldete Benutzer:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Ausgehende s2s Verbindungen:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Ausgehende s2s Server:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Passwort ändern"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Benutzer "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Verbundene Resourcen"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Passwort:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Keine Daten"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Knoten "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Aktive Ports"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Aktualisieren"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Neustart"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Stop"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "RPC Abruf-Fehler"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Datenbank Tabellen bei "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Speichertyp"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elemente"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Grösse"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Speicher"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Fehler"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Sicherung von "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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 "
-"sichert. Wenn sie das ODBC Modul verwenden müssen sie die SQL Datenbank "
-"zusätzlich manuell sichern."
+"sichert. Wenn sie das ODBC Modul verwenden, müssen sie die SQL Datenbank "
+"manuell sichern."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Speichere binäre Sicherung:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Stelle binäre Sicherung sofort wieder her:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Speichere Klartext-Sicherung:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Stelle Klartext-Sicherung sofort wieder her:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Benutzerdaten von einer PIEFXIS Datei (XEP-0227) importieren:"
-
-#: web/ejabberd_web_admin.erl:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importiere Benutzer von jabberd14 Spool Datei:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importiere Benutzer von jabberd14 Spool Verzeichnis:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
-msgstr "Aktive Ports bei"
+msgstr "aktive Ports "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
-msgstr "Module bei "
+msgstr "Module auf "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistiken von ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Betriebszeit:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "CPU Zeit:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Vorgänge durchgeführt:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Vorgänge abgebrochen:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Vorgänge neu gestartet:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Vorgänge protokolliert:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Aktualisierung "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Aktualisierungsplan"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Geänderte Module"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Aktualisierte Module"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Aktualisierungsscript"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Low level Aktualisierungsscript"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Script Überprüfung"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protokoll"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modul"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Optionen"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Löschen"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Anfang"
-
-#~ msgid "Encodings"
-#~ msgstr "Kodierung"
-
-#~ msgid "(Raw)"
-#~ msgstr "(unformatiert)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "Virtuelle Hosts"
-
-#~ msgid "Specified nickname is already registered"
-#~ msgstr "Der angegebene Name ist bereits vergeben"
-
-#~ msgid "Size"
-#~ msgstr "Grösse"
diff --git a/src/msgs/ejabberd.pot b/src/msgs/ejabberd.pot
index 5dcce8c19..47c6da98b 100644
--- a/src/msgs/ejabberd.pot
+++ b/src/msgs/ejabberd.pot
@@ -1,36 +1,24 @@
msgid ""
msgstr ""
-"Project-Id-Version: 2.1.0\n"
+"Project-Id-Version: 2.1.0-alpha\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:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr ""
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr ""
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr ""
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr ""
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-
-#: ejabberd_captcha.erl:235
-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 ""
@@ -47,11 +35,11 @@ msgstr ""
msgid "Really delete message of the day?"
msgstr ""
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr ""
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr ""
@@ -75,7 +63,7 @@ msgstr ""
msgid "Send announcement to all online users"
msgstr ""
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr ""
@@ -104,1470 +92,1376 @@ msgid "Delete message of the day on all hosts"
msgstr ""
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr ""
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr ""
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr ""
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr ""
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr ""
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr ""
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr ""
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr ""
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr ""
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr ""
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr ""
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr ""
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr ""
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr ""
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr ""
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr ""
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr ""
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr ""
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr ""
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr ""
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr ""
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr ""
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr ""
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr ""
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr ""
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr ""
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr ""
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr ""
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr ""
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr ""
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr ""
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr ""
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr ""
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr ""
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr ""
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr ""
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr ""
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr ""
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr ""
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr ""
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr ""
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr ""
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr ""
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr ""
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr ""
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr ""
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr ""
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr ""
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr ""
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr ""
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr ""
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr ""
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr ""
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr ""
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr ""
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr ""
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr ""
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr ""
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr ""
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr ""
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr ""
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr ""
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr ""
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr ""
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr ""
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr ""
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr ""
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr ""
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr ""
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr ""
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr ""
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr ""
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr ""
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr ""
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr ""
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr ""
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr ""
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr ""
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr ""
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr ""
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
msgstr ""
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr ""
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr ""
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr ""
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr ""
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr ""
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr ""
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr ""
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr ""
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr ""
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
msgstr ""
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr ""
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr ""
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr ""
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr ""
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr ""
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr ""
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr ""
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr ""
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr ""
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr ""
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr ""
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr ""
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr ""
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr ""
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr ""
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr ""
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr ""
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr ""
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr ""
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr ""
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr ""
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr ""
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr ""
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr ""
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr ""
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr ""
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr ""
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr ""
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr ""
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr ""
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
msgstr ""
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr ""
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr ""
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr ""
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
msgid "Visitors are not allowed to send messages to all occupants"
msgstr ""
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr ""
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr ""
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr ""
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr ""
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2265
-msgid "Jabber ID ~s is invalid"
+#: mod_muc/mod_muc_room.erl:2198
+msgid "JID ~s is invalid"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
msgstr ""
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
msgid "Room description"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2875
-msgid "Present real Jabber IDs to"
+#: mod_muc/mod_muc_room.erl:2733
+msgid "Present real JIDs to"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr ""
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
msgstr ""
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr ""
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr ""
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr ""
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr ""
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr ""
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr ""
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr ""
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr ""
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr ""
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr ""
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr ""
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr ""
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
-msgid "Allow this Jabber ID to subscribe to this pubsub node?"
+#: mod_pubsub/mod_pubsub.erl:1016
+msgid "Allow this JID to subscribe to this pubsub node?"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr ""
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr ""
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr ""
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr ""
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr ""
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr ""
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr ""
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr ""
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr ""
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr ""
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr ""
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr ""
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr ""
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr ""
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr ""
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr ""
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr ""
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr ""
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr ""
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr ""
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr ""
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr ""
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr ""
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr ""
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr ""
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr ""
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr ""
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
msgstr ""
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr ""
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr ""
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
msgstr ""
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr ""
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr ""
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr ""
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr ""
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr ""
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr ""
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr ""
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr ""
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr ""
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
msgstr ""
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr ""
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr ""
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr ""
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr ""
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr ""
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr ""
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr ""
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr ""
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr ""
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr ""
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr ""
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr ""
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr ""
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr ""
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr ""
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr ""
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr ""
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr ""
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr ""
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr ""
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr ""
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr ""
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr ""
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr ""
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr ""
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr ""
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr ""
diff --git a/src/msgs/el.msg b/src/msgs/el.msg
deleted file mode 100644
index fe5a7affd..000000000
--- a/src/msgs/el.msg
+++ /dev/null
@@ -1,371 +0,0 @@
-{"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 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","Γενέθλια"}.
-{"Change Password","Αλλαγή κωδικού"}.
-{"Change User Password","Αλλαγή Κωδικού Πρόσβασης Χρήστη"}.
-{"Chatroom configuration modified","Διαμόρφωση Αίθουσaς σύνεδριασης τροποποιηθηκε"}.
-{"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:","Εμφανίσμενες Ομάδες:"}.
-{"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 module Δημοσίευσης-Εγγραφής"}.
-{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
-{"ejabberd vCard module","ejabberd vCard module"}.
-{"ejabberd virtual hosts","εικονικοί κεντρικοί υπολογιστές ejabberd"}.
-{"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\"}]."}.
-{"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 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 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:","Μέλη:"}.
-{"Memory","Μνήμη"}.
-{"Message body","Περιεχόμενο μηνυμάτως"}.
-{"Middle Name","Πατρώνυμο"}.
-{"Moderator privileges required","Aπαιτούνται προνόμια συντονιστή"}.
-{"moderators only","συντονιστές μόνο"}.
-{"Modified modules","Τροποποιημένα modules"}.
-{"Module","Module"}.
-{"Modules at ","Modules στο "}.
-{"Modules","Modules"}.
-{"Monday","Δευτέρα"}.
-{"Name:","Όνομα:"}.
-{"Name","Όνομα"}.
-{"Never","Ποτέ"}.
-{"Nickname Registration at ","Εγγραφή με Ψευδώνυμο στο "}.
-{"Nickname ~s does not exist in the room","Ψευδώνυμο ~s δεν υπάρχει σε αυτή την αίθουσα"}.
-{"Nickname","Ψευδώνυμο"}.
-{"No body provided for announce message","Δεν προμηθεύτικε περιεχόμενο ανακοινώσης"}.
-{"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","Όλλα Καλά"}.
-{"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 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","Κωδικός Πρόσβασης"}.
-{"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 βάση δεδομένων σας ."}.
-{"Pong","Πονγκ"}.
-{"Port ~b","Θύρα ~b"}.
-{"Port","Θύρα"}.
-{"Present real Jabber IDs to","Παρούσιαση πραγματικών ταυτοτήτων Jabber σε"}.
-{"private, ","ιδιωτικό,"}.
-{"Protocol","Πρωτόκολλο"}.
-{"Publish-Subscribe","Δημοσίευση-Εγγραφή"}.
-{"PubSub subscriber request","Αίτηση συνδρομητή Δημοσίευσης-Εγγραφής"}.
-{"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 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"}.
-{"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"}.
-{"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 collections with which a node is affiliated","Οι συλλογές με την οποία είναι ένας κόμβος συνδέεται"}.
-{"the password is","ο κωδικός πρόσβασης είναι"}.
-{"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","Χρόνος"}.
-{"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","Χορίς Εξουσιοδότηση"}.
-{"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 Management","Διαχείριση χρηστών"}.
-{"Users are not allowed to register accounts so quickly","Οι χρήστες δεν επιτρέπεται να εγγραφούν λογαριασμούς τόσο γρήγορα"}.
-{"Users Last Activity","Τελευταία Δραστηριότητα Χρήστη"}.
-{"Users","Χρήστες"}.
-{"User ","Χρήστης"}.
-{"User","Χρήστης"}.
-{"Validate","Επαληθεύστε"}.
-{"vCard User Search","vCard Αναζήτηση χρηστών"}.
-{"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 have been banned from this room","Σας έχει απαγορευθεί η είσοδος σε αυτή την αίθουσα"}.
-{"You must fill in field \"Nickname\" in the form","Θα πρέπει να συμπληρώσετε το πεδίο \"Ψευδώνυμο\" στη φόρμα"}.
-{"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 register nickname","Χρειάζεστε ένα 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.","Η μνήμη χωρίς σύνδεση μήνυματών είναι πλήρης. Το μήνυμα έχει απορριφθεί."}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","Τα μηνύματά σας πρως ~s είναι αποκλεισμένα. Για αποδεσμεύση, επισκεφθείτε ~s"}.
diff --git a/src/msgs/el.po b/src/msgs/el.po
deleted file mode 100644
index 54015f14a..000000000
--- a/src/msgs/el.po
+++ /dev/null
@@ -1,1632 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: el\n"
-"PO-Revision-Date: 2009-08-12 12:39+0200\n"
-"Last-Translator: James Iakovos Mandelis \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:360 ejabberd_c2s.erl:661
-msgid "Use of STARTTLS required"
-msgstr "Απαιτείται χρήση STARTTLS "
-
-#: ejabberd_c2s.erl:439
-msgid "No resource provided"
-msgstr "Δεν προμηθεύτικε πόρος"
-
-#: ejabberd_c2s.erl:1071
-msgid "Replaced by new connection"
-msgstr "Αντικαταστάθικε από νέα σύνδεση"
-
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Πληκτρολογήστε το κείμενο που βλέπετε"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-"Τα μηνύματά σας πρως ~s είναι αποκλεισμένα. Για αποδεσμεύση, επισκεφθείτε ~s"
-
-#: ejabberd_captcha.erl:235
-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:505
-msgid "Really delete message of the day?"
-msgstr "Πραγματικά να διαγράψετε το μήνυμα της ημέρας;"
-
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
-msgid "Subject"
-msgstr "Θέμα"
-
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
-msgid "Message body"
-msgstr "Περιεχόμενο μηνυμάτως"
-
-#: mod_announce.erl:598
-msgid "No body provided for announce message"
-msgstr "Δεν προμηθεύτικε περιεχόμενο ανακοινώσης"
-
-#: mod_announce.erl:633
-msgid "Announcements"
-msgstr "Ανακοινώσεις"
-
-#: mod_announce.erl:635
-msgid "Send announcement to all users"
-msgstr "Αποστολή ανακοίνωσης σε όλους τους χρήστες"
-
-#: mod_announce.erl:637
-msgid "Send announcement to all users on all hosts"
-msgstr ""
-"Αποστολή ανακοίνωσης σε όλους τους χρήστες σε όλους τους κεντρικούς "
-"υπολογιστές"
-
-#: mod_announce.erl:639
-msgid "Send announcement to all online users"
-msgstr "Αποστολή ανακοίνωσης σε όλους τους συνδεδεμένους χρήστες"
-
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
-msgid "Send announcement to all online users on all hosts"
-msgstr ""
-"Αποστολή ανακοίνωσης σε όλους τους συνδεδεμένους χρήστες σε όλους τους "
-"κεντρικούς υπολογιστές"
-
-#: mod_announce.erl:643
-msgid "Set message of the day and send to online users"
-msgstr "Ορίστε μήνυμα ημέρας και αποστολή στους συνδεδεμένους χρήστες"
-
-#: mod_announce.erl:645
-msgid "Set message of the day on all hosts and send to online users"
-msgstr ""
-"Ορίστε μήνυμα ημέρας και άμεση αποστολή στους συνδεδεμένους χρήστες σε όλους "
-"τους κεντρικούς υπολογιστές"
-
-#: mod_announce.erl:647
-msgid "Update message of the day (don't send)"
-msgstr "Ενημέρωση μηνύματως ημέρας (χωρίς άμεση αποστολή)"
-
-#: mod_announce.erl:649
-msgid "Update message of the day on all hosts (don't send)"
-msgstr ""
-"Ενημέρωση μηνύματως ημέρας σε όλους τους κεντρικούς υπολογιστές (χωρίς άμεση "
-"αποστολή)"
-
-#: mod_announce.erl:651
-msgid "Delete message of the day"
-msgstr "Διαγράψτε το μήνυμα της ημέρας"
-
-#: mod_announce.erl:653
-msgid "Delete message of the day on all hosts"
-msgstr "Διαγράψτε το μήνυμα της ημέρας σε όλους τους κεντρικούς υπολογιστές"
-
-#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
-msgid "Configuration"
-msgstr "Διαμόρφωση"
-
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
-msgid "Database"
-msgstr "Βάση δεδομένων"
-
-#: mod_configure.erl:127 mod_configure.erl:563
-msgid "Start Modules"
-msgstr "Εκκίνηση Modules"
-
-#: mod_configure.erl:129 mod_configure.erl:564
-msgid "Stop Modules"
-msgstr "ΠαύσηModules"
-
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
-msgid "Backup"
-msgstr "Αποθήκευση Αντιγράφου Ασφαλείας"
-
-#: mod_configure.erl:133 mod_configure.erl:573
-msgid "Restore"
-msgstr "Επαναφορά Αντιγράφου Ασφαλείας"
-
-#: mod_configure.erl:135 mod_configure.erl:574
-msgid "Dump to Text File"
-msgstr "Αποθήκευση σε αρχείο κειμένου"
-
-#: mod_configure.erl:137 mod_configure.erl:583
-msgid "Import File"
-msgstr "Εισαγωγή αρχείων"
-
-#: mod_configure.erl:139 mod_configure.erl:584
-msgid "Import Directory"
-msgstr "Εισαγωγή κατάλογου αρχείων"
-
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
-msgid "Restart Service"
-msgstr "Επανεκκίνηση Υπηρεσίας"
-
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
-msgid "Shut Down Service"
-msgstr "Κλείσιμο Υπηρεσίας"
-
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
-msgid "Add User"
-msgstr "Προσθήκη Χρήστη"
-
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
-msgid "Delete User"
-msgstr "Διαγραφή Χρήστη"
-
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
-msgid "End User Session"
-msgstr "Τερματισμός Συνεδρίας Χρήστη"
-
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
-msgid "Get User Password"
-msgstr "Έκθεση Κωδικού Πρόσβασης Χρήστη"
-
-#: mod_configure.erl:153 mod_configure.erl:490
-msgid "Change User Password"
-msgstr "Αλλαγή Κωδικού Πρόσβασης Χρήστη"
-
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
-msgid "Get User Last Login Time"
-msgstr "Έκθεση Τελευταίας Ώρας Σύνδεσης Χρήστη"
-
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
-msgid "Get User Statistics"
-msgstr "Έκθεση Στατιστικών Χρήστη"
-
-#: mod_configure.erl:159 mod_configure.erl:493
-msgid "Get Number of Registered Users"
-msgstr "Έκθεση αριθμού εγγεγραμμένων χρηστών"
-
-#: mod_configure.erl:161 mod_configure.erl:494
-msgid "Get Number of Online Users"
-msgstr "Έκθεση αριθμού συνδεδεμένων χρηστών"
-
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
-msgid "Access Control Lists"
-msgstr "Λίστες Ελέγχου Πρόσβασης"
-
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
-msgid "Access Rules"
-msgstr "Κανόνες Πρόσβασης"
-
-#: mod_configure.erl:281 mod_configure.erl:467
-msgid "User Management"
-msgstr "Διαχείριση χρηστών"
-
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
-msgid "Online Users"
-msgstr "Συνδεμένοι χρήστες"
-
-#: mod_configure.erl:469
-msgid "All Users"
-msgstr "Όλοι οι χρήστες"
-
-#: mod_configure.erl:470
-msgid "Outgoing s2s Connections"
-msgstr "Εξερχόμενες S2S Συνδέσεις"
-
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
-msgid "Running Nodes"
-msgstr "Ενεργοί Κόμβοι"
-
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
-msgid "Stopped Nodes"
-msgstr "Σταματημένοι Κόμβοι"
-
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
-msgid "Modules"
-msgstr "Modules"
-
-#: mod_configure.erl:546
-msgid "Backup Management"
-msgstr "Διαχείριση Αντιγράφου Ασφαλείας"
-
-#: mod_configure.erl:547
-msgid "Import Users From jabberd14 Spool Files"
-msgstr "Εισαγωγή Χρηστών από αρχεία σειράς jabberd14"
-
-#: mod_configure.erl:667
-msgid "To ~s"
-msgstr "Πρώς ~s"
-
-#: mod_configure.erl:685
-msgid "From ~s"
-msgstr "Από ~s"
-
-#: mod_configure.erl:881
-msgid "Database Tables Configuration at "
-msgstr "Διαμόρφωση Πίνακων βάσης δεδομένων στο "
-
-#: mod_configure.erl:886
-msgid "Choose storage type of tables"
-msgstr "Επιλέξτε τύπο αποθήκευσης των πινάκων"
-
-#: mod_configure.erl:894 mod_configure.erl:896
-msgid "Disc only copy"
-msgstr "Αντίγραφο μόνο σε δίσκο"
-
-#: mod_configure.erl:894 mod_configure.erl:896
-msgid "RAM and disc copy"
-msgstr "Αντίγραφο μόνο σε RAM καί δίσκο"
-
-#: mod_configure.erl:894 mod_configure.erl:896
-msgid "RAM copy"
-msgstr "Αντίγραφο σε RAM"
-
-#: mod_configure.erl:894 mod_configure.erl:896
-msgid "Remote copy"
-msgstr "Απομεμακρυσμένο αντίγραφο"
-
-#: mod_configure.erl:918
-msgid "Stop Modules at "
-msgstr "Παύση Modules στο "
-
-#: mod_configure.erl:922
-msgid "Choose modules to stop"
-msgstr "Επιλέξτε modules για να σταματήσουν"
-
-#: mod_configure.erl:937
-msgid "Start Modules at "
-msgstr "Εκκίνηση Modules στο "
-
-#: mod_configure.erl:941
-msgid "Enter list of {Module, [Options]}"
-msgstr "Εισάγετε κατάλογο των (Module, [Επιλογές])"
-
-#: mod_configure.erl:942
-msgid "List of modules to start"
-msgstr "Λίστα των Module για Εκκίνηση"
-
-#: mod_configure.erl:951
-msgid "Backup to File at "
-msgstr "Αποθήκευση Αντιγράφου Ασφαλείας σε Αρχείο στο "
-
-#: mod_configure.erl:955 mod_configure.erl:969
-msgid "Enter path to backup file"
-msgstr "Εισάγετε τοποθεσία αρχείου αντιγράφου ασφαλείας"
-
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
-msgid "Path to File"
-msgstr "Τοποθεσία Αρχείου"
-
-#: mod_configure.erl:965
-msgid "Restore Backup from File at "
-msgstr "Επαναφορά Αντιγράφου Ασφαλείας από αρχείο στο "
-
-#: mod_configure.erl:979
-msgid "Dump Backup to Text File at "
-msgstr "Αποθήκευση Αντιγράφου Ασφαλείας σε αρχείο κειμένου στο "
-
-#: mod_configure.erl:983
-msgid "Enter path to text file"
-msgstr "Εισάγετε Τοποθεσία Αρχείου Κειμένου"
-
-#: mod_configure.erl:993
-msgid "Import User from File at "
-msgstr "Εισαγωγή χρηστών από αρχείο στο "
-
-#: mod_configure.erl:997
-msgid "Enter path to jabberd14 spool file"
-msgstr "Εισάγετε τοποθεσία αρχείου σειράς jabberd14"
-
-#: mod_configure.erl:1007
-msgid "Import Users from Dir at "
-msgstr "Εισαγωγή χρηστών από κατάλογο αρχείων στο "
-
-#: mod_configure.erl:1011
-msgid "Enter path to jabberd14 spool dir"
-msgstr "Εισάγετε κατάλογο αρχείων σειράς jabberd14"
-
-#: mod_configure.erl:1012
-msgid "Path to Dir"
-msgstr "Τοποθεσία κατάλογου αρχείων"
-
-#: mod_configure.erl:1028 mod_configure.erl:1073
-msgid "Time delay"
-msgstr "Χρόνος καθυστέρησης"
-
-#: mod_configure.erl:1111
-msgid "Access Control List Configuration"
-msgstr "Διαχείριση στις Λίστες Ελέγχου Πρόσβασης"
-
-#: mod_configure.erl:1115
-msgid "Access control lists"
-msgstr "Λίστες Ελέγχου Πρόσβασης"
-
-#: mod_configure.erl:1139
-msgid "Access Configuration"
-msgstr "Διαμόρφωση Πρόσβασης"
-
-#: mod_configure.erl:1143
-msgid "Access rules"
-msgstr "Κανόνες Πρόσβασης"
-
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
-msgid "Jabber ID"
-msgstr "Ταυτότητα Jabber"
-
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
-msgid "Password"
-msgstr "Κωδικός Πρόσβασης"
-
-#: mod_configure.erl:1178
-msgid "Password Verification"
-msgstr "Επαλήθευση κωδικού πρόσβασης"
-
-#: mod_configure.erl:1269
-msgid "Number of registered users"
-msgstr "Αριθμός εγγεγραμμένων χρηστών"
-
-#: mod_configure.erl:1283
-msgid "Number of online users"
-msgstr "Αριθμός συνδεδεμένων χρηστών"
-
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
-msgid "Never"
-msgstr "Ποτέ"
-
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
-msgid "Online"
-msgstr "Συνδεδεμένο"
-
-#: mod_configure.erl:1671
-msgid "Last login"
-msgstr "Τελευταία σύνδεση"
-
-#: mod_configure.erl:1692
-msgid "Roster size"
-msgstr "Μέγεθος Καταλόγου Επαφών"
-
-#: mod_configure.erl:1693
-msgid "IP addresses"
-msgstr "Διευθύνσεις IP"
-
-#: mod_configure.erl:1694
-msgid "Resources"
-msgstr "Πόροι"
-
-#: mod_configure.erl:1820
-msgid "Administration of "
-msgstr "Διαχείριση του"
-
-#: mod_configure.erl:1823
-msgid "Action on user"
-msgstr "Eνέργεια για το χρήστη"
-
-#: mod_configure.erl:1827
-msgid "Edit Properties"
-msgstr "Επεξεργασία ιδιοτήτων"
-
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
-msgid "Remove User"
-msgstr "Αφαίρεση χρήστη"
-
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
-msgid "Access denied by service policy"
-msgstr "Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"
-
-#: mod_irc/mod_irc.erl:400
-msgid "IRC Transport"
-msgstr "IRC Διαβιβάσεις"
-
-#: mod_irc/mod_irc.erl:427
-msgid "ejabberd IRC module"
-msgstr "ejabberd IRC module"
-
-#: mod_irc/mod_irc.erl:557
-msgid "You need an x:data capable client to configure mod_irc settings"
-msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε το mod_irc"
-
-#: mod_irc/mod_irc.erl:564
-msgid "Registration in mod_irc for "
-msgstr "Εγγραφή στο mod_irc για "
-
-#: mod_irc/mod_irc.erl:569
-msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
-msgstr ""
-"Εισάγετε το όνομα χρήστη, κωδικοποιήσεις, τις θύρες και τους κωδικούς "
-"πρόσβασης που θέλετε να χρησιμοποιήσετε για σύνδεση με IRC διακομιστή"
-
-#: mod_irc/mod_irc.erl:574
-msgid "IRC Username"
-msgstr "IRC Όνομα χρήστη"
-
-#: mod_irc/mod_irc.erl:584
-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:596
-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:601
-msgid "Connections parameters"
-msgstr "Παράμετροι Συνδέσης"
-
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Είσοδος στο IRC κανάλι"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC κανάλι (μην τεθεί το πρώτο #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Διακομιστής IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Είσοδος στο κανάλι IRC εδώ."
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "Είσοδος στο κανάλι IRC αυτής της Jabber Ταυτότητας: ~s"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "IRC Ρυθμίσεις"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRC όνομα χρήστη"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Κωδικός πρόσβασης ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Θύρα ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Κωδικοποίηση για διακομιστή ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Διακομιστής ~b"
-
-#: mod_muc/mod_muc.erl:437
-msgid "Only service administrators are allowed to send service messages"
-msgstr ""
-"Μόνο οι διαχειριστές των υπηρεσιών επιτρέπεται να στείλουν υπηρεσιακά "
-"μηνύματα"
-
-#: mod_muc/mod_muc.erl:481
-msgid "Room creation is denied by service policy"
-msgstr "Άρνηση δημιουργίας αίθουσας , λόγω τακτικής παροχής υπηρεσιών"
-
-#: mod_muc/mod_muc.erl:488
-msgid "Conference room does not exist"
-msgstr "Αίθουσα σύνεδριασης δεν υπάρχει"
-
-#: mod_muc/mod_muc.erl:569
-msgid "Chatrooms"
-msgstr "Αίθουσες σύνεδριασης"
-
-#: mod_muc/mod_muc.erl:688
-msgid "You need an x:data capable client to register nickname"
-msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για να εγγράφή με ψευδώνυμο"
-
-#: mod_muc/mod_muc.erl:694
-msgid "Nickname Registration at "
-msgstr "Εγγραφή με Ψευδώνυμο στο "
-
-#: mod_muc/mod_muc.erl:698
-msgid "Enter nickname you want to register"
-msgstr "Πληκτρολογήστε το ψευδώνυμο που θέλετε να εγγραφείτε"
-
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
-msgid "Nickname"
-msgstr "Ψευδώνυμο"
-
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Αυτό το ψευδώνυμο είναι καταχωρημένο από άλλο πρόσωπο"
-
-#: mod_muc/mod_muc.erl:764
-msgid "You must fill in field \"Nickname\" in the form"
-msgstr "Θα πρέπει να συμπληρώσετε το πεδίο \"Ψευδώνυμο\" στη φόρμα"
-
-#: mod_muc/mod_muc.erl:784
-msgid "ejabberd MUC module"
-msgstr "ejabberd MUC module"
-
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
-msgid "Chatroom configuration modified"
-msgstr "Διαμόρφωση Αίθουσaς σύνεδριασης τροποποιηθηκε"
-
-#: mod_muc/mod_muc_log.erl:381
-msgid "joins the room"
-msgstr "συνδέετε στην αίθουσα"
-
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
-msgid "leaves the room"
-msgstr "εγκαταλείπει την αίθουσα"
-
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
-msgid "has been banned"
-msgstr "έχει απαγορευθεί"
-
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
-msgid "has been kicked"
-msgstr "αποβλήθηκε "
-
-#: mod_muc/mod_muc_log.erl:402
-msgid "has been kicked because of an affiliation change"
-msgstr "Έχει αποβληθεί λόγω αλλαγής υπαγωγής"
-
-#: mod_muc/mod_muc_log.erl:405
-msgid "has been kicked because the room has been changed to members-only"
-msgstr "αποβλήθηκε επειδή η αίθουσα αλλάξε γιά μέλη μόνο"
-
-#: mod_muc/mod_muc_log.erl:408
-msgid "has been kicked because of a system shutdown"
-msgstr "αποβλήθηκε λόγω τερματισμού συστήματος"
-
-#: mod_muc/mod_muc_log.erl:411
-msgid "is now known as"
-msgstr "είναι τώρα γνωστή ως"
-
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
-msgid " has set the subject to: "
-msgstr " έχει θέσει το θέμα σε: "
-
-#: mod_muc/mod_muc_log.erl:448
-msgid "Monday"
-msgstr "Δευτέρα"
-
-#: mod_muc/mod_muc_log.erl:449
-msgid "Tuesday"
-msgstr "Τρίτη"
-
-#: mod_muc/mod_muc_log.erl:450
-msgid "Wednesday"
-msgstr "Τετάρτη"
-
-#: mod_muc/mod_muc_log.erl:451
-msgid "Thursday"
-msgstr "Πέμπτη"
-
-#: mod_muc/mod_muc_log.erl:452
-msgid "Friday"
-msgstr "Παρασκευή"
-
-#: mod_muc/mod_muc_log.erl:453
-msgid "Saturday"
-msgstr "Σάββατο"
-
-#: mod_muc/mod_muc_log.erl:454
-msgid "Sunday"
-msgstr "Κυριακή"
-
-#: mod_muc/mod_muc_log.erl:458
-msgid "January"
-msgstr "Ιανουάριος"
-
-#: mod_muc/mod_muc_log.erl:459
-msgid "February"
-msgstr "Φεβρουάριος"
-
-#: mod_muc/mod_muc_log.erl:460
-msgid "March"
-msgstr "Μάρτιος"
-
-#: mod_muc/mod_muc_log.erl:461
-msgid "April"
-msgstr "Απρίλιος"
-
-#: mod_muc/mod_muc_log.erl:462
-msgid "May"
-msgstr "Μάιος"
-
-#: mod_muc/mod_muc_log.erl:463
-msgid "June"
-msgstr "Ιούνιος"
-
-#: mod_muc/mod_muc_log.erl:464
-msgid "July"
-msgstr "Ιούλιος"
-
-#: mod_muc/mod_muc_log.erl:465
-msgid "August"
-msgstr "Αύγουστος"
-
-#: mod_muc/mod_muc_log.erl:466
-msgid "September"
-msgstr "Σεπτέμβριος"
-
-#: mod_muc/mod_muc_log.erl:467
-msgid "October"
-msgstr "Οκτώβριος"
-
-#: mod_muc/mod_muc_log.erl:468
-msgid "November"
-msgstr "Νοέμβριος"
-
-#: mod_muc/mod_muc_log.erl:469
-msgid "December"
-msgstr "Δεκέμβριος"
-
-#: mod_muc/mod_muc_log.erl:740
-msgid "Room Configuration"
-msgstr "Διαμόρφωση Αίθουσας σύνεδριασης"
-
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Συμετεχόντες Αίθουσας σύνεδριασης"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
-msgid "Room title"
-msgstr "Τίτλος Αίθουσας "
-
-#: mod_muc/mod_muc_room.erl:167
-msgid "Traffic rate limit is exceeded"
-msgstr "Υπέρφορτωση"
-
-#: mod_muc/mod_muc_room.erl:239
-msgid ""
-"This participant is kicked from the room because he sent an error message"
-msgstr ""
-"Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα "
-"σφάλματος"
-
-#: mod_muc/mod_muc_room.erl:248
-msgid "It is not allowed to send private messages to the conference"
-msgstr "Δεν επιτρέπεται να στείλει προσωπικά μηνύματα για τη διάσκεψη"
-
-#: mod_muc/mod_muc_room.erl:293
-msgid "Improper message type"
-msgstr "Ακατάλληλο είδος μηνύματος"
-
-#: mod_muc/mod_muc_room.erl:403
-msgid ""
-"This participant is kicked from the room because he sent an error message to "
-"another participant"
-msgstr ""
-"Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα "
-"σφάλματος σε άλλον συμμετέχων"
-
-#: mod_muc/mod_muc_room.erl:416
-msgid "It is not allowed to send private messages of type \"groupchat\""
-msgstr "Δεν επιτρέπεται να στείλει προσωπικά μηνύματα του τύπου \"groupchat\""
-
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
-msgid "Recipient is not in the conference room"
-msgstr "Παραλήπτης δεν είναι στην αίθουσα συνεδριάσεων"
-
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
-msgid "Only occupants are allowed to send messages to the conference"
-msgstr "Μόνο οι συμμετέχωντες μπορούν να στέλνουν μηνύματα στο συνέδριο"
-
-#: mod_muc/mod_muc_room.erl:457
-msgid "It is not allowed to send private messages"
-msgstr "Δεν επιτρέπεται η αποστολή προσωπικών μηνυμάτων"
-
-#: mod_muc/mod_muc_room.erl:503
-msgid "Only occupants are allowed to send queries to the conference"
-msgstr "Μόνο οι συμετεχόντες μπορούν να στείλουν ερωτήματα στη διάσκεψη"
-
-#: mod_muc/mod_muc_room.erl:515
-msgid "Queries to the conference members are not allowed in this room"
-msgstr ""
-"Ερωτήματα πρώς τα μέλη της διασκέψεως δεν επιτρέπονται σε αυτήν την αίθουσα"
-
-#: mod_muc/mod_muc_room.erl:601
-msgid "private, "
-msgstr "ιδιωτικό,"
-
-#: mod_muc/mod_muc_room.erl:801
-msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
-msgstr ""
-"Μόνο οι συντονιστές και οι συμμετέχοντες μπορούν να αλλάξουν το θέμα αυτής "
-"της αίθουσας"
-
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
-msgstr "Μόνο οι συντονιστές μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"
-
-#: mod_muc/mod_muc_room.erl:816
-msgid "Visitors are not allowed to send messages to all occupants"
-msgstr ""
-"Οι επισκέπτες δεν επιτρέπεται να στείλουν μηνύματα σε όλους τους "
-"συμμετέχωντες"
-
-#: mod_muc/mod_muc_room.erl:884
-msgid ""
-"This participant is kicked from the room because he sent an error presence"
-msgstr ""
-"Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε σφάλμα "
-"παρουσίας "
-
-#: mod_muc/mod_muc_room.erl:902
-msgid "Visitors are not allowed to change their nicknames in this room"
-msgstr ""
-"Οι επισκέπτες δεν επιτρέπεται να αλλάξουν τα ψευδώνυμα τους σε αυτή την "
-"αίθουσα"
-
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
-msgstr "Αυτό το ψευδώνυμο είναι ήδη σε χρήση από άλλον συμμετέχων"
-
-#: mod_muc/mod_muc_room.erl:1494
-msgid "You have been banned from this room"
-msgstr "Σας έχει απαγορευθεί η είσοδος σε αυτή την αίθουσα"
-
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
-msgstr "Απαιτείται αίτηση συμετοχής για είσοδο σε αυτή την αίθουσα"
-
-#: mod_muc/mod_muc_room.erl:1533
-msgid "This room is not anonymous"
-msgstr "Η αίθουσα αυτή δεν είναι ανώνυμη"
-
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
-msgstr "Απαιτείται κωδικός πρόσβασης για είσοδο σε αυτή την αίθουσα"
-
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Αδήνατο να δημιουργηθεί CAPTCHA"
-
-#: mod_muc/mod_muc_room.erl:1591
-msgid "Incorrect password"
-msgstr "Εσφαλμένος κωδικός πρόσβασης"
-
-#: mod_muc/mod_muc_room.erl:2095
-msgid "Administrator privileges required"
-msgstr "Aπαιτούνται προνόμια διαχειριστή"
-
-#: mod_muc/mod_muc_room.erl:2110
-msgid "Moderator privileges required"
-msgstr "Aπαιτούνται προνόμια συντονιστή"
-
-#: mod_muc/mod_muc_room.erl:2265
-msgid "Jabber ID ~s is invalid"
-msgstr "Η Jabber Ταυτότητα ~s είναι άκυρη"
-
-#: mod_muc/mod_muc_room.erl:2279
-msgid "Nickname ~s does not exist in the room"
-msgstr "Ψευδώνυμο ~s δεν υπάρχει σε αυτή την αίθουσα"
-
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
-msgid "Invalid affiliation: ~s"
-msgstr "Άκυρη υπαγωγή: ~s"
-
-#: mod_muc/mod_muc_room.erl:2362
-msgid "Invalid role: ~s"
-msgstr "Άκυρος ρόλο: ~s"
-
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
-msgid "Owner privileges required"
-msgstr "Aπαιτούνται προνόμια ιδιοκτήτη"
-
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Διαμόρφωση Αίθουσας σύνεδριασης ~s"
-
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
-msgid "Room description"
-msgstr "Περιγραφή Αίθουσας"
-
-#: mod_muc/mod_muc_room.erl:2835
-msgid "Make room persistent"
-msgstr "Κάντε αίθουσα μόνιμη"
-
-#: mod_muc/mod_muc_room.erl:2840
-msgid "Make room public searchable"
-msgstr "Κάντε την δημόσια αναζήτηση δυνατή για αυτή την αίθουσα"
-
-#: mod_muc/mod_muc_room.erl:2843
-msgid "Make participants list public"
-msgstr "Κάντε κοινό τον κατάλογο συμμετεχόντων"
-
-#: mod_muc/mod_muc_room.erl:2846
-msgid "Make room password protected"
-msgstr "Κάντε την αίθουσα προστατεύομενη με κωδικό πρόσβασης"
-
-#: mod_muc/mod_muc_room.erl:2857
-msgid "Maximum Number of Occupants"
-msgstr "Μέγιστος αριθμός συμετεχόντων"
-
-#: mod_muc/mod_muc_room.erl:2864
-msgid "No limit"
-msgstr "Χωρίς όριο"
-
-#: mod_muc/mod_muc_room.erl:2875
-msgid "Present real Jabber IDs to"
-msgstr "Παρούσιαση πραγματικών ταυτοτήτων Jabber σε"
-
-#: mod_muc/mod_muc_room.erl:2883
-msgid "moderators only"
-msgstr "συντονιστές μόνο"
-
-#: mod_muc/mod_muc_room.erl:2885
-msgid "anyone"
-msgstr "οποιοσδήποτε"
-
-#: mod_muc/mod_muc_room.erl:2887
-msgid "Make room members-only"
-msgstr "Κάντε την αίθουσα μόνο για μέλη"
-
-#: mod_muc/mod_muc_room.erl:2890
-msgid "Make room moderated"
-msgstr "Κάντε την αίθουσα εποπτεύονομενη"
-
-#: mod_muc/mod_muc_room.erl:2893
-msgid "Default users as participants"
-msgstr "Προεπιλογη χρήστων ως συμμετέχοντες"
-
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
-msgstr "Επιτρέψετε στους χρήστες να αλλάζουν το θέμα"
-
-#: mod_muc/mod_muc_room.erl:2899
-msgid "Allow users to send private messages"
-msgstr "Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα"
-
-#: mod_muc/mod_muc_room.erl:2902
-msgid "Allow users to query other users"
-msgstr "Επιτρέπστε στους χρήστες να ερωτούν άλλους χρήστες"
-
-#: mod_muc/mod_muc_room.erl:2905
-msgid "Allow users to send invites"
-msgstr "Επιτρέψετε στους χρήστες να αποστέλλουν προσκλήσεις"
-
-#: mod_muc/mod_muc_room.erl:2908
-msgid "Allow visitors to send status text in presence updates"
-msgstr ""
-"Επιτρέψτε στους επισκέπτες να αποστέλλουν κατάσταση στις ενημερώσεις "
-"παρουσίας"
-
-#: mod_muc/mod_muc_room.erl:2911
-msgid "Allow visitors to change nickname"
-msgstr "Επιτρέψετε στους επισκέπτες να αλλάζου ψευδώνυμο"
-
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Κάντε την αίθουσα CAPTCHA προστατεύονομενη"
-
-#: mod_muc/mod_muc_room.erl:2926
-msgid "Enable logging"
-msgstr "Ενεργοποίηση καταγραφής"
-
-#: mod_muc/mod_muc_room.erl:2934
-msgid "You need an x:data capable client to configure room"
-msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε την αίθουσα "
-
-#: mod_muc/mod_muc_room.erl:3248
-msgid "Number of occupants"
-msgstr "Αριθμός συμετεχόντων"
-
-#: mod_muc/mod_muc_room.erl:3367
-msgid "~s invites you to the room ~s"
-msgstr "~s σας προσκαλεί στην αίθουσα ~s"
-
-#: mod_muc/mod_muc_room.erl:3376
-msgid "the password is"
-msgstr "ο κωδικός πρόσβασης είναι"
-
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
-msgid ""
-"Your contact offline message queue is full. The message has been discarded."
-msgstr ""
-"Η μνήμη χωρίς σύνδεση μήνυματών είναι πλήρης. Το μήνυμα έχει απορριφθεί."
-
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
-msgid "~s's Offline Messages Queue"
-msgstr "Η Σειρά Χωρίς Σύνδεση Μηνύματων τού ~s"
-
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
-msgid "Submitted"
-msgstr "Υποβλήθηκε"
-
-#: mod_offline.erl:569
-msgid "Time"
-msgstr "Χρόνος"
-
-#: mod_offline.erl:570
-msgid "From"
-msgstr "Από"
-
-#: mod_offline.erl:571
-msgid "To"
-msgstr "Πρώς"
-
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
-msgid "Packet"
-msgstr "Πακέτο"
-
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
-msgid "Delete Selected"
-msgstr "Διαγραφή επιλεγμένων"
-
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Offline Messages:"
-msgstr "Χωρίς Σύνδεση Μηνύματα:"
-
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-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:1066 mod_pubsub/mod_pubsub_odbc.erl:892
-msgid "Publish-Subscribe"
-msgstr "Δημοσίευση-Εγγραφή"
-
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
-msgid "ejabberd Publish-Subscribe module"
-msgstr "ejabberd module Δημοσίευσης-Εγγραφής"
-
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
-msgid "PubSub subscriber request"
-msgstr "Αίτηση συνδρομητή Δημοσίευσης-Εγγραφής"
-
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
-msgid "Choose whether to approve this entity's subscription."
-msgstr "Επιλέξτε αν θα εγκρίθεί η εγγραφή αυτής της οντότητας."
-
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
-msgid "Node ID"
-msgstr "Ταυτότητα Κόμβου"
-
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
-msgid "Subscriber Address"
-msgstr "Διεύθυνση Συνδρομητή"
-
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
-msgid "Allow this Jabber ID to subscribe to this pubsub node?"
-msgstr ""
-"Επιτρέπετε σε αυτή την Jabber Ταυτότητα να εγγραφεί σε αυτό τον κόμβο "
-"Δημοσίευσης-Εγγραφής;"
-
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
-msgid "Deliver payloads with event notifications"
-msgstr "Κοινοποιήσεις με την παράδοση φορτίων"
-
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
-msgid "Deliver event notifications"
-msgstr "Κοινοποιήσεις παράδοσης"
-
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
-msgid "Notify subscribers when the node configuration changes"
-msgstr "Ειδοποιηση στους συνδρομητές όταν αλλάζει η διαμόρφωση κόμβου"
-
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
-msgid "Notify subscribers when the node is deleted"
-msgstr "Ειδοποιηση στους συνδρομητές όταν ο κόμβος διαγράφεται"
-
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
-msgid "Notify subscribers when items are removed from the node"
-msgstr "Ειδοποιηση στους συνδρομητές όταν αφαίρούντε στοιχεία από τον κόμβο"
-
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
-msgid "Persist items to storage"
-msgstr "Μονιμη αποθήκευση στοιχείων"
-
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
-msgid "A friendly name for the node"
-msgstr "Ένα φιλικό όνομα για τον κόμβο"
-
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
-msgid "Max # of items to persist"
-msgstr "Μέγιστος αριθμός μόνιμων στοιχείων"
-
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
-msgid "Whether to allow subscriptions"
-msgstr "Εάν επιτρέποντε συνδρομές"
-
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
-msgid "Specify the access model"
-msgstr "Καθορίστε το μοντέλο πρόσβασης"
-
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
-msgid "Roster groups allowed to subscribe"
-msgstr "Ομάδες Καταλόγου Επαφών μπορούν να εγγραφούν"
-
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
-msgid "Specify the publisher model"
-msgstr "Καθορίστε το μοντέλο εκδότη"
-
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
-msgid "Max payload size in bytes"
-msgstr "Μέγιστο μέγεθος φορτίου σε bytes"
-
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
-msgid "When to send the last published item"
-msgstr "Πότε να αποσταλθεί το τελευταίο στοιχείο που δημοσιεύθηκε"
-
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
-msgid "Only deliver notifications to available users"
-msgstr "Παράδωση κοινοποιήσεων μόνο σε διαθέσιμους χρήστες"
-
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Οι συλλογές με την οποία είναι ένας κόμβος συνδέεται"
-
-#: mod_register.erl:190
-msgid "Choose a username and password to register with this server"
-msgstr ""
-"Επιλέξτε ένα όνομα χρήστη και κωδικό πρόσβασης για να εγγραφείτε σε αυτό τον "
-"διακομιστή"
-
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "Οι χρήστες δεν επιτρέπεται να εγγραφούν λογαριασμούς τόσο γρήγορα"
-
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
-msgid "None"
-msgstr "Κανένα"
-
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
-msgid "Subscription"
-msgstr "Συνδρομή"
-
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
-msgid "Pending"
-msgstr "Εκκρεμεί"
-
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
-msgid "Groups"
-msgstr "Ομάδες"
-
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
-msgid "Validate"
-msgstr "Επαληθεύστε"
-
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
-msgid "Remove"
-msgstr "Αφαίρεστε"
-
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
-msgid "Roster of "
-msgstr "Καταλόγος Επαφών τού"
-
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
-msgid "Bad format"
-msgstr "Ακατάλληλη μορφή"
-
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
-msgid "Add Jabber ID"
-msgstr "Προσθήκη Jabber Ταυτότητας"
-
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
-msgid "Roster"
-msgstr "Καταλόγος Επαφών"
-
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
-msgid "Shared Roster Groups"
-msgstr "Κοινές Ομάδες Καταλόγων Επαφών"
-
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
-msgid "Add New"
-msgstr "Προσθήκη νέου"
-
-#: mod_shared_roster.erl:847
-msgid "Name:"
-msgstr "Όνομα:"
-
-#: mod_shared_roster.erl:852
-msgid "Description:"
-msgstr "Περιγραφή:"
-
-#: mod_shared_roster.erl:860
-msgid "Members:"
-msgstr "Μέλη:"
-
-#: mod_shared_roster.erl:868
-msgid "Displayed Groups:"
-msgstr "Εμφανίσμενες Ομάδες:"
-
-#: mod_shared_roster.erl:877
-msgid "Group "
-msgstr "Ομάδα"
-
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
-msgid "Submit"
-msgstr "Υποβοβολή"
-
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
-msgid "Erlang Jabber Server"
-msgstr "Erlang Jabber Διακομιστής"
-
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
-msgid "Birthday"
-msgstr "Γενέθλια"
-
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
-msgid "City"
-msgstr "Πόλη"
-
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
-msgid "Country"
-msgstr "Χώρα"
-
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
-msgid "Email"
-msgstr "Email"
-
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
-msgid "Family Name"
-msgstr "Επώνυμο"
-
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
-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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
-msgid "Full Name"
-msgstr "Ονοματεπώνυμο"
-
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
-msgid "Middle Name"
-msgstr "Πατρώνυμο"
-
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
-msgid "Name"
-msgstr "Όνομα"
-
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
-msgid "Organization Name"
-msgstr "Όνομα Οργανισμού"
-
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
-msgid "Organization Unit"
-msgstr "Μονάδα Οργανισμού"
-
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
-msgid "Search users in "
-msgstr "Αναζήτηση χρηστών στο"
-
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
-msgid "User"
-msgstr "Χρήστης"
-
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
-msgid "You need an x:data capable client to search"
-msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για αναζήτηση"
-
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
-msgid "vCard User Search"
-msgstr "vCard Αναζήτηση χρηστών"
-
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
-msgid "ejabberd vCard module"
-msgstr "ejabberd vCard module"
-
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
-msgid "Search Results for "
-msgstr "Αποτελέσματα αναζήτησης για "
-
-#: mod_vcard_ldap.erl:458
-msgid "Fill in fields to search for any matching Jabber User"
-msgstr ""
-"Συμπληρώστε τα πεδία για να αναζητήσετε οποιαδήποτε ταιριάζοντα Jabber χρήστη"
-
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Χορίς Εξουσιοδότηση"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
-msgid "ejabberd Web Admin"
-msgstr "ejabberd Web Admin"
-
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
-msgid "Administration"
-msgstr "Διαχείριση"
-
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Ακατέργαστο"
-
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s διαμόρφωση κανόνα πρόσβασης"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "εικονικοί κεντρικοί υπολογιστές ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Χρήστες"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Τελευταία Δραστηριότητα Χρήστη"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Περίοδος: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Περασμένο μήνα"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Πέρυσι"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Όλες οι δραστηριότητες"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Δείτε Κοινό Πίνακα"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Δείτε Ολοκληρωτικό Πίνακα"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Στατιστικές"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Δεν Βρέθηκε"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Κόμβος δεν βρέθηκε"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Κεντρικός Υπολογιστής"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Εγγεγραμμένοι Χρήστες"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Χωρίς Σύνδεση Μηνύματα"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Τελευταία Δραστηριότητα"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Εγγεγραμμένοι Χρήστες:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Online Χρήστες:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Εξερχόμενες S2S Συνδέσεις:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Εξερχόμενοι S2S διακομιστές:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Αλλαγή κωδικού"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Χρήστης"
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Συνδεδεμένοι Πόροι:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Κωδικός πρόσβασης:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Κανένα στοιχείο"
-
-#: web/ejabberd_web_admin.erl:1833
-msgid "Nodes"
-msgstr "Κόμβοι"
-
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
-msgid "Node "
-msgstr "Κόμβος"
-
-#: web/ejabberd_web_admin.erl:1865
-msgid "Listened Ports"
-msgstr "Παρακολουθούμενες Θύρες"
-
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
-msgid "Update"
-msgstr "Ενημέρωση"
-
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
-msgid "Restart"
-msgstr "Επανεκκίνηση"
-
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
-msgid "Stop"
-msgstr "Σταμάτημα"
-
-#: web/ejabberd_web_admin.erl:1886
-msgid "RPC Call Error"
-msgstr "Σφάλμα RPC Κλήσης"
-
-#: web/ejabberd_web_admin.erl:1927
-msgid "Database Tables at "
-msgstr "Πίνακες βάσης δεδομένων στο "
-
-#: web/ejabberd_web_admin.erl:1934
-msgid "Storage Type"
-msgstr "Τύπος Αποθήκευσης"
-
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Στοιχεία"
-
-#: web/ejabberd_web_admin.erl:1936
-msgid "Memory"
-msgstr "Μνήμη"
-
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Σφάλμα"
-
-#: web/ejabberd_web_admin.erl:1956
-msgid "Backup of "
-msgstr "Αντιγράφο Ασφαλείας του "
-
-#: web/ejabberd_web_admin.erl:1958
-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:1963
-msgid "Store binary backup:"
-msgstr "Αποθηκεύση δυαδικού αντιγράφου ασφαλείας:"
-
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
-msgid "OK"
-msgstr "Όλλα Καλά"
-
-#: web/ejabberd_web_admin.erl:1970
-msgid "Restore binary backup immediately:"
-msgstr "Επαναφορά δυαδικού αντιγράφου ασφαλείας αμέσως:"
-
-#: web/ejabberd_web_admin.erl:1978
-msgid ""
-"Restore binary backup after next ejabberd restart (requires less memory):"
-msgstr ""
-"Επαναφορά δυαδικού αντιγράφου ασφαλείας μετά την επόμενη επανεκκίνηση του "
-"ejabberd (απαιτεί λιγότερη μνήμη):"
-
-#: web/ejabberd_web_admin.erl:1985
-msgid "Store plain text backup:"
-msgstr "Αποθηκεύση αντιγράφου ασφαλείας σε αρχείο κειμένου:"
-
-#: web/ejabberd_web_admin.erl:1992
-msgid "Restore plain text backup immediately:"
-msgstr "Επαναφορά αντιγράφου ασφαλείας από αρχείο κειμένου αμέσως:"
-
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Εισαγωγή δεδομένων χρηστών από ένα αρχείο PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Εξαγωγή δεδομένων όλων των χρηστών του διακομιστή σε PIEFXIS αρχεία (XEP-"
-"0227):"
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Εξαγωγή δεδομένων των χρηστών κεντρικού υπολογιστή σε PIEFXIS αρχεία (XEP-"
-"0227):"
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Εισαγωγή δεδομένων χρήστη από το αρχείο σειράς jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Εισαγωγή δεδομένων χρηστών από κατάλογο αρχείων σειράς jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2054
-msgid "Listened Ports at "
-msgstr "Παρακολουθούμενες Θύρες στο "
-
-#: web/ejabberd_web_admin.erl:2079
-msgid "Modules at "
-msgstr "Modules στο "
-
-#: web/ejabberd_web_admin.erl:2105
-msgid "Statistics of ~p"
-msgstr "Στατιστικές του ~p"
-
-#: web/ejabberd_web_admin.erl:2108
-msgid "Uptime:"
-msgstr "Uptime:"
-
-#: web/ejabberd_web_admin.erl:2111
-msgid "CPU Time:"
-msgstr "Ώρα CPU:"
-
-#: web/ejabberd_web_admin.erl:2117
-msgid "Transactions Committed:"
-msgstr "Παραδοθείς συναλλαγές:"
-
-#: web/ejabberd_web_admin.erl:2120
-msgid "Transactions Aborted:"
-msgstr "Αποτυχημένες συναλλαγές:"
-
-#: web/ejabberd_web_admin.erl:2123
-msgid "Transactions Restarted:"
-msgstr "Επανειλημμένες συναλλαγές:"
-
-#: web/ejabberd_web_admin.erl:2126
-msgid "Transactions Logged:"
-msgstr "Καταγραμμένες συναλλαγές:"
-
-#: web/ejabberd_web_admin.erl:2168
-msgid "Update "
-msgstr "Ενημέρωση"
-
-#: web/ejabberd_web_admin.erl:2176
-msgid "Update plan"
-msgstr "Σχέδιο ενημέρωσης"
-
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Τροποποιημένα modules"
-
-#: web/ejabberd_web_admin.erl:2178
-msgid "Update script"
-msgstr "Προγράμα ενημέρωσης"
-
-#: web/ejabberd_web_admin.erl:2179
-msgid "Low level update script"
-msgstr "Προγράμα ενημέρωσης χαμηλού επίπεδου "
-
-#: web/ejabberd_web_admin.erl:2180
-msgid "Script check"
-msgstr "Script ελέγχου"
-
-#: web/ejabberd_web_admin.erl:2348
-msgid "Port"
-msgstr "Θύρα"
-
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Πρωτόκολλο"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
-msgid "Module"
-msgstr "Module"
-
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
-msgid "Options"
-msgstr "Επιλογές"
-
-#: web/ejabberd_web_admin.erl:2372
-msgid "Delete"
-msgstr "Διαγραφή"
-
-#: web/ejabberd_web_admin.erl:2501
-msgid "Start"
-msgstr "Εκκίνηση"
diff --git a/src/msgs/eo.msg b/src/msgs/eo.msg
index 27c832f16..f4806fd0d 100644
--- a/src/msgs/eo.msg
+++ b/src/msgs/eo.msg
@@ -14,8 +14,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Ĉu permesi ĉi tiun JID aboni al la jena PubAbo-nodo"}.
+{"Allow users to change 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"}.
@@ -24,7 +24,6 @@
{"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"}.
@@ -45,9 +44,8 @@
{"Commands","Ordonoj"}.
{"Conference room does not exist","Babilejo ne ekzistas"}.
{"Configuration","Agordo"}.
-{"Configuration of room ~s","Agordo de babilejo ~s"}.
+{"Configuration for ","Agordo de "}.
{"Connected Resources:","Konektataj risurcoj:"}.
-{"Connections parameters","Konekto-parametroj"}.
{"Country","Lando"}.
{"CPU Time:","CPU-tempo"}.
{"Database","Datumbazo"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard-modulo"}.
{"ejabberd virtual hosts","ejabberd virtual-gastigoj"}.
{"ejabberd Web Admin","ejabberd Teksaĵa Administro"}.
-{"Elements","Eroj"}.
{"Email","Retpoŝto"}.
{"Enable logging","Ŝaltu protokoladon"}.
-{"Encoding for server ~b","Enkodigo por servilo ~b"}.
+{"Encodings","Enkodigoj"}.
{"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"}.
@@ -86,14 +83,9 @@
{"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 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.","Enmetu uzantnomon kaj enkodigoj kiujn vi volas uzi por konektoj al IRC-serviloj. Elektu \"Sekvonto\" por ekhavi pliajn kampojn. Elektu \"Kompletigu\" por savi agordojn."}.
-{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Enmetu uzantnomon kaj enkodigoj 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Ekzemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"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"}.
@@ -116,13 +108,10 @@
{"has been kicked","estas forpelita"}.
{" has set the subject to: "," ŝanĝis la temon al: "}.
{"Host","Gastigo"}.
-{"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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Se vi volas specifi diversajn enkodigojn por IRC-serviloj, kompletigu la jenan liston kun la formo '{\"irc-servilo\", \"enkodigo\"}'. Se ne specifita, ĉi tiu servilo uzas la enkodigo \"~s\""}.
{"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"}.
@@ -130,24 +119,16 @@
{"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 ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s estas nevalida"}.
{"January","Januaro"}.
-{"Join IRC channel","Eniras IRC-babilejon"}.
+{"Jabber ID ~s is invalid","JID ~s estas nevalida"}.
{"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"}.
@@ -160,7 +141,6 @@
{"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 aŭtomata Turingtesto"}.
{"Make room members-only","Farigu babilejon sole por membroj"}.
{"Make room moderated","Farigu babilejon moderigata"}.
{"Make room password protected","Farigu babilejon protektata per pasvorto"}.
@@ -171,14 +151,13 @@
{"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"}.
+{"Membership required to enter this room","Membreco estas bezonata por eniri ĉi tiun babilejon"}.
{"Members:","Membroj:"}.
{"Memory","Memoro"}.
{"Message body","Teksto de mesaĝo"}.
{"Middle Name","Meza Nomo"}.
{"Moderator privileges required","Moderantaj rajtoj bezonata"}.
{"moderators only","moderantoj sole"}.
-{"Modified modules","Ĝisdatigitaj moduloj"}.
{"Module","Modulo"}.
{"Modules at ","Moduloj je "}.
{"Modules","Moduloj"}.
@@ -186,6 +165,8 @@
{"Name:","Nomo:"}.
{"Name","Nomo"}.
{"Never","Neniam"}.
+{"Nickname is already in use by another occupant","Kaŝnomo estas jam uzata de alia partoprenanto"}.
+{"Nickname is registered by another person","Kaŝnomo estas registrita de alia persono"}.
{"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"}.
@@ -198,7 +179,6 @@
{"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"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Nur moderigantoj kaj partoprenantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
+{"Only moderators are allowed to change subject in this room","Nur moderigantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
{"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"}.
@@ -227,9 +207,9 @@
{"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 required to enter this room","Pasvorto estas bezonata por eniri ĉi tiun babilejon"}.
{"Password Verification","Pasvortkontrolo"}.
{"Path to Dir","Vojo al dosierujo"}.
{"Path to File","Voje de dosiero"}.
@@ -237,26 +217,24 @@
{"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."}.
{"Pong","Resondaĵo"}.
-{"Port ~b","Pordo ~b"}.
{"Port","Pordo"}.
-{"Present real Jabber IDs to","Montru verajn Jabber ID-ojn al"}.
+{"Present real Jabber IDs to","Montru verajn JID-ojn al"}.
{"private, ","privata, "}.
-{"Protocol","Protokolo"}.
{"Publish-Subscribe","Public-Abonado"}.
{"PubSub subscriber request","PubAbo abonpeto"}.
{"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)"}.
{"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 "}.
{"Registered Users:","Registritaj uzantoj:"}.
{"Registered Users","Registritaj uzantoj"}.
{"Registration in mod_irc for ","Registraĵo en mod_irc de "}.
+{"Remark 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."}.
{"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"}.
@@ -270,8 +248,6 @@
{"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"}.
@@ -289,7 +265,6 @@
{"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"}.
{"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"}.
@@ -297,6 +272,8 @@
{"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"}.
+{"Size","Grando"}.
+{"Specified nickname is already registered","Donita kaŝnomo jam estas registrita"}.
{"Specify the access model","Specifu atingo-modelon"}.
{"Specify the publisher model","Enmetu publikadan modelon"}.
{"~s's Offline Messages Queue","Mesaĝo-atendovico de ~s"}.
@@ -318,10 +295,6 @@
{"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 aŭtomata Turingtesto estas ĝusta"}.
-{"The collections with which a node is affiliated","Aro kun kiu nodo estas filigita"}.
{"the password is","la pasvorto estas"}.
{"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"}.
@@ -338,8 +311,7 @@
{"Transactions Logged:","Transakcioj protokolitaj"}.
{"Transactions Restarted:","Transakcioj restartitaj"}.
{"Tuesday","Mardo"}.
-{"Unable to generate a captcha","Ne eblis krei aŭtomatas turingteston"}.
-{"Unauthorized","Nepermesita"}.
+{"Updated modules","Ĝisdatigitaj moduloj"}.
{"Update ","Ĝisdatigu "}.
{"Update","Ĝisdatigu"}.
{"Update message of the day (don't send)","Ŝanĝu mesaĝon de la tago (ne sendu)"}.
@@ -349,13 +321,14 @@
{"Uptime:","Daŭro de funkciado"}.
{"Use of STARTTLS required","Uzo de STARTTLS bezonata"}.
{"User Management","Uzanto-administrado"}.
-{"Users are not allowed to register accounts so quickly","Ne estas permesata al uzantoj registri tiel rapide"}.
+{"Users are not allowed to register accounts so fast","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"}.
{"Wednesday","Merkredo"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Vi bezonas klienton kun x:data-funkcio por registri kaŝnomon"}.
{"You need an x:data capable client to search","Vi bezonas klienton kun x:data-funkcio por serĉado"}.
{"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 messages to ~s are being blocked. To unblock them, visit ~s","Viaj mesaĝoj al ~s estas blokata. Por malbloki ilin, iru al ~s"}.
diff --git a/src/msgs/eo.po b/src/msgs/eo.po
index b8c8e4efb..9d4bf5b06 100644
--- a/src/msgs/eo.po
+++ b/src/msgs/eo.po
@@ -1,39 +1,24 @@
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"
+"Last-Translator: Andreas van Cranenburgh\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:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Uzo de STARTTLS bezonata"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Neniu risurco donita"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Anstataŭigita je nova konekto"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Enmetu montrita teksto"
-
-#: ejabberd_captcha.erl:97
-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:235
-msgid "The captcha is valid."
-msgstr "La aŭtomata Turingtesto estas ĝusta"
-
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Ordonoj"
@@ -50,11 +35,11 @@ msgstr "Resondaĵo"
msgid "Really delete message of the day?"
msgstr "Ĉu vere forigi mesaĝon de la tago?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Temo"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Teksto de mesaĝo"
@@ -78,7 +63,7 @@ msgstr "Sendu anoncon al ĉiu uzanto de ĉiu gastigo"
msgid "Send announcement to all online users"
msgstr "Sendu anoncon al ĉiu konektata uzanto"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Sendu anoncon al ĉiu konektata uzanto de ĉiu gastigo"
@@ -108,624 +93,567 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Agordo"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Datumbazo"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Startu Modulojn"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Haltigu Modulojn"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Faru Sekurkopion"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Restaŭru"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Skribu en plata tekst-dosiero"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importu dosieron"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importu dosierujo"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Restartu Servon"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Haltigu Servon"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Aldonu Uzanton"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Forigu Uzanton"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Haltigu Uzant-seancon"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Montru pasvorton de uzanto"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Ŝanĝu pasvorton de uzanto"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Montru tempon de lasta ensaluto"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Montru statistikojn de uzanto"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Montru nombron de registritaj uzantoj"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Montru nombron de konektataj uzantoj"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Atingokontrol-listoj"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Atingo-reguloj"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Uzanto-administrado"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Konektataj Uzantoj"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Ĉiuj Uzantoj"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Elirantaj s-al-s-konektoj"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Funkciantaj Nodoj"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Neaktivaj Nodoj"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Moduloj"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Mastrumado de sekurkopioj"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importu uzantojn de jabberd14-uzantdosieroj"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Al ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "De ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Agordo de datumbaz-tabeloj je "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Elektu konserv-tipon de tabeloj"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Nur disk-kopio"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "RAM- kaj disk-kopio"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "RAM-kopio"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Fora kopio"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Haltigu modulojn je "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Elektu modulojn por fini"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Startu modulojn je "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Enmetu liston de {Modulo, [Elektebloj]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Listo de moduloj por starti"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Faru sekurkopion je "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Enmetu vojon por sekurkopio"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Voje de dosiero"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Restaŭrigu de dosiero el "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Skribu sekurkopion en plata teksto al "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Enmetu vojon al plata teksto"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importu uzanton de dosiero el "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Enmetu vojon al jabberd14-uzantdosiero"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importu uzantojn de dosierujo ĉe "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Enmetu vojon al jabberd14-uzantdosierujo"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Vojo al dosierujo"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Prokrasto"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Agordo de atingokontrolo"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Atingokontrol-listoj"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Agordo de atingo"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Atingo-reguloj"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Pasvorto"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Pasvortkontrolo"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Nombro de registritaj uzantoj"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Nombro de konektataj uzantoj"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Neniam"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Konektata"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Lasta ensaluto"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Kontaktlist-grando"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP-adresoj"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Risurcoj"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Mastrumado de "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Ago je uzanto"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Redaktu atributojn"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Forigu uzanton"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Atingo rifuzita de serv-politiko"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC-transportilo"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC-modulo"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registraĵo en mod_irc de "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Enmetu uzantnomon kaj enkodigoj kiujn vi volas uzi por konektoj al IRC-"
+"serviloj"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRC-kaŝnomo"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"Se vi volas specifi diversajn enkodigojn por IRC-serviloj, kompletigu la "
+"jenan liston kun la formo '{\"irc-servilo\", \"enkodigo\"}'. Se ne "
+"specifita, ĉi tiu servilo uzas la enkodigo \"~s\""
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Ekzemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"sekreto\"}, {\"vendetta."
-"fef.net\", \"iso8859-1\", 7000}, {\"irc.iutestservilo.net\", \"utf-8\"}]."
+"Ekzemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-"
+"1\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Konekto-parametroj"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Enkodigoj"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Eniras IRC-babilejon"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC-babilejo (ne aldonu #-prefikson)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC-servilo"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Eniru IRC-babilejon jen"
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "Eniru IRC-babilejon en ĉi Jabber-ID: ~s"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "IRC agordoj"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRC-uzantnomo"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Pasvorto ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Pordo ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Enkodigo por servilo ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Servilo ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "Nur servo-administrantoj rajtas sendi serv-mesaĝojn"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Ĉi tiu serv-politiko ne permesas babilejo-kreadon"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Babilejo ne ekzistas"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Babilejoj"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr "Vi bezonas klienton kun x:data-funkcio por registri kaŝnomon"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Kaŝnomo-registrado je "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Enmetu kaŝnomon kiun vi volas registri"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Kaŝnomo"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Kaŝnomo estas registrita de alia persono"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Donita kaŝnomo jam estas registrita"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Vi devas kompletigi la \"Kaŝnomo\" kampon"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC-modulo"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Agordo de babilejo ŝanĝita"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "eniras la babilejo"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "eliras la babilejo"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "estas forbarita"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "estas forpelita"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "estas forpelita pro aparteneca ŝanĝo"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "estas forpelita pro sistem-haltigo"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "nun nomiĝas"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " ŝanĝis la temon al: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Lundo"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Mardo"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Merkredo"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Ĵaŭdo"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Vendredo"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Sabato"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Dimanĉo"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Januaro"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Februaro"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Marĉo"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Aprilo"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Majo"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Junio"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Julio"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Aŭgusto"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Septembro"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Oktobro"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Novembro"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Decembro"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Babilejo-agordo"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Nombro de ĉeestantoj"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Babilejo-nomo"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Trafikrapida limigo superita"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Malĝusta mesaĝo-tipo"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -733,491 +661,478 @@ msgstr ""
"Ĉi tiu partoprenanto estas forpelata de la babilejo pro sendo de erar-mesaĝo "
"al alia partoprenanto"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Ricevanto ne ĉeestas en la babilejo "
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Ne estas permesata sendi privatajn mesaĝojn"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privata, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr ""
"Nur moderigantoj kaj partoprenantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Nur moderigantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-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:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "Kaŝnomo estas jam uzata de alia partoprenanto"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Kaŝnomo estas registrita de alia persono"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Vi estas malpermesata en ĉi tiu babilejo"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Membreco estas bezonata por eniri ĉi tiun babilejon"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Ĉi tiu babilejo ne estas anonima"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Pasvorto estas bezonata por eniri ĉi tiun babilejon"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Ne eblis krei aŭtomatas turingteston"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Nekorekta pasvorto"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Administrantaj rajtoj bezonata"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Moderantaj rajtoj bezonata"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s estas nevalida"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Kaŝnomo ~s ne ekzistas en la babilejo"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Nevalida aparteneco: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Nevalida rolo: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Mastraj rajtoj bezonata"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Agordo de babilejo ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Agordo de "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Babilejo-priskribo"
+msgstr "Priskribo:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Farigu babilejon daŭra"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Farigu babilejon publike trovebla"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Farigu partoprento-liston publika"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Farigu babilejon protektata per pasvorto"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Limigo de nombro de partoprenantoj"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Neniu limigo"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Montru verajn Jabber ID-ojn al"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "moderantoj sole"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "iu ajn"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Farigu babilejon sole por membroj"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Farigu babilejon moderigata"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Kutime farigu uzantojn kiel partpoprenantoj"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Permesu uzantojn ŝanĝi la temon"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Permesu uzantojn sendi privatajn mesaĝojn"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Permesu uzantojn informpeti aliajn uzantojn"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Permesu uzantojn sendi invitojn"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Permesu al vizitantoj ŝanĝi siajn kaŝnomojn"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Farigu babilejon protektata per aŭtomata Turingtesto"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Ŝaltu protokoladon"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Nombro de ĉeestantoj"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s invitas vin al la babilejo ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "la pasvorto estas"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "Mesaĝo-atendovico de ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Sendita"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Tempo"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "De"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Ĝis"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Pakaĵo"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Forigu elektata(j)n"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Liverontaj mesaĝoj"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Forigu ĉiujn liverontajn mesaĝojn"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bajtfluo modulo"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Public-Abonado"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Public-Abonada modulo"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "PubAbo abonpeto"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Elektu ĉu permesi la abonon de ĉi tiu ento"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Nodo ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Abonanta adreso"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Liveru aĵojn de event-sciigoj"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Liveru event-sciigojn"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Sciigu abonantoj kiam la agordo de la nodo ŝanĝas"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Sciigu abonantoj kiam la nodo estas forigita"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Savu erojn en konservado"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Kromnomo por ĉi tiu nodo"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Maksimuma kiomo de eroj en konservado"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Ĉu permesi aboni"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Specifu atingo-modelon"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Kontaktlist-grupoj kiuj rajtas aboni"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Enmetu publikadan modelon"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Maksimuma aĵo-grando je bajtoj"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Kiam sendi la laste publicitan eron"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Nur liveru sciigojn al konektataj uzantoj"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Aro kun kiu nodo estas filigita"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Ne estas permesata al uzantoj registri tiel rapide"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Nenio"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Abono"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Atendanta"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grupoj"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validigu"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Forigu"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Kontaktlisto de "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Malĝusta formo"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Aldonu Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Kontaktlisto"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Komuna Kontaktlist-grupo"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Aldonu novan"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Nomo:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Priskribo:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Membroj:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Montrataj grupoj:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Grupo "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Sendu"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang-a Jabber-Servilo"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Naskiĝtago"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Urbo"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Lando"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Retpoŝto"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Lasta Nomo"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1225,397 +1140,354 @@ msgstr ""
"Kompletigu la formon por serĉi rekonata Jabber-uzanto (Aldonu * je la fino "
"de la kampo por rekoni subĉenon"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Plena Nomo"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Meza Nomo"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nomo"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Organiz-nomo"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Organiz-parto"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Serĉu uzantojn en "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Uzanto"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "Vi bezonas klienton kun x:data-funkcio por serĉado"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Serĉado de vizitkartoj"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard-modulo"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Serĉ-rezultoj de "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Nepermesita"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Teksaĵa Administro"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administro"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Kruda"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Virtual-gastigoj"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Agordo de atingo-reguloj de ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "ejabberd virtual-gastigoj"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Uzantoj"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Lasta aktiveco de uzanto"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Periodo: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Lasta monato"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Lasta jaro"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Ĉiu aktiveco"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Montru ordinaran tabelon"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Montru integran tabelon"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistikoj"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Ne trovita"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Nodo ne trovita"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Gastigo"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Registritaj uzantoj"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Liverontaj mesaĝoj"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Lasta aktiveco"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Registritaj uzantoj:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Konektataj uzantoj:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Elirantaj s-al-s-konektoj:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Elirantaj s-al-s-serviloj"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Ŝanĝu pasvorton"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Uzanto "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Konektataj risurcoj:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Pasvorto:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Neniu datumo"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nodoj"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistikoj"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Uzantoj"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Lasta aktiveco"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Kruda)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Kruda"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Agordo de atingo-reguloj de ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "ejabberd virtual-gastigoj"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Lasta aktiveco de uzanto"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Periodo: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Lasta monato"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Lasta jaro"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Ĉiu aktiveco"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Montru ordinaran tabelon"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Montru integran tabelon"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Nodo ne trovita"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Gastigo"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Registritaj uzantoj"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Liverontaj mesaĝoj"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Registritaj uzantoj:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Konektataj uzantoj:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Elirantaj s-al-s-konektoj:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Elirantaj s-al-s-serviloj"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Ŝanĝu pasvorton"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Uzanto "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Konektataj risurcoj:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Pasvorto:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Neniu datumo"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nodo "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Atentataj pordoj"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Ĝisdatigu"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Restartu"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Haltigu"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Eraro de RPC-alvoko"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Datumbaz-tabeloj je "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Konserv-tipo"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Eroj"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Grando"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memoro"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Eraro"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Sekurkopio de "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Konservu duuman sekurkopion:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "Bone"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Restaŭrigu duuman sekurkopion tuj:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Skribu sekurkopion en plata tekstdosiero"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Restaŭrigu sekurkopion el plata tekstdosiero tuj"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Importu uzanto-datumojn de PIEFXIS dosiero (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importu uzantojn de jabberd14-uzantdosieroj"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importu uzantojn de jabberd14-uzantdosieroj"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Atentataj pordoj je "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Moduloj je "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistikoj de ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Daŭro de funkciado"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "CPU-tempo"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transakcioj enmetitaj"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transakcioj nuligitaj"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transakcioj restartitaj"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transakcioj protokolitaj"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Ĝisdatigu "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Ĝisdatigo-plano"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr "Ĝisdatigitaj moduloj"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Ĝisdatigo-skripto"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Bazanivela ĝisdatigo-skripto"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Skript-kontrolo"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Pordo"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protokolo"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modulo"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Elektebloj"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Forigu"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Startu"
-#~ msgid "Encodings"
-#~ msgstr "Enkodigoj"
-
-#~ msgid "(Raw)"
-#~ msgstr "(Kruda)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "Virtual-gastigoj"
-
-#~ 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\""
diff --git a/src/msgs/es.msg b/src/msgs/es.msg
index f3504b489..97cbcf35c 100644
--- a/src/msgs/es.msg
+++ b/src/msgs/es.msg
@@ -15,7 +15,7 @@
{"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 JabberID que se subscriba a este nodo PubSub?"}.
-{"Allow users to change the subject","Permitir a los usuarios cambiar el asunto"}.
+{"Allow users to change 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"}.
@@ -24,7 +24,6 @@
{"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"}.
@@ -45,9 +44,8 @@
{"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"}.
+{"Configuration for ","Configuración para "}.
{"Connected Resources:","Recursos conectados:"}.
-{"Connections parameters","Parámetros de conexiones"}.
{"Country","País"}.
{"CPU Time:","Tiempo consumido de CPU:"}.
{"Database","Base de datos"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
{"ejabberd virtual hosts","Dominios de 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"}.
+{"Encodings","Codificaciones"}.
{"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"}.
@@ -86,14 +83,9 @@
{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Introduce el nombre de usuario y codificaciones de carácteres 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Ejemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Apellido"}.
{"February","febrero"}.
{"Fill in fields to search for any matching Jabber User","Rellena campos para buscar usuarios Jabber que concuerden"}.
@@ -116,13 +108,10 @@
{"has been kicked","ha sido expulsado"}.
{" has set the subject to: "," ha puesto el asunto: "}.
{"Host","Dominio"}.
-{"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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Si quieres especificar codificaciones de carácteres distintos para cada servidor IRC rellena esta lista con valores en el formato '{\"servidor irc\", \"codificación\"}'. Este servicio usa por defecto la codificación \"~s\"."}.
{"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"}.
@@ -130,24 +119,16 @@
{"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 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"}.
+{"Jabber ID ~s is invalid","El JID ~s no es válido"}.
{"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"}.
@@ -160,7 +141,6 @@
{"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"}.
@@ -171,14 +151,13 @@
{"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"}.
+{"Membership required to enter this room","Necesitas ser miembro de esta sala para poder entrar"}.
{"Members:","Miembros:"}.
{"Memory","Memoria"}.
{"Message body","Cuerpo del mensaje"}.
{"Middle Name","Segundo nombre"}.
{"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"}.
@@ -187,6 +166,8 @@
{"Name","Nombre"}.
{"Never","Nunca"}.
{"Nickname","Apodo"}.
+{"Nickname is already in use by another occupant","El apodo ya está siendo usado por otro ocupante"}.
+{"Nickname is registered by another person","El apodo ya está registrado por otra persona"}.
{"Nickname Registration at ","Registro del apodo en "}.
{"Nickname ~s does not exist in the room","El apodo ~s no existe en la sala"}.
{"No body provided for announce message","No se ha proporcionado cuerpo de mensaje para el anuncio"}.
@@ -198,7 +179,6 @@
{"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"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Solo los moderadores y participantes pueden cambiar el asunto de esta sala"}.
+{"Only moderators are allowed to change subject in this room","Solo los moderadores pueden cambiar el asunto de esta sala"}.
{"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"}.
@@ -227,9 +207,9 @@
{"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 required to enter this room","Se necesita contraseña para entrar en esta sala"}.
{"Password Verification","Verificación de la contraseña"}.
{"Path to Dir","Ruta al directorio"}.
{"Path to File","Ruta al fichero"}.
@@ -237,26 +217,24 @@
{"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."}.
{"Pong","Pong"}.
-{"Port ~b","Puerto ~b"}.
{"Port","Puerto"}.
-{"Present real Jabber IDs to","Los Jabber ID reales pueden verlos"}.
+{"Present real Jabber IDs to","Los JID reales pueden verlos"}.
{"private, ","privado"}.
-{"Protocol","Protocolo"}.
{"Publish-Subscribe","Servicio de Publicar-Subscribir"}.
{"PubSub subscriber request","Petición de subscriptor de PubSub"}.
{"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)"}.
{"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"}.
{"Registered Users:","Usuarios registrados:"}.
{"Registered Users","Usuarios registrados"}.
{"Registration in mod_irc for ","Registro en mod_irc para"}.
+{"Remark 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."}.
{"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"}.
@@ -270,8 +248,6 @@
{"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"}.
@@ -289,7 +265,6 @@
{"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"}.
{"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"}.
@@ -297,6 +272,8 @@
{"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"}.
+{"Size","Tamaño"}.
+{"Specified nickname is already registered","El apodo especificado ya está registrado, tendrás que buscar otro"}.
{"Specify the access model","Especifica el modelo de acceso"}.
{"Specify the publisher model","Especificar el modelo del publicante"}.
{"~s's Offline Messages Queue","Cola de mensajes diferidos de ~s"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","Las colecciones a las que un nodo está afiliado"}.
{"the password is","la contraseña es"}.
{"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"}.
@@ -338,10 +311,9 @@
{"Transactions Logged:","Transacciones registradas:"}.
{"Transactions Restarted:","Transacciones reiniciadas:"}.
{"Tuesday","martes"}.
-{"Unable to generate a captcha","No se pudo generar un captcha."}.
-{"Unauthorized","No autorizado"}.
{"Update ","Actualizar "}.
{"Update","Actualizar"}.
+{"Updated modules","Módulos actualizados"}.
{"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"}.
@@ -349,13 +321,14 @@
{"Uptime:","Tiempo desde el inicio:"}.
{"Use of STARTTLS required","Es obligatorio usar STARTTLS"}.
{"User Management","Administración de usuarios"}.
-{"Users are not allowed to register accounts so quickly","Los usuarios no tienen permitido crear cuentas con tanta rapidez"}.
+{"Users are not allowed to register accounts so fast","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"}.
{"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"}.
{"Wednesday","miércoles"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Necesitas un cliente con soporte de x:data para poder registrar el apodo"}.
{"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.","Tu cola de mensajes diferidos de contactos está llena. El mensaje se ha descartado."}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","Tus mensajes a ~s están siendo bloqueados. Para desbloquearlos, visita ~s"}.
diff --git a/src/msgs/es.po b/src/msgs/es.po
index e5b8a14d1..b0d52e934 100644
--- a/src/msgs/es.po
+++ b/src/msgs/es.po
@@ -1,42 +1,24 @@
-# translation of es.po to
-# Badlop , 2009.
msgid ""
msgstr ""
-"Project-Id-Version: es\n"
-"PO-Revision-Date: 2009-08-12 12:39+0200\n"
-"Last-Translator: Badlop \n"
-"Language-Team: \n"
+"Project-Id-Version: 2.1.0-alpha\n"
+"Last-Translator: Badlop\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:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Es obligatorio usar STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "No se ha proporcionado recurso"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Reemplazado por una nueva conexión"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Teclea el texto que ves"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -53,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "¿Está seguro de quere borrar el mensaje del dia?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Asunto"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Cuerpo del mensaje"
@@ -81,7 +63,7 @@ msgstr "Enviar anuncio a todos los usuarios en todos los dominios"
msgid "Send announcement to all online users"
msgstr "Enviar anuncio a todos los usuarios conectados"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anuncio a todos los usuarios conectados en todos los dominios"
@@ -112,629 +94,573 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Configuración"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Base de datos"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Iniciar módulos"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Detener módulos"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Guardar copia de seguridad"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Restaurar"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Exportar a fichero de texto"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importar fichero"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importar directorio"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Reiniciar el servicio"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Detener el servicio"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Añadir usuario"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Borrar usuario"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Cerrar sesión de usuario"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Ver contraseña de usuario"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Cambiar contraseña de usuario"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Ver fecha de la última conexión de usuario"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Ver estadísticas de usuario"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Ver número de usuarios registrados"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Ver número de usuarios conectados"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Listas de Control de Acceso"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Reglas de Acceso"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Administración de usuarios"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Usuarios conectados"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Todos los usuarios"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Conexiones S2S salientes"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nodos funcionando"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nodos detenidos"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Módulos"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Gestión de copia de seguridad"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuarios de ficheros spool de jabberd-1.4"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "A ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "De ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Configuración de tablas de la base de datos en "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Selecciona tipo de almacenamiento de las tablas"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Copia en disco solamente"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Copia en RAM y disco"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Copia en RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Copia remota"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Detener módulos en "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Selecciona módulos a detener"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Iniciar módulos en "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Introduce lista de {módulo, [opciones]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Lista de módulos a iniciar"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Guardar copia de seguridad en fichero en "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Introduce ruta al fichero de copia de seguridad"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Ruta al fichero"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Restaura copia de seguridad desde el fichero en "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Exporta copia de seguridad a fichero de texto en "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Introduce ruta al fichero de texto"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importa usuario desde fichero en "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Introduce ruta al fichero jabberd14 spool"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importar usuarios desde el directorio en "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduce la ruta al directorio de jabberd14 spools"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Ruta al directorio"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Retraso temporal"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Configuración de la Lista de Control de Acceso"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Listas de Control de Acceso"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Configuración de accesos"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Reglas de acceso"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Contraseña"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Verificación de la contraseña"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Número de usuarios registrados"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Número de usuarios conectados"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nunca"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Conectado"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Última conexión"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Tamaño de la lista de contactos"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Direcciones IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Recursos"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administración de "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Acción en el usuario"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Editar propiedades"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Eliminar usuario"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Acceso denegado por la política del servicio"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Transporte de IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Módulo de IRC para ejabberd"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registro en mod_irc para"
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Introduce el nombre de usuario y codificaciones de carácteres que quieras "
+"usar al conectar en los servidores de IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nombre de usuario en IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"Si quieres especificar codificaciones de carácteres distintos para cada "
+"servidor IRC rellena esta lista con valores en el formato '{\"servidor irc"
+"\", \"codificación\"}'. Este servicio usa por defecto la codificación \"~s"
+"\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Ejemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Ejemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Parámetros de conexiones"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Codificaciones"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Entrar en canal IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Canal IRC (no pongas el # del principio)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Servidor IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Entrar en el canal de IRC aquí"
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "Opciones de IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Nombre de usuario en IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Contraseña ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Puerto ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Codificación del servidor ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Servidor ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
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:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "La sala de conferencias no existe"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Salas de charla"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"Necesitas un cliente con soporte de x:data para poder registrar el apodo"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registro del apodo en "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Introduce el apodo que quieras registrar"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Apodo"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "El apodo ya está registrado por otra persona"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "El apodo especificado ya está registrado, tendrás que buscar otro"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Debes rellenar el campo \"Apodo\" en el formulario"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Módulo de MUC para ejabberd"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Configuración de la sala modificada"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "entra en la sala"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "sale de la sala"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "ha sido bloqueado"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "ha sido expulsado"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
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:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "se cambia el nombre a"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " ha puesto el asunto: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "lunes"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "martes"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "miércoles"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "jueves"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "viernes"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "sábado"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "domingo"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "enero"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "febrero"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "marzo"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "abril"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "mayo"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "junio"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "julio"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "agosto"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "septiembre"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "octubre"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "noviembre"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "diciembre"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Configuración de la sala"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Ocupantes de la sala"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Título de la sala"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Se ha exedido el límite de tráfico"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Tipo de mensaje incorrecto"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -742,494 +668,481 @@ msgstr ""
"Este participante ha sido expulsado de la sala porque envió un mensaje de "
"error a otro participante"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "El receptor no está en la sala de conferencia"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "No está permitido enviar mensajes privados"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privado"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr ""
"Solo los moderadores y participantes pueden cambiar el asunto de esta sala"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Solo los moderadores pueden cambiar el asunto de esta sala"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-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:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "El apodo ya está siendo usado por otro ocupante"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "El apodo ya está registrado por otra persona"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Has sido bloqueado en esta sala"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Necesitas ser miembro de esta sala para poder entrar"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Sala no anónima"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Se necesita contraseña para entrar en esta sala"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "No se pudo generar un captcha."
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Contraseña incorrecta"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Se necesita privilegios de administrador"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Se necesita privilegios de moderador"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "El Jabber ID ~s no es válido"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "El apodo ~s no existe en la sala"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Afiliación no válida: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Rol no válido: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Se requieren privilegios de propietario de la sala"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Configuración para la sala ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Configuración para "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Descripción de la sala"
+msgstr "Descripción:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Sala permanente"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Sala públicamente visible"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "La lista de participantes es pública"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Proteger la sala con contraseña"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Número máximo de ocupantes"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Sin límite"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Los Jabber ID reales pueden verlos"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "solo moderadores"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "cualquiera"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Sala sólo para miembros"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Sala moderada"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Los usuarios son participantes por defecto"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Permitir a los usuarios cambiar el asunto"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Permitir a los usuarios enviar mensajes privados"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Permitir a los usuarios consultar a otros usuarios"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Permitir a los usuarios enviar invitaciones"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Permitir a los visitantes cambiarse el apodo"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Proteger la sala con captcha"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Guardar históricos"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Número de ocupantes"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s te invita a la sala ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "la contraseña es"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "Cola de mensajes diferidos de ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Enviado"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Fecha"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "De"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Para"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paquete"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Eliminar los seleccionados"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Mensajes diferidos:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Borrar todos los mensajes diferidos"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Módulo SOCKS5 Bytestreams para ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Servicio de Publicar-Subscribir"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo de Publicar-Subscribir de ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Petición de subscriptor de PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Decidir si aprobar la subscripción de esta entidad."
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Nodo ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Dirección del subscriptor"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "¿Deseas permitir a este JabberID que se subscriba a este nodo PubSub?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Enviar contenidos junto con las notificaciones de eventos"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Entregar notificaciones de eventos"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscriptores cuando cambia la configuración del nodo"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscriptores cuando el nodo se borra"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Persistir elementos al almacenar"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Un nombre sencillo para el nodo"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Máximo # de elementos que persisten"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Permitir subscripciones"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Especifica el modelo de acceso"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Grupos de contactos que pueden suscribirse"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Especificar el modelo del publicante"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Máximo tamaño del contenido en bytes"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Cuando enviar el último elemento publicado"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Solo enviar notificaciones a los usuarios disponibles"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Las colecciones a las que un nodo está afiliado"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Los usuarios no tienen permitido crear cuentas con tanta rapidez"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Ninguno"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Subscripción"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Pendiente"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grupos"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validar"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Borrar"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Lista de contactos de "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Mal formato"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Añadir Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Lista de contactos"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Grupos Compartidos"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Añadir nuevo"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Nombre:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Descripción:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Miembros:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Mostrar grupos:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Grupo "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Enviar"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber en Erlang"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Cumpleaños"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Ciudad"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "País"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "correo"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Apellido"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1237,383 +1150,353 @@ msgstr ""
"Rellena el formulario para buscar usuarios Jabber. Añade * al final de un "
"campo para buscar subcadenas."
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Nombre completo"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Segundo nombre"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nombre"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Nombre de la organización"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unidad de la organización"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Buscar usuarios en "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Usuario"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Buscar vCard de usuario"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Módulo vCard para ejabberd"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Buscar resultados por "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "No autorizado"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administración"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Crudo"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Dominios"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Configuración de las Regla de Acceso ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Dominios de ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Usuarios"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Última actividad de los usuarios"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Periodo: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Último mes"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Último año"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Toda la actividad"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Mostrar Tabla Ordinaria"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Mostrar Tabla Integral"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Estadísticas"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "No encontrado"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Nodo no encontrado"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Dominio"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Usuarios registrados"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Mensajes diferidos"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Última actividad"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Usuarios registrados:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Usuarios conectados:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Conexiones S2S salientes:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Servidores S2S salientes:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Cambiar contraseña"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Usuario "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Recursos conectados:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Contraseña:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Sin datos"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nodos"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Estadísticas"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Usuarios"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Última actividad"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(crudo)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Crudo"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Configuración de las Regla de Acceso ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Dominios de ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Última actividad de los usuarios"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Periodo: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Último mes"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Último año"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Toda la actividad"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Mostrar Tabla Ordinaria"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Mostrar Tabla Integral"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Nodo no encontrado"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Dominio"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Usuarios registrados"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Mensajes diferidos"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Usuarios registrados:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Usuarios conectados:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Conexiones S2S salientes:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Servidores S2S salientes:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Cambiar contraseña"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Usuario "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Recursos conectados:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Sin datos"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nodo "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Puertos de escucha"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Actualizar"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Reiniciar"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Detener"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Error en la llamada RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Tablas de la base de datos en "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Tipo de almacenamiento"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementos"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Tamaño"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memoria"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Error"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Copia de seguridad de "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Guardar copia de seguridad binaria:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "Aceptar"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Restaurar inmediatamente copia de seguridad binaria:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Guardar copia de seguridad en texto plano:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Restaurar copias de seguridad de texto plano inmediatamente:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Importar usuarios desde un fichero PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importar usuario de fichero spool de jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importar usuarios del directorio spool de jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Puertos de escucha en "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Módulos en "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Estadísticas de ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Tiempo desde el inicio:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Tiempo consumido de CPU:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transacciones finalizadas:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transacciones abortadas:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transacciones reiniciadas:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transacciones registradas:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Actualizar "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Plan de actualización"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Módulos modificados"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Módulos actualizados"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Script de actualización"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Script de actualización a bajo nivel"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Comprobación de script"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Puerto"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protocolo"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Módulo"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opciones"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Eliminar"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Iniciar"
diff --git a/src/msgs/fr.msg b/src/msgs/fr.msg
index bd725f931..6fbb9612a 100644
--- a/src/msgs/fr.msg
+++ b/src/msgs/fr.msg
@@ -14,8 +14,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Autoriser ce JID à s'abonner à ce noeud pubsub"}.
+{"Allow users to change 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"}.
@@ -24,7 +24,6 @@
{"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"}.
@@ -45,11 +44,10 @@
{"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"}.
+{"Configuration for ","Configuration pour "}.
{"Connected Resources:","Ressources connectées:"}.
-{"Connections parameters","Paramètres de connexion"}.
{"Country","Pays"}.
-{"CPU Time:","Temps CPU :"}.
+{"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 "}.
@@ -62,9 +60,9 @@
{"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 :"}.
+{"Description:","Description:"}.
{"Disc only copy","Copie sur disque uniquement"}.
-{"Displayed Groups:","Groupes affichés :"}.
+{"Displayed Groups:","Groupes affichés:"}.
{"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"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","Module vCard ejabberd"}.
{"ejabberd virtual hosts","Serveurs virtuels d'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"}.
+{"Encodings","Encodages"}.
{"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"}.
@@ -86,14 +83,9 @@
{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Entrez le nom d'utilisateur et les encodages 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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Exemple: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"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"}.
@@ -116,38 +108,27 @@
{"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 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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Si vous voulez préciser différents encodages pour les serveurs IRC, remplissez cette liste avec des valeurs dans le format '{\"serveur irc\", \"encodage\"}'. Par défaut ce service utilise l'encodage \"~s\"."}.
{"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"}.
+{"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 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"}.
+{"Jabber ID ~s is invalid","Le JID ~s n'est pas valide"}.
{"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é"}.
@@ -160,7 +141,6 @@
{"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"}.
@@ -171,51 +151,51 @@
{"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 :"}.
+{"Membership required to enter this room","Vous devez être membre pour accèder à ce salon"}.
+{"Members:","Membres:"}.
{"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:"}.
{"Name","Nom"}.
{"Never","Jamais"}.
+{"Nickname is already in use by another occupant","Le pseudo est déjà utilisé par un autre occupant"}.
+{"Nickname is registered by another person","Le pseudo est enregistré par une autre personne"}.
{"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 ID","Identifiant du noeud"}.
{"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é"}.
+{"Notify subscribers when items are removed from the node","Avertir les abonnés lorsque des éléments sont supprimés sur le noeud"}.
+{"Notify subscribers when the node configuration changes","Avertir les abonnés lorsque la configuration du noeud change"}.
+{"Notify subscribers when the node is deleted","Avertir les abonnés lorsque le noeud 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:"}.
{"Offline Messages","Messages en attente"}.
{"OK","OK"}.
{"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 moderators and participants are allowed to change subject in this room","Seuls les modérateurs et les participants peuvent changer le sujet dans ce salon"}.
+{"Only moderators are allowed to change 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"}.
@@ -227,36 +207,34 @@
{"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 required to enter this room","Un mot de passe est nécessaire pour accèder à ce salon"}.
{"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 :"}.
+{"Pending","En suspend"}.
+{"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"}.
+{"Present real Jabber IDs to","Rendre le JID réel visible pour"}.
{"private, ","privé"}.
-{"Protocol","Protocole"}.
{"Publish-Subscribe","Publication-Abonnement"}.
{"PubSub subscriber request","Demande d'abonnement PubSub"}.
{"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)"}.
{"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"}.
{"Registered Users:","Utilisateurs enregistrés:"}.
{"Registered Users","Utilisateurs enregistrés"}.
{"Registration in mod_irc for ","Enregistrement du mod_irc pour "}.
+{"Remark 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."}.
{"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"}.
@@ -270,8 +248,6 @@
{"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"}.
@@ -289,7 +265,6 @@
{"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"}.
{"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"}.
@@ -297,6 +272,8 @@
{"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"}.
+{"Size","Taille"}.
+{"Specified nickname is already registered","Le pseudo demandé est déjà enregistré"}.
{"Specify the access model","Définir le modèle d'accès"}.
{"Specify the publisher model","Définir le modèle de publication"}.
{"~s's Offline Messages Queue","~s messages en file d'attente"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","Les collections avec lesquelle un nœud est affilié"}.
{"the password is","le mot de passe est"}.
{"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é"}.
{"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é à un autre participant"}.
@@ -333,29 +306,29 @@
{"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 :"}.
+{"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é"}.
+{"Updated modules","Modules mis à jours"}.
{"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 :"}.
+{"Uptime:","Temps depuis le démarrage:"}.
{"Use of STARTTLS required","L'utilisation de STARTTLS est impérative"}.
{"User Management","Gestion des utilisateurs"}.
-{"Users are not allowed to register accounts so quickly","Les utilisateurs ne sont pas autorisés à enregistrer des comptes si rapidement"}.
+{"Users are not allowed to register accounts so fast","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"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Vous avez besoin d'un client supportant x:data pour enregistrer un pseudo"}.
{"You need an x:data capable client to search","Vous avez besoin d'un client supportant x:data pour faire une recherche"}.
{"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 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"}.
diff --git a/src/msgs/fr.po b/src/msgs/fr.po
index 549dca356..b1d232bb5 100644
--- a/src/msgs/fr.po
+++ b/src/msgs/fr.po
@@ -1,43 +1,26 @@
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"
+"Last-Translator: Christophe Romain\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:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "L'utilisation de STARTTLS est impérative"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Aucune ressource fournie"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Remplacé par une nouvelle connexion"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Tapez le texte que vous voyez"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -54,11 +37,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Confirmer la suppression du message du jour ?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Sujet"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Corps du message"
@@ -82,7 +65,7 @@ msgstr "Envoyer une annonce à tous les utilisateurs de tous les domaines"
msgid "Send announcement to all online users"
msgstr "Envoyer l'annonce à tous les utilisateurs en ligne"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Envoyer l'annonce à tous les utilisateurs en ligne sur tous les serveurs"
@@ -115,627 +98,570 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Configuration"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Base de données"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Modules de démarrage"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Modules d'arrêt"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Sauvegarde"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Restauration"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Sauvegarder dans un fichier texte"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importer un fichier"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importer une répertoire"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Redémarrer le service"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Arrêter le service"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Ajouter un utilisateur"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Supprimer l'utilisateur"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Terminer la session de l'utilisateur"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Récupérer le mot de passe de l'utilisateur"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Changer le mot de passe de l'utilisateur"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
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:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Récupérer les statistiques de l'utilisateur"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Récupérer le nombre d'utilisateurs enregistrés"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Récupérer le nombre d'utilisateurs en ligne"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Droits (ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Règles d'accès"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Gestion des utilisateurs"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Utilisateurs en ligne"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Tous les utilisateurs"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Connexions s2s sortantes"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Noeuds actifs"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Noeuds arrêtés"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Modules"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Gestion des sauvegardes"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importer des utilisateurs depuis un fichier spool Jabberd 1.4"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "A ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "De ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Configuration des tables de base de données sur "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Choisissez un type de stockage pour les tables"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Copie sur disque uniquement"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Copie en mémoire vive (RAM) et sur disque"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Copie en mémoire vive (RAM)"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Copie distante"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Arrêter les modules sur "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Sélectionnez les modules à arrêter"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Démarrer les modules sur "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Entrez une liste de {Module, [Options]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Liste des modules à démarrer"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Sauvegarde sur fichier sur "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Entrez le chemin vers le fichier de sauvegarde"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Chemin vers le fichier"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Restaurer la sauvegarde depuis le fichier sur "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Enregistrer la sauvegarde dans un fichier texte sur "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Entrez le chemin vers le fichier texte"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importer un utilisateur depuis le fichier sur "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Entrez le chemin vers le fichier spool jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importer des utilisateurs depuis le répertoire sur "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Entrez le chemin vers le répertoire de spool jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Chemin vers le répertoire"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Délais"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Configuration des droits (ACL)"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Droits (ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Configuration d'accès"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Règles d'accès"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Mot de passe"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Vérification du mot de passe"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Nombre d'utilisateurs enregistrés"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Nombre d'utilisateurs en ligne"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Jamais"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "En ligne"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Dernière connexion"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Taille de la liste de contacts"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Adresses IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Ressources"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administration de "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Action sur l'utilisateur"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Modifier les propriétés"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Supprimer l'utilisateur"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "L'accès au service est refusé"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Passerelle IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Module IRC ejabberd"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Enregistrement du mod_irc pour "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Entrez le nom d'utilisateur et les encodages que vous souhaitez utiliser "
+"pour vous connecter aux serveurs IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nom d'utilisateur IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"Si vous voulez préciser différents encodages pour les serveurs IRC, "
+"remplissez cette liste avec des valeurs dans le format '{\"serveur irc\", "
+"\"encodage\"}'. Par défaut ce service utilise l'encodage \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Exemple: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Exemple: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Paramètres de connexion"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Encodages"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Rejoindre un canal IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Canal IRC (ne pas insérer le premier caractère #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Serveur IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Rejoindre un canal IRC ici"
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "Configuration IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Nom d'utilisateur IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Mot de passe ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Codage pour le serveur ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Serveur ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "La création de salons est interdite par le service"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "La salle de conférence n'existe pas"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Salons de discussion"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"Vous avez besoin d'un client supportant x:data pour enregistrer un pseudo"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Enregistrement d'un pseudo sur "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Entrez le pseudo que vous souhaitez enregistrer"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Pseudo"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Le pseudo est enregistré par une autre personne"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Le pseudo demandé est déjà enregistré"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Module MUC ejabberd"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Configuration du salon modifiée"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "rejoint le salon"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "quitte le salon"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "a été banni"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "a été expulsé"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
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:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "est maintenant connu comme"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " a changé le sujet pour: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Lundi"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Mardi"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Mercredi"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Jeudi"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Vendredi"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Samedi"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Dimanche"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Janvier"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Février"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Mars"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Avril"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Mai"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Juin"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Juillet"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Août"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Septembre"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Octobre"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Novembre"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Décembre"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Configuration du salon"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Occupants du salon"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Titre du salon"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "La limite de trafic a été dépassée"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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é"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Mauvais type de message"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -743,503 +669,490 @@ msgstr ""
"Ce participant est expulsé du salon pour avoir envoyé un message erroné à un "
"autre participant"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Le destinataire n'est pas dans la conférence"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
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:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privé"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change 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:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Seuls les modérateurs peuvent changer le sujet dans ce salon"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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é"
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "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:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Le pseudo est enregistré par une autre personne"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Vous avez été exclus de ce salon"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Vous devez être membre pour accèder à ce salon"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Ce salon n'est pas anonyme"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Un mot de passe est nécessaire pour accèder à ce salon"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Impossible de générer le captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Mot de passe incorrect"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Les droits d'administrateur sont nécessaires"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Les droits de modérateur sont nécessaires"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Le Jabber ID ~s n'est pas valide"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
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:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
-msgstr "Affiliation invalide : ~s"
+msgstr "Affiliation invalide: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
-msgstr "Role invalide : ~s"
+msgstr "Role invalide: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Les droits de propriétaire sont nécessaires"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Configuration pour le salon ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Configuration pour "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Description :"
+msgstr "Description:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Rendre le salon persistant"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Rendre le salon public"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Rendre la liste des participants publique"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Protéger le salon par mot de passe"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Nombre maximum d'occupants"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Pas de limite"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Rendre le Jabber ID réel visible pour"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "modérateurs seulement"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "tout le monde"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Réserver le salon aux membres uniquement"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Rendre le salon modéré"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Les utilisateurs sont par défaut participant"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Autoriser les utilisateurs à changer le sujet"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Autoriser les utilisateurs à envoyer des messages privés"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
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:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Permettre aux utilisateurs d'envoyer des invitations"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Autoriser les visiteurs à changer de pseudo"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Protéger le salon par un captcha"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Activer l'archivage"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Nombre d'occupants"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
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:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "le mot de passe est"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s messages en file d'attente"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Soumis"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Heure"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "De"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "A"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paquet"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Suppression des éléments sélectionnés"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
-msgstr "Messages en attente :"
+msgstr "Messages en attente:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Effacer tous les messages hors ligne"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publication-Abonnement"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Module Publish-Subscribe d'ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Demande d'abonnement PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Accepter cet abonnement ?"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
-msgstr "Identifiant du nœud"
+msgstr "Identifiant du noeud"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Adresse de l'abonné"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
-msgstr "Autoriser ce Jabber ID à s'abonner à ce nœud PubSub"
+msgstr "Autoriser ce Jabber ID à s'abonner à ce noeud pubsub"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Inclure le contenu du message avec la notification"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Envoyer les notifications d'événement"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
-msgstr "Avertir les abonnés lorsque la configuration du nœud change"
+msgstr "Avertir les abonnés lorsque la configuration du noeud change"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
-msgstr "Avertir les abonnés lorsque le nœud est supprimé"
+msgstr "Avertir les abonnés lorsque le noeud est supprimé"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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"
+msgstr "Avertir les abonnés lorsque des éléments sont supprimés sur le noeud"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Stockage persistant des éléments"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Un nom convivial pour le noeud"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Nombre maximum d'éléments à stocker"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Autoriser l'abonnement ?"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Définir le modèle d'accès"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Groupes de liste de contact autorisés à s'abonner"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Définir le modèle de publication"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Taille maximum pour le contenu du message en octet"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "A quel moment envoyer le dernier élément publié"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Envoyer les notifications uniquement aux utilisateurs disponibles"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Les collections avec lesquelle un nœud est affilié"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr ""
"Les utilisateurs ne sont pas autorisés à enregistrer des comptes si "
"rapidement"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Aucun"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Abonnement"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
-msgstr "En suspens"
+msgstr "En suspend"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Groupes"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Valider"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Enlever"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Liste de contact de "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Mauvais format"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Ajouter un Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Liste de contacts"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Groupes de liste de contacts partagée"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Ajouter"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
-msgstr "Nom :"
+msgstr "Nom:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
-msgstr "Description :"
+msgstr "Description:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
-msgstr "Membres :"
+msgstr "Membres:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
-msgstr "Groupes affichés :"
+msgstr "Groupes affichés:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Groupe "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Soumettre"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Serveur Jabber Erlang"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Date d'anniversaire"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Ville"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Pays"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Email"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Nom de famille"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1247,394 +1160,353 @@ 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Nom complet"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Autre nom"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nom"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Nom de l'organisation"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unité de l'organisation"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Rechercher des utilisateurs "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Utilisateur"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Recherche dans l'annnuaire"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Module vCard ejabberd"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Résultats de recherche pour "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Non autorisé"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Console Web d'administration de ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administration"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Brut"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Serveurs virtuels"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Configuration des règles d'accès ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Serveurs virtuels d'ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Utilisateurs"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Dernière activité des utilisateurs"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Période :"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Dernier mois"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Dernière année"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Toute activité"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Montrer la table ordinaire"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Montrer la table intégralement"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistiques"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Nœud non trouvé"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Noeud non trouvé"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Serveur"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Utilisateurs enregistrés"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Messages en attente"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Dernière Activité"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Utilisateurs enregistrés:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Utilisateurs connectés:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Connexions s2s sortantes:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Serveurs s2s sortants"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Modifier le mot de passe"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Utilisateur "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Ressources connectées:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Mot de passe:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Aucune information disponible"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Noeuds"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistiques"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Utilisateurs"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Dernière Activité"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Brut)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Brut"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Configuration des règles d'accès ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Serveurs virtuels d'ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Dernière activité des utilisateurs"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Période:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Dernier mois"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Dernière année"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Toute activité"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Montrer la table ordinaire"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Montrer la table intégralement"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Noeud non trouvé"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Serveur"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Utilisateurs enregistrés"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Messages en attente"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Utilisateurs enregistrés:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Utilisateurs connectés:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Connexions s2s sortantes:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Serveurs s2s sortants"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Modifier le mot de passe"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Utilisateur "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Ressources connectées:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Mot de passe:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Aucune information disponible"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Noeud "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Ports ouverts"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Mettre à jour"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Redémarrer"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Arrêter"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Erreur d'appel RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Tables de base de données sur "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Type de stockage"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Éléments"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Taille"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Mémoire"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Erreur"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Sauvegarde de "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Sauvegarde binaire:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Restauration immédiate d'une sauvegarde binaire:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Sauvegarde texte:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Restauration immédiate d'une sauvegarde texte:"
-#: web/ejabberd_web_admin.erl:1999
-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:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importer des utilisateurs depuis un fichier spool Jabberd 1.4:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importer des utilisateurs depuis un fichier spool Jabberd 1.4:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Ports ouverts sur "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Modules sur "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistiques de ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
-msgstr "Temps depuis le démarrage :"
+msgstr "Temps depuis le démarrage:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
-msgstr "Temps CPU :"
+msgstr "Temps CPU:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
-msgstr "Transactions commitées :"
+msgstr "Transactions commitées:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
-msgstr "Transactions annulées :"
+msgstr "Transactions annulées:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
-msgstr "Transactions redémarrées :"
+msgstr "Transactions redémarrées:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
-msgstr "Transactions journalisées :"
+msgstr "Transactions journalisées:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Mise à jour "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Plan de mise à jour"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Modules mis à jour"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Modules mis à jours"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Script de mise à jour"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Script de mise à jour de bas-niveau"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Validation du script"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protocole"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Module"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Options"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Supprimer"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Démarrer"
-
-#~ msgid "Encodings"
-#~ msgstr "Encodages"
-
-#~ msgid "(Raw)"
-#~ msgstr "(Brut)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "Serveurs virtuels"
diff --git a/src/msgs/gl.msg b/src/msgs/gl.msg
index e84407324..5b30993e2 100644
--- a/src/msgs/gl.msg
+++ b/src/msgs/gl.msg
@@ -12,32 +12,28 @@
{"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 change 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 "}.
+{"Backup to File at ","Gardar copia de seguridade en ficheiro en "}.
{"Bad format","Mal formato"}.
{"Birthday","Aniversario"}.
-{"Change Password","Cambiar contrasinal"}.
-{"Change User Password","Cambiar contrasinal de usuario"}.
+{"Change Password","Cambiar contraseña"}.
+{"Change User Password","Cambiar contraseña 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 a username and password to register with this server","Escolle un nome de usuario e contraseña 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."}.
@@ -45,9 +41,8 @@
{"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"}.
+{"Configuration for ","Configuración para "}.
{"Connected Resources:","Recursos conectados:"}.
-{"Connections parameters","Parámetros de conexiones"}.
{"Country","País"}.
{"CPU Time:","Tempo consumido de CPU:"}.
{"Database","Base de datos"}.
@@ -75,25 +70,19 @@
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
{"ejabberd virtual hosts","Hosts virtuais de 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"}.
+{"Encodings","Codificaciones"}.
{"End User Session","Pechar sesión de usuario"}.
-{"Enter list of {Module, [Options]}","Introduce lista de {Módulo, [Opcións]}"}.
+{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Introduce o nome de usuario e codificaciones de carácteres que queiras usar ao conectar nos 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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Ejemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Apelido"}.
{"February","Febreiro"}.
{"Fill in fields to search for any matching Jabber User","Rechea campos para buscar usuarios Jabber que concuerden"}.
@@ -105,65 +94,52 @@
{"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 Password","Ver contraseña de usuario"}.
{"Get User Statistics","Ver estatísticas de usuario"}.
{"Group ","Grupo "}.
{"Groups","Grupos"}.
-{"has been banned","foi bloqueado"}.
+{"has been banned","ha sido 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 been kicked","ha sido 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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Se queres especificar codificaciones de carácteres distintos para cada servidor IRC rechea esta lista con valores no formato '{\"servidor irc\", \"codificación\"}'. Este servizo usa por defecto a codificación \"~s\"."}.
{"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"}.
+{"Incorrect password","Contraseña 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"}.
+{"Jabber ID ~s is invalid","O JID ~s non é válido"}.
{"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"}.
+{"leaves the room","sale de la 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 moderated","Facer Sala moderada"}.
+{"Make room password protected","Protexer a sala con contraseña"}.
{"Make room persistent","Sala permanente"}.
{"Make room public searchable","Sala publicamente visible"}.
{"March","Marzo"}.
@@ -171,14 +147,13 @@
{"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"}.
+{"Membership 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"}.
@@ -187,6 +162,8 @@
{"Name","Nome"}.
{"Never","Nunca"}.
{"Nickname","Alcume"}.
+{"Nickname is already in use by another occupant","O alcume xa está sendo usado por outro ocupante"}.
+{"Nickname is registered by another person","O alcume xa está rexistrado por outra persoa"}.
{"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"}.
@@ -198,7 +175,6 @@
{"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"}.
@@ -207,15 +183,15 @@
{"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 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 moderators and participants are allowed to change subject in this room","Só os moderadores e participantes poden cambiar o asunto desta sala"}.
+{"Only moderators are allowed to change subject in this room","Só os moderadores poden cambiar o asunto desta 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"}.
@@ -227,36 +203,34 @@
{"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"}.
+{"Password:","Contraseña:"}.
+{"Password","Contraseña"}.
+{"Password required to enter this room","Necesítase contraseña para entrar nesta sala"}.
+{"Password Verification","Verificación da contraseña"}.
{"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"}.
+{"Present real Jabber IDs to","Os JID 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)"}.
{"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"}.
+{"Remark 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 embebida. Se estás usando ODBC terás que facer tamén copia de seguridade da túa base de datos SQL."}.
{"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"}.
@@ -270,8 +244,6 @@
{"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"}.
@@ -289,7 +261,6 @@
{"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"}.
@@ -297,6 +268,8 @@
{"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"}.
+{"Size","Tamaño"}.
+{"Specified nickname is already registered","O alcume especificado xa está rexistrado, terás que buscar outro"}.
{"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"}.
@@ -318,11 +291,7 @@
{"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 é"}.
+{"the password is","a contraseña é"}.
{"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"}.
@@ -338,10 +307,9 @@
{"Transactions Logged:","Transaccións rexistradas:"}.
{"Transactions Restarted:","Transaccións reiniciadas:"}.
{"Tuesday","Martes"}.
-{"Unable to generate a captcha","Non se pode xerar un Captcha"}.
-{"Unauthorized","Non autorizado"}.
{"Update ","Actualizar"}.
{"Update","Actualizar"}.
+{"Updated modules","Módulos actualizados"}.
{"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"}.
@@ -349,14 +317,13 @@
{"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"}.
-{"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"}.
+{"Virtual Hosts","Hosts Virtuais"}.
{"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"}.
@@ -368,4 +335,3 @@
{"You need an x:data capable client to register nickname","Necesitas un cliente con soporte de x:data para poder rexistrar o alcume"}.
{"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"}.
diff --git a/src/msgs/gl.po b/src/msgs/gl.po
index e9c03a3b7..7f35d1864 100644
--- a/src/msgs/gl.po
+++ b/src/msgs/gl.po
@@ -7,31 +7,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Galician (galego)\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "É obrigatorio usar STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Non se proporcionou recurso"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Substituído por unha nova conexión"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Introduza o texto que ves"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -48,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Está seguro de quere borrar a mensaxe do dia?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Asunto"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Corpo da mensaxe"
@@ -76,7 +63,7 @@ msgstr "Enviar anuncio a todos os usuarios en todos os dominios"
msgid "Send announcement to all online users"
msgstr "Enviar anuncio a todos los usuarios conectados"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anuncio a todos os usuarios conectados en todos os dominios"
@@ -106,628 +93,571 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Configuración"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Base de datos"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Iniciar módulos"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Detener módulos"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Gardar copia de seguridade"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Restaurar"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Exportar a ficheiro de texto"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importar ficheiro"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importar directorio"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Reiniciar o servizo"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Deter o servizo"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Engadir usuario"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Borrar usuario"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Pechar sesión de usuario"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
-msgstr "Ver contrasinal de usuario"
+msgstr "Ver contraseña de usuario"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
-msgstr "Cambiar contrasinal de usuario"
+msgstr "Cambiar contraseña de usuario"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Ver data da última conexión de usuario"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Ver estatísticas de usuario"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Ver número de usuarios rexistrados"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Ver número de usuarios conectados"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Listas de Control de Acceso"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Regras de Acceso"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Administración de usuarios"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Usuarios conectados"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Todos os usuarios"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Conexións S2S saíntes"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nodos funcionando"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nodos detidos"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Módulos"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Xestión de copia de seguridade"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuarios de ficheiros spool de jabberd-1.4"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "A ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "De ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Configuración de táboas da base de datos en "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Selecciona tipo de almacenamento das táboas"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Copia en disco soamente"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Copia en RAM e disco"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Copia en RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Copia remota"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Deter módulos en "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Selecciona módulos a deter"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Iniciar módulos en "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
-msgstr "Introduce lista de {Módulo, [Opcións]}"
+msgstr "Introduce lista de {módulo, [opcións]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Lista de módulos a iniciar"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
-msgstr "Copia de seguridade de arquivos en "
+msgstr "Gardar copia de seguridade en ficheiro en "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Introduce ruta ao ficheiro de copia de seguridade"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Ruta ao ficheiro"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Restaura copia de seguridade desde o ficheiro en "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Exporta copia de seguridade a ficheiro de texto en "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Introduce ruta ao ficheiro de texto"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importa usuario desde ficheiro en "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Introduce ruta ao ficheiro jabberd14 spool"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importar usuarios desde o directorio en "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduce a ruta ao directorio de jabberd14 spools"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Ruta ao directorio"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Atraso temporal"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Configuración da Lista de Control de Acceso"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Listas de Control de Acceso"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Configuración de accesos"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Regras de acceso"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
-msgstr "Contrasinal"
+msgstr "Contraseña"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
-msgstr "Verificación da contrasinal"
+msgstr "Verificación da contraseña"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Número de usuarios rexistrados"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Número de usuarios conectados"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nunca"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Conectado"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Última conexión"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Tamaño da lista de contactos"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Direccións IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Recursos"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administración de "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Acción no usuario"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Editar propiedades"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Eliminar usuario"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Acceso denegado pola política do servizo"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Transporte IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Módulo de IRC para ejabberd"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Rexistro en mod_irc para"
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Introduce o nome de usuario e codificaciones de carácteres que queiras usar "
+"ao conectar nos servidores de IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nome de usuario en IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"Se quere especificar codificaciones de caracteres diferentes, contrasinal ou "
+"Se queres especificar codificaciones de carácteres distintos para cada "
"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."
+"\"codificación\"}'. Este servizo usa por defecto a codificación \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Exemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Ejemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Parámetros de conexiones"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Codificaciones"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Entrar en canle IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Canle de IRC (non poñer o primeiro #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Servidor IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Únete á canle de IRC aquí."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "IRC axustes"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Nome de usuario en IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Contrasinal ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Porto ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Codificación de servidor ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Servidor ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Denegar crear a sala por política do servizo"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "A sala de conferencias non existe"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Salas de charla"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"Necesitas un cliente con soporte de x:data para poder rexistrar o alcume"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Rexistro do alcume en "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Introduce o alcume que queiras rexistrar"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Alcume"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "O alcume xa está rexistrado por outra persoa"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "O alcume especificado xa está rexistrado, terás que buscar outro"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Debes encher o campo \"Alcumo\" no formulario"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Módulo de MUC para ejabberd"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Configuración de la sala modificada"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "entra en la sala"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
-msgstr "sae da sala"
+msgstr "sale de la sala"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
-msgstr "foi bloqueado"
+msgstr "ha sido bloqueado"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
-msgstr "foi expulsado"
+msgstr "ha sido expulsado"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "foi expulsado por mor dun sistema de peche"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "cámbiase o nome a"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " puxo o asunto: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Luns"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Martes"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Mércores"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Xoves"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Venres"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Sábado"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Domingo"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Xaneiro"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Febreiro"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Marzo"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Abril"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Maio"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Xuño"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Xullo"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Agosto"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Setembro"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Outubro"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Novembro"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Decembro"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Configuración da Sala"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Ocupantes da sala"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Título da sala"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Hase exedido o límite de tráfico"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Tipo de mensaxe incorrecta"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -735,494 +665,482 @@ msgstr ""
"Este participante é expulsado da sala, porque el enviou unha mensaxe de erro "
"a outro participante"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "O receptor non está na sala de conferencia"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
+#, fuzzy
msgid "It is not allowed to send private messages"
-msgstr "Non está permitido enviar mensaxes privadas"
+msgstr "Impedir o envio de mensaxes privadas á sala"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privado"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
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"
+"Only moderators and participants are allowed to change subject in this room"
+msgstr "Só os moderadores e participantes poden cambiar o asunto desta sala"
-#: mod_muc/mod_muc_room.erl:806
-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:853
+msgid "Only moderators are allowed to change subject in this room"
+msgstr "Só os moderadores poden cambiar o asunto desta sala"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
+#, fuzzy
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"
+msgstr "Só os moderadores poden cambiar o asunto desta sala"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-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:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "O alcume xa está sendo usado por outro ocupante"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "O alcume xa está rexistrado por outra persoa"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "fuches bloqueado nesta sala"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Necesitas ser membro desta sala para poder entrar"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Sala non anónima"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
-msgstr "Necesítase contrasinal para entrar nesta sala"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
+msgstr "Necesítase contraseña para entrar nesta sala"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Non se pode xerar un Captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
-msgstr "Contrasinal incorrecta"
+msgstr "Contraseña incorrecta"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Necesítase privilexios de administrador"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Necesítase privilexios de moderador"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "O Jabber ID ~s non é válido"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "O alcume ~s non existe na sala"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Afiliación non válida: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Rol non válido: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Requírense privilexios de propietario da sala"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Configuración para a sala ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Configuración para "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Descrición da sala"
+msgstr "Descrición:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Sala permanente"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Sala publicamente visible"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "A lista de participantes é pública"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
-msgstr "Protexer a sala con contrasinal"
+msgstr "Protexer a sala con contraseña"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Número máximo de ocupantes"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Sen límite"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Os Jabber ID reais poden velos"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "só moderadores"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "calquera"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Sala só para membros"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
-msgstr "Facer sala moderada"
+msgstr "Facer Sala moderada"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Os usuarios son participantes por defecto"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Permitir aos usuarios cambiar o asunto"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Permitir aos usuarios enviar mensaxes privadas"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Permitir aos usuarios consultar a outros usuarios"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Permitir aos usuarios enviar invitacións"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
+#, fuzzy
msgid "Allow visitors to send status text in presence updates"
-msgstr ""
-"Permitir aos visitantes enviar texto de estado nas actualizacións depresenza"
+msgstr "Permitir aos usuarios enviar mensaxes privadas"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
+#, fuzzy
msgid "Allow visitors to change nickname"
-msgstr "Permitir aos visitantes cambiarse o alcume"
+msgstr "Permitir aos usuarios cambiar o asunto"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Protexer a sala con captcha"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Gardar históricos"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Número de ocupantes"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s invítache á sala ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
-msgstr "a contrasinal é"
+msgstr "a contraseña é"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "Cola de mensaxes diferidas de ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Enviado"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Data"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "De"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Para"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paquete"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Eliminar os seleccionados"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
-msgstr "Mensaxes sen conexión:"
+msgstr "Mensaxes diferidas:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Borrar Todas as Mensaxes Sen conexión"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publicar-Subscribir"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo de Publicar-Subscribir de ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Petición de subscriptor de PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Decidir se aprobar a subscripción desta entidade."
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Nodo IDE"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Dirección do subscriptor"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Enviar payloads xunto coas notificacións de eventos"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Entregar notificacións de eventos"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscriptores cando cambia a configuración do nodo"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscriptores cando o nodo bórrase"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Persistir elementos ao almacenar"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
-msgstr "Un nome para o nodo"
+msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Máximo # de elementos que persisten"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Permitir subscripciones"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Especifica o modelo de acceso"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Lista de grupos autorizados a subscribir"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Especificar o modelo do publicante"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Máximo tamaño do payload en bytes"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Cando enviar o último elemento publicado"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Só enviar notificacións aos usuarios dispoñibles"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "As coleccións coas que un nodo está afiliado"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr ""
-"Escolle un nome de usuario e contrasinal para rexistrarche neste servidor"
+"Escolle un nome de usuario e contraseña para rexistrarche neste servidor"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "Os usuarios non están autorizados a rexistrar contas con tanta rapidez"
+#: mod_register.erl:232
+#, fuzzy
+msgid "Users are not allowed to register accounts so fast"
+msgstr "Os visitantes non poden enviar mensaxes a todos os ocupantes"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Ningún"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Subscripción"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Pendente"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grupos"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validar"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Borrar"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Lista de contactos de "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Mal formato"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Engadir ID Jabber"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Lista de contactos"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Grupos Compartidos"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Engadir novo"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Nome:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Descrición:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Membros:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Mostrar grupos:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Grupo "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Enviar"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber en Erlang"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Aniversario"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Cidade"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "País"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Email"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Apelido"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1230,399 +1148,353 @@ msgstr ""
"Enche o formulario para buscar usuarios Jabber. Engade * ao final dun campo "
"para buscar subcadenas."
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Nome completo"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Segundo nome"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nome"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Nome da organización"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unidade da organización"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Buscar usuarios en "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Usuario"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Procura de usuario en vCard"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Módulo vCard para ejabberd"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Buscar resultados por "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Non autorizado"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Ejabberd Administrador Web"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administración"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Cru"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Hosts Virtuais"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Configuración das Regra de Acceso ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Hosts virtuais de ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Usuarios"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Última actividade dos usuarios"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Periodo: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Último mes"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Último ano"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Toda a actividade"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Mostrar Táboa Ordinaria"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Mostrar Táboa Integral"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Estatísticas"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Non atopado"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Nodo non atopado"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Host"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Usuarios rexistrados"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Mensaxes diferidas"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Última actividade"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Usuarios rexistrados:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Usuarios conectados:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Conexións S2S saíntes:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Servidores S2S saíntes:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Cambiar contrasinal"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Usuario "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Recursos conectados:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Contrasinal:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Sen datos"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nodos"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Estatísticas"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Usuarios"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Última actividade"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Cru)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Cru"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Configuración das Regra de Acceso ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Hosts virtuais de ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Última actividade dos usuarios"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Periodo: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Último mes"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Último ano"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Toda a actividade"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Mostrar Táboa Ordinaria"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Mostrar Táboa Integral"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Nodo non atopado"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Host"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Usuarios rexistrados"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Mensaxes diferidas"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Usuarios rexistrados:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Usuarios conectados:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Conexións S2S saíntes:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Servidores S2S saíntes:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Cambiar contraseña"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Usuario "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Recursos conectados:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Sen datos"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nodo "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Portos de escoita"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Actualizar"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Reiniciar"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Deter"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Erro na chamada RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Táboas da base de datos en "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Tipo de almacenamiento"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementos"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Tamaño"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memoria"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Erro"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Copia de seguridade de "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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."
+"Mnesia embebida. Se estás usando ODBC terás que facer tamén copia de "
+"seguridade da túa base de datos SQL."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Gardar copia de seguridade binaria:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "Aceptar"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Restaurar inmediatamente copia de seguridade binaria:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Gardar copia de seguridade en texto plano:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Restaurar copias de seguridade de texto plano inmediatamente:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Importar usuarios desde un fichero PIEFXIS"
-
-#: web/ejabberd_web_admin.erl:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importar usuario de fichero spool de jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importar usuarios do directorio spool de jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Portos de escoita en "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Módulos en "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Estatísticas de ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Tempo desde o inicio:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Tempo consumido de CPU:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transaccións finalizadas:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transaccións abortadas:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transaccións reiniciadas:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transaccións rexistradas:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Actualizar"
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Plan de actualización"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Módulos Modificados"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Módulos actualizados"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Script de actualización"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Script de actualización a baixo nivel"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Comprobación de script"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Porto"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protocolo"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Módulo"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opcións"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Eliminar"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Iniciar"
-
-#~ msgid "Encodings"
-#~ msgstr "Codificaciones"
-
-#~ msgid "(Raw)"
-#~ msgstr "(Cru)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "Hosts Virtuais"
-
-#~ msgid "Specified nickname is already registered"
-#~ msgstr "O alcume especificado xa está rexistrado, terás que buscar outro"
-
-#~ msgid "Size"
-#~ msgstr "Tamaño"
diff --git a/src/msgs/it.msg b/src/msgs/it.msg
index 3a26627ab..f2928492f 100644
--- a/src/msgs/it.msg
+++ b/src/msgs/it.msg
@@ -14,8 +14,8 @@
{"Administrator privileges required","Necessari i privilegi di amministratore"}.
{"A friendly name for the node","Un nome comodo per il nodo"}.
{"All activity","Tutta l'attività"}.
-{"Allow this Jabber ID to subscribe to this pubsub node?","Consentire a questo Jabber ID l'iscrizione a questo nodo pubsub?"}.
-{"Allow users to change the subject","Consentire agli utenti di cambiare l'oggetto"}.
+{"Allow this Jabber ID to subscribe to this pubsub node?","Consentire a questo JID l'iscrizione a questo nodo pubsub?"}.
+{"Allow users to change subject","Consentire agli utenti di cambiare l'oggetto"}.
{"Allow users to query other users","Consentire agli utenti query verso altri utenti"}.
{"Allow users to send invites","Consentire agli utenti l'invio di inviti"}.
{"Allow users to send private messages","Consentire agli utenti l'invio di messaggi privati"}.
@@ -24,7 +24,6 @@
{"All Users","Tutti gli utenti"}.
{"Announcements","Annunci"}.
{"anyone","tutti"}.
-{"A password is required to enter this room","Per entrare in questa stanza è prevista una password"}.
{"April","Aprile"}.
{"August","Agosto"}.
{"Backup Management","Gestione dei salvataggi"}.
@@ -45,9 +44,8 @@
{"Commands","Comandi"}.
{"Conference room does not exist","La stanza per conferenze non esiste"}.
{"Configuration","Configurazione"}.
-{"Configuration of room ~s","Configurazione per la stanza ~s"}.
+{"Configuration for ","Configurazione per "}.
{"Connected Resources:","Risorse connesse:"}.
-{"Connections parameters","Parametri delle connessioni"}.
{"Country","Paese"}.
{"CPU Time:","Tempo CPU:"}.
{"Database","Database"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","Modulo vCard per ejabberd"}.
{"ejabberd virtual hosts","Host virtuali di ejabberd"}.
{"ejabberd Web Admin","Amministrazione web ejabberd"}.
-{"Elements","Elementi"}.
{"Email","E-mail"}.
{"Enable logging","Abilitare i log"}.
-{"Encoding for server ~b","Codifica per il server ~b"}.
+{"Encodings","Codifiche"}.
{"End User Session","Terminare la sessione dell'utente"}.
{"Enter list of {Module, [Options]}","Immettere un elenco di {Modulo, [Opzioni]}"}.
{"Enter nickname you want to register","Immettere il nickname che si vuole registrare"}.
@@ -86,14 +83,9 @@
{"Enter path to jabberd14 spool dir","Immettere il percorso della directory di spool di jabberd14"}.
{"Enter path to jabberd14 spool file","Immettere il percorso del file di spool di jabberd14"}.
{"Enter path to text file","Immettere il percorso del file di testo"}.
-{"Enter the text you see","Immettere il testo visibile"}.
-{"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.","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."}.
-{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Immettere il nome utente, le codifiche, le porte e le password che si desidera utilizzare per la connessione ai server IRC"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Immettere il nome utente e le codifiche che si desidera utilizzare per la connessione ai server IRC"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
-{"Error","Errore"}.
-{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Esempio: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"segreto\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.serverdiprova.net\", \"utf-8\"}]."}.
-{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Esportare i dati di tutti gli utenti nel server in file PIEFXIS (XEP-0227):"}.
-{"Export data of users in a host to PIEFXIS files (XEP-0227):","Esportare i dati degli utenti di un host in file PIEFXIS (XEP-0227):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Esempio: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Cognome"}.
{"February","Febbraio"}.
{"Fill in fields to search for any matching Jabber User","Riempire i campi per la ricerca di utenti Jabber corrispondenti ai criteri"}.
@@ -116,13 +108,10 @@
{"has been kicked","è stata/o espulsa/o"}.
{" has set the subject to: "," ha modificato l'oggetto in: "}.
{"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 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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Se si vogliono specificare differenti codifiche per i server IRC, si riempa questo elenco con valori nel formato '{\"server IRC\", \"codifica\"}'. Per default questo servizio utilizza la codifica \"~s\"."}.
{"Import Directory","Importare una directory"}.
{"Import File","Importare un file"}.
-{"Import user data from jabberd14 spool file:","Importare i dati utente da file di spool di jabberd14:"}.
{"Import User from File at ","Importare un utente dal file "}.
-{"Import users data from a PIEFXIS file (XEP-0227):","Importare i dati utenti da un file PIEFXIS (XEP-0227):"}.
-{"Import users data from jabberd14 spool directory:","Importare i dati utenti da directory di spool di jabberd14:"}.
{"Import Users from Dir at ","Importare utenti dalla directory "}.
{"Import Users From jabberd14 Spool Files","Importare utenti da file di spool di jabberd14"}.
{"Improper message type","Tipo di messaggio non corretto"}.
@@ -130,24 +119,16 @@
{"Invalid affiliation: ~s","Affiliazione non valida: ~s"}.
{"Invalid role: ~s","Ruolo non valido: ~s"}.
{"IP addresses","Indirizzi IP"}.
-{"IP","IP"}.
-{"IRC channel (don't put the first #)","Canale IRC (senza il # iniziale)"}.
-{"IRC server","Server IRC"}.
-{"IRC settings","Impostazioni IRC"}.
{"IRC Transport","Transport IRC"}.
-{"IRC username","Nome utente IRC"}.
{"IRC Username","Nome utente IRC"}.
{"is now known as","è ora conosciuta/o come"}.
{"It is not allowed to send private messages","Non è consentito l'invio di messaggi privati"}.
{"It is not allowed to send private messages of type \"groupchat\"","Non è consentito l'invio di messaggi privati di tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Non è consentito l'invio di messaggi privati alla conferenza"}.
{"Jabber ID","Jabber ID (Jabber ID)"}.
-{"Jabber ID ~s is invalid","Il Jabber ID ~s non è valido"}.
{"January","Gennaio"}.
-{"Join IRC channel","Entra nel canale IRC"}.
+{"Jabber ID ~s is invalid","Il JID ~s non è valido"}.
{"joins the room","entra nella stanza"}.
-{"Join the IRC channel here.","Entra nel canale IRC qui."}.
-{"Join the IRC channel in this Jabber ID: ~s","Entra nel canale IRC in questo ID Jabber: ~s"}.
{"July","Luglio"}.
{"June","Giugno"}.
{"Last Activity","Ultima attività"}.
@@ -160,7 +141,6 @@
{"List of modules to start","Elenco dei moduli da avviare"}.
{"Low level update script","Script di aggiornamento di basso livello"}.
{"Make participants list public","Rendere pubblica la lista dei partecipanti"}.
-{"Make room captcha protected","Rendere la stanza protetta da captcha"}.
{"Make room members-only","Rendere la stanza riservata ai membri"}.
{"Make room moderated","Rendere la stanza moderata"}.
{"Make room password protected","Rendere la stanza protetta da password"}.
@@ -171,14 +151,13 @@
{"Max # of items to persist","Numero massimo di elementi da conservare persistentemente"}.
{"Max payload size in bytes","Dimensione massima del contenuto del messaggio in byte"}.
{"May","Maggio"}.
-{"Membership is required to enter this room","Per entrare in questa stanza è necessario essere membro"}.
+{"Membership required to enter this room","Per entrare in questa stanza è necessario essere membro"}.
{"Members:","Membri:"}.
{"Memory","Memoria"}.
{"Message body","Corpo del messaggio"}.
{"Middle Name","Altro nome"}.
{"Moderator privileges required","Necessari i privilegi di moderatore"}.
{"moderators only","moderatori soltanto"}.
-{"Modified modules","Moduli modificati"}.
{"Module","Modulo"}.
{"Modules at ","Moduli su "}.
{"Modules","Moduli"}.
@@ -186,6 +165,8 @@
{"Name:","Nome:"}.
{"Name","Nome"}.
{"Never","Mai"}.
+{"Nickname is already in use by another occupant","Il nickname è già in uso all'interno della conferenza"}.
+{"Nickname is registered by another person","Il nickname è registrato da un'altra persona"}.
{"Nickname","Nickname"}.
{"Nickname Registration at ","Registrazione di un nickname su "}.
{"Nickname ~s does not exist in the room","Il nickname ~s non esiste nella stanza"}.
@@ -198,7 +179,6 @@
{"No limit","Nessun limite"}.
{"None","Nessuno"}.
{"No resource provided","Nessuna risorsa fornita"}.
-{"Not Found","Non trovato"}.
{"Notify subscribers when items are removed from the node","Notificare gli iscritti quando sono eliminati degli elementi dal nodo"}.
{"Notify subscribers when the node configuration changes","Notificare gli iscritti quando la configurazione del nodo cambia"}.
{"Notify subscribers when the node is deleted","Notificare gli iscritti quando il nodo è cancellato"}.
@@ -214,8 +194,8 @@
{"Online Users:","Utenti connessi:"}.
{"Online Users","Utenti online"}.
{"Only deliver notifications to available users","Inviare le notifiche solamente agli utenti disponibili"}.
-{"Only moderators and participants are allowed to change the subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori e ai partecipanti"}.
-{"Only moderators are allowed to change the subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori"}.
+{"Only moderators and participants are allowed to change subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori e ai partecipanti"}.
+{"Only moderators are allowed to change subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori"}.
{"Only occupants are allowed to send messages to the conference","L'invio di messaggi alla conferenza è consentito soltanto ai presenti"}.
{"Only occupants are allowed to send queries to the conference","L'invio di query alla conferenza è consentito ai soli presenti"}.
{"Only service administrators are allowed to send service messages","L'invio di messaggi di servizio è consentito solamente agli amministratori del servizio"}.
@@ -227,9 +207,9 @@
{"Outgoing s2s Servers:","Server s2s in uscita"}.
{"Owner privileges required","Necessari i privilegi di proprietario"}.
{"Packet","Pacchetto"}.
-{"Password ~b","Password ~b"}.
{"Password:","Password:"}.
{"Password","Password"}.
+{"Password required to enter this room","Per entrare in questa stanza è prevista una password"}.
{"Password Verification","Verifica della password"}.
{"Path to Dir","Percorso della directory"}.
{"Path to File","Percorso del file"}.
@@ -237,26 +217,24 @@
{"Period: ","Periodo:"}.
{"Persist items to storage","Conservazione persistente degli elementi"}.
{"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.","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."}.
{"Pong","Pong"}.
-{"Port ~b","Porta ~b"}.
{"Port","Porta"}.
-{"Present real Jabber IDs to","Rendere visibile il Jabber ID reale a"}.
+{"Present real Jabber IDs to","Rendere visibile il JID reale a"}.
{"private, ","privato, "}.
-{"Protocol","Protocollo"}.
{"Publish-Subscribe","Pubblicazione-Iscrizione"}.
{"PubSub subscriber request","Richiesta di iscrizione per PubSub"}.
{"Queries to the conference members are not allowed in this room","In questa stanza non sono consentite query ai membri della conferenza"}.
{"RAM and disc copy","Copia in memoria (RAM) e su disco"}.
{"RAM copy","Copia in memoria (RAM)"}.
+{"(Raw)","(Grezzo)"}.
{"Raw","Grezzo"}.
{"Really delete message of the day?","Si conferma l'eliminazione del messaggio del giorno (MOTD)?"}.
{"Recipient is not in the conference room","Il destinatario non è nella stanza per conferenze"}.
{"Registered Users:","Utenti registrati:"}.
{"Registered Users","Utenti registrati"}.
{"Registration in mod_irc for ","Registrazione in mod_irc per "}.
+{"Remark 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.","N.B.: Queste opzioni comportano il salvataggio solamente del database interno Mnesia. Se si sta utilizzando il modulo ODBC, è necessario salvare il proprio database SQL separatamente."}.
{"Remote copy","Copia remota"}.
-{"Remove All Offline Messages","Eliminare tutti i messaggi offline"}.
{"Remove","Eliminare"}.
{"Remove User","Eliminare l'utente"}.
{"Replaced by new connection","Sostituito da una nuova connessione"}.
@@ -270,8 +248,6 @@
{"Restore","Recuperare"}.
{"Room Configuration","Configurazione della stanza"}.
{"Room creation is denied by service policy","La creazione di stanze è impedita dalle politiche del servizio"}.
-{"Room description","Descrizione della stanza"}.
-{"Room Occupants","Presenti nella stanza"}.
{"Room title","Titolo della stanza"}.
{"Roster groups allowed to subscribe","Gruppi roster abilitati alla registrazione"}.
{"Roster","Lista dei contatti"}.
@@ -289,7 +265,6 @@
{"Send announcement to all users","Inviare l'annuncio a tutti gli utenti"}.
{"Send announcement to all users on all hosts","Inviare l'annuncio a tutti gli utenti su tutti gli host"}.
{"September","Settembre"}.
-{"Server ~b","Server ~b"}.
{"Set message of the day and send to online users","Impostare il messaggio del giorno (MOTD) ed inviarlo agli utenti online"}.
{"Set message of the day on all hosts and send to online users","Impostare il messaggio del giorno (MOTD) su tutti gli host e inviarlo agli utenti online"}.
{"Shared Roster Groups","Gruppi di liste di contatti comuni"}.
@@ -297,6 +272,8 @@
{"Show Ordinary Table","Mostrare la tabella normale"}.
{"Shut Down Service","Terminare il servizio"}.
{"~s invites you to the room ~s","~s ti invita nella stanza ~s"}.
+{"Size","Dimensione"}.
+{"Specified nickname is already registered","Il nickname specificato è già registrato"}.
{"Specify the access model","Specificare il modello di accesso"}.
{"Specify the publisher model","Definire il modello di pubblicazione"}.
{"~s's Offline Messages Queue","Coda di ~s messaggi offline"}.
@@ -318,10 +295,6 @@
{"Subscriber Address","Indirizzo dell'iscritta/o"}.
{"Subscription","Iscrizione"}.
{"Sunday","Domenica"}.
-{"That nickname is already in use by another occupant","Il nickname è già in uso all'interno della conferenza"}.
-{"That nickname is registered by another person","Questo nickname è registrato da un'altra persona"}.
-{"The captcha is valid.","Il captcha è valido."}.
-{"The collections with which a node is affiliated","Le collezioni a cui è affiliato un nodo"}.
{"the password is","la password è"}.
{"This participant is kicked from the room because he sent an error message","Partecipante espulso dalla stanza perché ha inviato un messaggio non valido"}.
{"This participant is kicked from the room because he sent an error message to another participant","Partecipante espulso dalla stanza perché ha inviato un messaggio non valido a un altro partecipante"}.
@@ -338,10 +311,9 @@
{"Transactions Logged:","Transazioni con log:"}.
{"Transactions Restarted:","Transazioni riavviate:"}.
{"Tuesday","Martedì"}.
-{"Unable to generate a captcha","Impossibile generare un captcha"}.
-{"Unauthorized","Non autorizzato"}.
{"Update ","Aggiornare "}.
{"Update","Aggiornare"}.
+{"Updated modules","Moduli aggiornati"}.
{"Update message of the day (don't send)","Aggiornare il messaggio del giorno (MOTD) (non inviarlo)"}.
{"Update message of the day on all hosts (don't send)","Aggiornare il messaggio del giorno (MOTD) su tutti gli host (non inviarlo)"}.
{"Update plan","Piano di aggiornamento"}.
@@ -349,13 +321,14 @@
{"Uptime:","Tempo dall'avvio:"}.
{"Use of STARTTLS required","Utilizzo di STARTTLS obbligatorio"}.
{"User Management","Gestione degli utenti"}.
-{"Users are not allowed to register accounts so quickly","Non è consentito agli utenti registrare account così rapidamente"}.
+{"Users are not allowed to register accounts so fast","Non è consentito agli utenti registrare account così rapidamente"}.
{"Users Last Activity","Ultima attività degli utenti"}.
{"Users","Utenti"}.
{"User ","Utente "}.
{"User","Utente"}.
{"Validate","Validare"}.
{"vCard User Search","Ricerca di utenti per vCard"}.
+{"Virtual Hosts","Host virtuali"}.
{"Visitors are not allowed to change their nicknames in this room","Non è consentito ai visitatori cambiare il nickname in questa stanza"}.
{"Visitors are not allowed to send messages to all occupants","Non è consentito ai visitatori l'invio di messaggi a tutti i presenti"}.
{"Wednesday","Mercoledì"}.
@@ -365,7 +338,6 @@
{"You must fill in field \"Nickname\" in the form","Si deve riempire il campo \"Nickname\" nel modulo"}.
{"You need an x:data capable client to configure mod_irc settings","Per la configurazione del modulo IRC è necessario un client che supporti x:data"}.
{"You need an x:data capable client to configure room","Per la configurazione della stanza è necessario un client che supporti x:data"}.
-{"You need an x:data capable client to register nickname","Per registrare un nickname è necessario un client che supportix:data"}.
+{"You need an x:data capable client to register nickname","Per registrare un nickname è necessario un client che supporti x:data"}.
{"You need an x:data capable client to search","Per effettuare ricerche è necessario un client che supporti x:data"}.
{"Your contact offline message queue is full. The message has been discarded.","La coda dei messaggi offline del contatto è piena. Il messaggio è stato scartato"}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","I messaggi verso ~s sono bloccati. Per sbloccarli, visitare ~s"}.
diff --git a/src/msgs/it.po b/src/msgs/it.po
index f4e6da1ff..fd3dc6296 100644
--- a/src/msgs/it.po
+++ b/src/msgs/it.po
@@ -6,33 +6,20 @@ msgstr ""
"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"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Utilizzo di STARTTLS obbligatorio"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Nessuna risorsa fornita"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Sostituito da una nuova connessione"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Immettere il testo visibile"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -49,11 +36,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Si conferma l'eliminazione del messaggio del giorno (MOTD)?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Oggetto"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Corpo del messaggio"
@@ -77,7 +64,7 @@ msgstr "Inviare l'annuncio a tutti gli utenti su tutti gli host"
msgid "Send announcement to all online users"
msgstr "Inviare l'annuncio a tutti gli utenti online"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Inviare l'annuncio a tutti gli utenti online su tutti gli host"
@@ -110,627 +97,570 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Configurazione"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Database"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Avviare moduli"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Arrestare moduli"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Salvare"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Recuperare"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Trascrivere su file di testo"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importare un file"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importare una directory"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Riavviare il servizio"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Terminare il servizio"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Aggiungere un utente"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Eliminare l'utente"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Terminare la sessione dell'utente"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Ottenere la password dell'utente"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Cambiare la password dell'utente"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Ottenere la data di ultimo accesso dell'utente"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Ottenere le statistiche dell'utente"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Ottenere il numero di utenti registrati"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Ottenere il numero di utenti online"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Diritti di accesso (ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Regole di accesso"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Gestione degli utenti"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Utenti online"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Tutti gli utenti"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Connessioni s2s in uscita"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nodi attivi"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nodi arrestati"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Moduli"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Gestione dei salvataggi"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importare utenti da file di spool di jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "A ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Da ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Configurazione delle tabelle del database su "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Selezionare una modalità di conservazione delle tabelle"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Copia su disco soltanto"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Copia in memoria (RAM) e su disco"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Copia in memoria (RAM)"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Copia remota"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Arrestare moduli su "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Selezionare i moduli da arrestare"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Avviare moduli su "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Immettere un elenco di {Modulo, [Opzioni]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Elenco dei moduli da avviare"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Salvataggio sul file "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Immettere il percorso del file di salvataggio"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Percorso del file"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Recuperare il salvataggio dal file "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Trascrivere il salvataggio sul file di testo "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Immettere il percorso del file di testo"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importare un utente dal file "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Immettere il percorso del file di spool di jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importare utenti dalla directory "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Immettere il percorso della directory di spool di jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Percorso della directory"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Ritardo"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Configurazione dei diritti di accesso (ACL)"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Diritti di accesso (ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Configurazione dell'accesso"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Regole di accesso"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID (Jabber ID)"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Password"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Verifica della password"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Numero di utenti registrati"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Numero di utenti online"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Mai"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Online"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Ultimo accesso"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Dimensione della lista dei contatti"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Indirizzi IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Risorse"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Amministrazione di "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Azione sull'utente"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Modificare le proprietà"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Eliminare l'utente"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Accesso impedito dalle politiche del servizio"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Transport IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Modulo IRC per ejabberd"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registrazione in mod_irc per "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Immettere il nome utente e le codifiche che si desidera utilizzare per la "
+"connessione ai server IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nome utente IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"Se si vogliono specificare differenti codifiche per i server IRC, si riempa "
+"questo elenco con valori nel formato '{\"server IRC\", \"codifica\"}'. Per "
+"default questo servizio utilizza la codifica \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Esempio: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"segreto\"}, {\"vendetta."
-"fef.net\", \"iso8859-1\", 7000}, {\"irc.serverdiprova.net\", \"utf-8\"}]."
+"Esempio: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Parametri delle connessioni"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Codifiche"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Entra nel canale IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Canale IRC (senza il # iniziale)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Server IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Entra nel canale IRC qui."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "Impostazioni IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Nome utente IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Password ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Porta ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Codifica per il server ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Server ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "La creazione di stanze è impedita dalle politiche del servizio"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "La stanza per conferenze non esiste"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Stanze"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
-msgstr "Per registrare un nickname è necessario un client che supportix:data"
+msgstr "Per registrare un nickname è necessario un client che supporti x:data"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registrazione di un nickname su "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Immettere il nickname che si vuole registrare"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Nickname"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Questo nickname è registrato da un'altra persona"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Il nickname specificato è già registrato"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Si deve riempire il campo \"Nickname\" nel modulo"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Modulo MUC per ejabberd"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Configurazione della stanza modificata"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "entra nella stanza"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "esce dalla stanza"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "è stata/o bandita/o"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "è stata/o espulsa/o"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "è stato espulso a causa dello spegnimento del sistema"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "è ora conosciuta/o come"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " ha modificato l'oggetto in: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Lunedì"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Martedì"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Mercoledì"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Giovedì"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Venerdì"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Sabato"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Domenica"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Gennaio"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Febbraio"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Marzo"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Aprile"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Maggio"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Giugno"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Luglio"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Agosto"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Settembre"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Ottobre"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Novembre"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Dicembre"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Configurazione della stanza"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Presenti nella stanza"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Titolo della stanza"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Limite di traffico superato"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Tipo di messaggio non corretto"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -738,497 +668,484 @@ msgstr ""
"Partecipante espulso dalla stanza perché ha inviato un messaggio non valido "
"a un altro partecipante"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Il destinatario non è nella stanza per conferenze"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Non è consentito l'invio di messaggi privati"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privato, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change 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:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr ""
"La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr "Il nickname è già in uso all'interno della conferenza"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Il nickname è registrato da un'altra persona"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Sei stata/o bandita/o da questa stanza"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Per entrare in questa stanza è necessario essere membro"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Questa stanza non è anonima"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Per entrare in questa stanza è prevista una password"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Impossibile generare un captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Password non esatta"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Necessari i privilegi di amministratore"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Necessari i privilegi di moderatore"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Il Jabber ID ~s non è valido"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Il nickname ~s non esiste nella stanza"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Affiliazione non valida: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Ruolo non valido: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Necessari i privilegi di proprietario"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Configurazione per la stanza ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Configurazione per "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Descrizione della stanza"
+msgstr "Descrizione:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Rendere la stanza persistente"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Rendere la sala visibile al pubblico"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Rendere pubblica la lista dei partecipanti"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Rendere la stanza protetta da password"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Numero massimo di occupanti"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Nessun limite"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Rendere visibile il Jabber ID reale a"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "moderatori soltanto"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "tutti"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Rendere la stanza riservata ai membri"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Rendere la stanza moderata"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Definire per default gli utenti come partecipanti"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Consentire agli utenti di cambiare l'oggetto"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Consentire agli utenti l'invio di messaggi privati"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Consentire agli utenti query verso altri utenti"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Consentire agli utenti l'invio di inviti"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Consentire ai visitatori di cambiare il nickname"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Rendere la stanza protetta da captcha"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Abilitare i log"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Numero di presenti"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s ti invita nella stanza ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "la password è"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "Coda di ~s messaggi offline"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Inviato"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Ora"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Da"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "A"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Pacchetto"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Eliminare gli elementi selezionati"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Messaggi offline:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Eliminare tutti i messaggi offline"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Modulo SOCKS5 Bytestreams per ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Pubblicazione-Iscrizione"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Modulo Pubblicazione/Iscrizione (PubSub) per ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Richiesta di iscrizione per PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Scegliere se approvare l'iscrizione per questa entità"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID del nodo"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Indirizzo dell'iscritta/o"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Inviare il contenuto del messaggio con la notifica dell'evento"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Inviare notifiche degli eventi"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificare gli iscritti quando la configurazione del nodo cambia"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Notificare gli iscritti quando il nodo è cancellato"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Conservazione persistente degli elementi"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Un nome comodo per il nodo"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Numero massimo di elementi da conservare persistentemente"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Consentire iscrizioni?"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Specificare il modello di accesso"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Gruppi roster abilitati alla registrazione"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Definire il modello di pubblicazione"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Dimensione massima del contenuto del messaggio in byte"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Quando inviare l'ultimo elemento pubblicato"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Inviare le notifiche solamente agli utenti disponibili"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Le collezioni a cui è affiliato un nodo"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Non è consentito agli utenti registrare account così rapidamente"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Nessuno"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Iscrizione"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Pendente"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Gruppi"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validare"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Eliminare"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Lista dei contatti di "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Formato non valido"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Aggiungere un Jabber ID (Jabber ID)"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Lista dei contatti"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Gruppi di liste di contatti comuni"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Aggiungere nuovo"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Nome:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Descrizione:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Membri:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Gruppi visualizzati:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Gruppo "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Inviare"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Compleanno"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Città"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Paese"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "E-mail"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Cognome"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1236,382 +1153,354 @@ 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Nome completo"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Altro nome"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nome"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Nome dell'organizzazione"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unità dell'organizzazione"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Cercare utenti in "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Utente"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "Per effettuare ricerche è necessario un client che supporti x:data"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Ricerca di utenti per vCard"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Modulo vCard per ejabberd"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Risultati della ricerca per "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Non autorizzato"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Amministrazione web ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Amministrazione"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Grezzo"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Host virtuali"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Configurazione delle regole di accesso per ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Host virtuali di ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Utenti"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Ultima attività degli utenti"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Periodo:"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Ultimo mese"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Ultimo anno"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Tutta l'attività"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Mostrare la tabella normale"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Mostrare la tabella integrale"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistiche"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Non trovato"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Nodo non trovato"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Host"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Utenti registrati"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Messaggi offline"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Ultima attività"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Utenti registrati:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Utenti connessi:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Connessioni s2s in uscita:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Server s2s in uscita"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Modificare la password"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Utente "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Risorse connesse:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Password:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Nessuna informazione"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nodi"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistiche"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Utenti"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Ultima attività"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Grezzo)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Grezzo"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Configurazione delle regole di accesso per ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Host virtuali di ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Ultima attività degli utenti"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Periodo:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Ultimo mese"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Ultimo anno"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Tutta l'attività"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Mostrare la tabella normale"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Mostrare la tabella integrale"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Nodo non trovato"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Host"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Utenti registrati"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Messaggi offline"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Utenti registrati:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Utenti connessi:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Connessioni s2s in uscita:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Server s2s in uscita"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Modificare la password"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Utente "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Risorse connesse:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Password:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Nessuna informazione"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nodo "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Porte in ascolto"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Aggiornare"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Riavviare"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Arrestare"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Errore di chiamata RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Tabelle del database su "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Tipo di conservazione"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementi"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Dimensione"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memoria"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Errore"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Salvataggio di "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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."
+"il proprio database SQL separatamente."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Conservare un salvataggio binario:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Recuperare un salvataggio binario adesso:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Conservare un salvataggio come semplice testo:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Recuperare un salvataggio come semplice testo adesso:"
-#: web/ejabberd_web_admin.erl:1999
-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:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importare i dati utente da file di spool di jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importare i dati utenti da directory di spool di jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Porte in ascolto su "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Moduli su "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistiche di ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Tempo dall'avvio:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Tempo CPU:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transazioni avvenute:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transazioni abortite:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transazioni riavviate:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transazioni con log:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Aggiornare "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Piano di aggiornamento"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Moduli modificati"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Moduli aggiornati"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Script di aggiornamento"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Script di aggiornamento di basso livello"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Verifica dello script"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Porta"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protocollo"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modulo"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opzioni"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Eliminare"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Avviare"
diff --git a/src/msgs/ja.msg b/src/msgs/ja.msg
index d4936f2de..ba05d8d1a 100644
--- a/src/msgs/ja.msg
+++ b/src/msgs/ja.msg
@@ -14,8 +14,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","この JID をこの pubsubノードへ購読することを許可しますか?"}.
+{"Allow users to change subject","ユーザーによる件名の変更を許可する"}.
{"Allow users to query other users","ユーザーによる他のユーザーへの問い合わせを許可する"}.
{"Allow users to send invites","ユーザーによる招待を許可する"}.
{"Allow users to send private messages","ユーザーによるプライベートメッセージの送信を許可する"}.
@@ -24,7 +24,6 @@
{"All Users","全ユーザー"}.
{"Announcements","アナウンス"}.
{"anyone","誰でも"}.
-{"A password is required to enter this room","チャットルームに入るにはパスワードが必要です"}.
{"April","4月"}.
{"August","8月"}.
{"Backup","バックアップ"}.
@@ -44,10 +43,9 @@
{"City","都道府県"}.
{"Commands","コマンド"}.
{"Conference room does not exist","カンファレンスルームは存在しません"}.
-{"Configuration of room ~s","チャットルーム ~s の設定"}.
+{"Configuration for ","設定: "}.
{"Configuration","設定"}.
{"Connected Resources:","接続リソース:"}.
-{"Connections parameters","接続パラメータ"}.
{"Country","国"}.
{"CPU Time:","CPU時間:"}.
{"Database","データーベース"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard module"}.
{"ejabberd virtual hosts","ejabberd ヴァーチャルホスト"}.
{"ejabberd Web Admin","ejabberd Web 管理"}.
-{"Elements","要素"}.
{"Email","メールアドレス"}.
{"Enable logging","ロギングを有効にする"}.
-{"Encoding for server ~b","サーバーのエンコーディング ~b"}.
+{"Encodings","エンコーディング"}.
{"End User Session","エンドユーザーセッション"}.
{"Enter list of {Module, [Options]}","{モジュール, [オプション]}のリストを入力して下さい"}.
{"Enter nickname you want to register","登録するニックネームを入力して下さい"}.
@@ -86,14 +83,9 @@
{"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サーバーに接続先する為に、使用するユーザー名、文字エンコーディング、ポート、パスワードを入力して下さい"}.
+{"Enter username and encodings 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","例: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","姓"}.
{"February","2月"}.
{"Fill in fields to search for any matching Jabber User","項目を埋めて Jabber User を検索して下さい"}.
@@ -116,13 +108,10 @@
{"has been kicked because the room has been changed to members-only","はチャットルームのメンバー制限によりキックされました"}.
{" has set the subject to: "," は件名を設定しました: "}.
{"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.","別のポートやパスワード、文字エンコーディングを使用したい場合、'{\"irc server\", \"encoding\", port, \"password\"}' という形式のリストを入力して下さい。デフォルトでエンコーディングは \"~s\" を使用し、ポートは ~p、パスワードは空になっています。"}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","別の文字エンコーディングを使用したい場合、'{\"irc server\", \"encoding\"}' という形式のリストを入力して下さい。デフォルトで \"~s\" を使用します"}.
{"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","誤ったメッセージタイプです"}.
@@ -130,24 +119,16 @@
{"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 ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s は無効です"}.
{"January","1月"}.
-{"Join IRC channel","IRCチャンネルに参加"}.
+{"Jabber ID ~s is invalid","JID ~s は無効です"}.
{"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","活動履歴"}.
@@ -155,12 +136,11 @@
{"Last month","先月"}.
{"Last year","去年"}.
{"leaves the room","チャットルームから退出"}.
-{"Listened Ports at ","Listen ポート "}.
+{"Listened Ports at ","Listen ポート: "}.
{"Listened Ports","Listenポート"}.
{"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","チャットルームにパスワードを設定します"}.
@@ -172,33 +152,33 @@
{"Max payload size in bytes","最大ぺイロードサイズ(byte)"}.
{"May","5月"}.
{"Members:","メンバー:"}.
-{"Membership is required to enter this room","チャットルームに入るにはメンバーでなければなりません"}.
+{"Membership required to enter this room","チャットルームに入るにはメンバーでなければなりません"}.
{"Memory","メモリ"}.
{"Message body","本文"}.
{"Middle Name","ミドルネーム"}.
{"Moderator privileges required","モデレーター権限が必要です"}.
{"moderators only","モデレーターのみ"}.
-{"Modified modules","モジュールを変更しました"}.
{"Module","モジュール"}.
{"Modules","モジュール"}.
-{"Modules at ","モジュール "}.
+{"Modules at ","モジュール: "}.
{"Monday","月曜日"}.
{"Name","名"}.
{"Name:","名前: "}.
{"Never","無し"}.
{"Nickname","ニックネーム"}.
+{"Nickname is already in use by another occupant","ニックネームは既に他の移住者によって使用されています"}.
+{"Nickname is registered by another person","ニックネームは他の人によって登録されています"}.
{"Nickname Registration at ","ニックネーム登録: "}.
{"Nickname ~s does not exist in the room","ニックネーム ~s はこのチャットルームに居ません"}.
{"No body provided for announce message","アナウンスメッセージはありませんでした"}.
{"No Data","データ無し"}.
-{"Node ","ノード "}.
+{"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","ノードが削除された時に購読者へ通知します"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","モデレーターと参加者のみがチャットルームの件名を変更出来ます"}.
+{"Only moderators are allowed to change 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","カービス管理者のみがサービスメッセージを送信出来ます"}.
@@ -229,7 +209,7 @@
{"Packet","パケット"}.
{"Password:","パスワード"}.
{"Password","パスワード"}.
-{"Password ~b","パスワード ~b"}.
+{"Password required to enter this room","チャットルームに入るにはパスワードが必要です"}.
{"Password Verification","パスワード(確認)"}.
{"Path to Dir","ディレクトリのパス"}.
{"Path to File","ファイルパス"}.
@@ -237,26 +217,24 @@
{"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データーベースのバックアップを別に行う必要があります。"}.
{"Pong","Pong"}.
{"Port","ポート"}.
-{"Port ~b","ポート ~b"}.
-{"Present real Jabber IDs to","本当の Jabber ID を公開する"}.
+{"Present real Jabber IDs to","本当の JID を公開する"}.
{"private, ","プライベート"}.
-{"Protocol","プロトコル"}.
{"Publish-Subscribe","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)","(Raw)"}.
{"Raw","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 での登録: "}.
+{"Remark 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データーベースのバックアップを別に行う必要があります。"}.
{"Remote copy","リモートコピー"}.
-{"Remove All Offline Messages","すべてのオフラインメッセージを削除します"}.
{"Remove User","ユーザーの削除"}.
{"Remove","削除"}.
{"Replaced by new connection","新しいコネクションによって置き換えられました"}.
@@ -270,8 +248,6 @@
{"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 ","名簿: "}.
@@ -289,7 +265,6 @@
{"Send announcement to all users on all hosts","アナウンスを全ホストのユーザーに送信"}.
{"Send announcement to all users","アナウンスを全てのユーザーに送信"}.
{"September","9月"}.
-{"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","共有名簿グループ"}.
@@ -297,6 +272,8 @@
{"Show Ordinary Table","Ordinaryテーブルを表示"}.
{"Shut Down Service","サービスを停止"}.
{"~s invites you to the room ~s","~s はあなたをチャットルーム ~s に招待しています"}.
+{"Size","サイズ"}.
+{"Specified nickname is already registered","指定されたニックネームは既に登録されています"}.
{"Specify the access model","アクセスモデルを設定する"}.
{"Specify the publisher model","公開モデルを指定する"}.
{"~s's Offline Messages Queue","~s's オフラインメッセージキュー"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","提携されたノードの集合です"}.
{"the password is","パスワードは"}.
{"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","エラーメッセージを送信したため、この参加者はキックされました"}.
@@ -338,8 +311,7 @@
{"Transactions Logged:","トランザクションのログ: "}.
{"Transactions Restarted:","トランザクションの再起動:"}.
{"Tuesday","火曜日"}.
-{"Unable to generate a captcha","チャプタを生成することが出来ません。"}.
-{"Unauthorized","認証されていません"}.
+{"Updated modules","モジュールを更新しました"}.
{"Update message of the day (don't send)","お知らせメッセージを更新する(送信しない)"}.
{"Update message of the day on all hosts (don't send)","全ホストのお知らせメッセージを更新する"}.
{"Update plan","更新計画"}.
@@ -352,10 +324,11 @@
{"User","ユーザー"}.
{"User Management","ユーザー管理"}.
{"Users","ユーザー"}.
-{"Users are not allowed to register accounts so quickly","早すぎるユーザーアカウント登録は許可されていません"}.
+{"Users are not allowed to register accounts so fast","早すぎるユーザーアカウント登録は許可されませんでした"}.
{"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","ビジターが移住者ににメッセージを送ることは許可されていません"}.
{"Wednesday","水曜日"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","ニックネームを登録するにはクライアントが 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.","宛先のオフラインメッセージキューが一杯です。このメッセージは破棄されます。"}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","~s 宛のメッセージはブロックされています、解除するためにはこちらを見てください ~s"}.
diff --git a/src/msgs/ja.po b/src/msgs/ja.po
index e64e9598d..4fcc1476c 100644
--- a/src/msgs/ja.po
+++ b/src/msgs/ja.po
@@ -7,32 +7,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Japanese (日本語)\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "STARTTLS を使用"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "リソースが提供されませんでした"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "新しいコネクションによって置き換えられました"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "見えているテキストを入力してください"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-"~s 宛のメッセージはブロックされています、解除するためにはこちらを見てくださ"
-"い ~s"
-
-#: ejabberd_captcha.erl:235
-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 "コマンド"
@@ -49,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "本当にお知らせメッセージを削除しますか?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "件名"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "本文"
@@ -77,7 +63,7 @@ msgstr "アナウンスを全ホストのユーザーに送信"
msgid "Send announcement to all online users"
msgstr "アナウンスを全てのオンラインユーザーに送信"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "全ホストのオンラインユーザへアナウンスを送信"
@@ -106,1115 +92,1041 @@ msgid "Delete message of the day on all hosts"
msgstr "全ホストのお知らせメッセージを削除する"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "設定"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "データーベース"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "モジュールの起動"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "モジュールの停止"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "バックアップ"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "リストア"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "テキストファイルに出力"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "ファイルかインポート"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "ディレクトリインポート"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "サービスを再起動"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "サービスを停止"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "ユーザーを追加"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "ユーザを削除"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "エンドユーザーセッション"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "パスワードを取得"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "パスワードを変更"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "最終ログイン時間の取得"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "ユーザー統計の取得"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "登録ユーザー数を取得"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "登録ユーザーを取得"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "アクセスコントロールリスト"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "アクセスルール"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "ユーザー管理"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "オンラインユーザー"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "全ユーザー"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "外向き s2s コネクション"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "起動ノード"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "停止ノード"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "モジュール"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "バックアップ管理"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "jabberd14 Spool ファイルからユーザーをインポート"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "宛先 ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "差出人 ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "データーベーステーブル設定 "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "テーブルのストレージタイプの選択"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "ディスクだけのコピー"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "RAM, ディスクコピー"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "RAMコピー"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "リモートコピー"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "モジュールの停止 "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "停止するモジュールの選択"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "モジュールの開始"
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "{モジュール, [オプション]}のリストを入力して下さい"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "起動モジュールの一覧"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "ファイルにバックアップ"
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "バックアップファイルのパスを入力して下さい"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "ファイルパス"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "ファイルからバックアップをリストア"
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "テキストファイルにバックアップ"
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "テキストファイルのパスを入力して下さい"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "ファイルからユーザーをインポート"
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "jabberd14 spool ファイルのパスを入力して下さい"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "ディレクトリからユーザーをインポート"
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "jabberd14 spool ディレクトリのパスを入力して下さい"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "ディレクトリのパス"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "遅延時間"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "アクセスコントロールリスト設定"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "アクセスコントロールリスト"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "アクセス設定"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "アクセスルール"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "パスワード"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "パスワード(確認)"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "登録ユーザー数"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "オンラインユーザー数"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "無し"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "オンライン"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "最終ログイン"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "名簿サイズ"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IPアドレス"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "リソース"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "管理: "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "ユーザー操作"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "プロパティの編集"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "ユーザーの削除"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "サービスポリシーによってアクセスが禁止されました"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC トランスポート"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC module"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "mod_irc の設定にはクライアントが x:data をサポートする必要があります"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "mod_irc での登録: "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-"IRCサーバーに接続先する為に、使用するユーザー名、文字エンコーディング、ポー"
-"ト、パスワードを入力して下さい"
+"IRCサーバーに接続先する為のユーザー名と文字エンコーディングを入力して下さい"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRCユーザー名"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"別のポートやパスワード、文字エンコーディングを使用したい場合、'{\"irc server"
-"\", \"encoding\", port, \"password\"}' という形式のリストを入力して下さい。デ"
-"フォルトでエンコーディングは \"~s\" を使用し、ポートは ~p、パスワードは空に"
-"なっています。"
+"別の文字エンコーディングを使用したい場合、'{\"irc server\", \"encoding\"}' と"
+"いう形式のリストを入力して下さい。デフォルトで \"~s\" を使用します"
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"例: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net"
-"\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"例: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "接続パラメータ"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "エンコーディング"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "IRCチャンネルに参加"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRCチャンネル(先頭に#は不要)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRCサーバー"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "このIRCチャンネルに参加"
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "Jabber ID: ~s でIRCチャンネルに参加"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "IRC設定"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRCユーザー名"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "パスワード ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "ポート ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "サーバーのエンコーディング ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "サーバー ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "カービス管理者のみがサービスメッセージを送信出来ます"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "サービスポリシーにっよってチャットルームの作成が禁止されています"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "カンファレンスルームは存在しません"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "チャットルーム"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"ニックネームを登録するにはクライアントが x:data をサポートする必要があります"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "ニックネーム登録: "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "登録するニックネームを入力して下さい"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "ニックネーム"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "ニックネームは他の人によって登録されています"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "指定されたニックネームは既に登録されています"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "フォームの\"ニックネーム\"フィールドを入力する必要があります"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC module"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "チャットルームの設定を変更しました"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "チャットルームに参加"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "チャットルームから退出"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "はバンされました"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "はキックされました"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "は提携が変更されたためキックされました"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr "はチャットルームのメンバー制限によりキックされました"
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "はシステムシャットダウンのためキックされました"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "は名前を変更しました: "
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " は件名を設定しました: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "月曜日"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "火曜日"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "水曜日"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "木曜日"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "金曜日"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "土曜日"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "日曜日"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "1月"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "2月"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "3月"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "4月"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "5月"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "6月"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "7月"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "8月"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "9月"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "10月"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "11月"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "12月"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "チャットルーム設定"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "居住者の数"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "チャットルームタイトル"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "トラフィックレートの制限を超えました"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr "エラーメッセージを送信したため、この参加者はキックされました"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "カンファレンスルームにプライベートメッセージを送信することは出来ません"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "誤ったメッセージタイプです"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"他の参加者にエラーメッセージを送信したため、この参加者はキックされました"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "種別が\"groupchat\" であるプライベートメッセージは許可されていません"
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "受信者がカンファレンスルームに居ません"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
msgstr "移住者のみがカンファレンスに"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "プライベートメッセージを送信することは許可されませんでした"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "移住者のみがカンファレンスにクエリーを送信出来ます"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
"このチャットルームではカンファレンスメンバーへのクエリーは禁止されています"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "プライベート"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
-msgstr ""
-"モデレーターと参加者のみがチャットルームの件名を変更する事を許可されています"
+"Only moderators and participants are allowed to change subject in this room"
+msgstr "モデレーターと参加者のみがチャットルームの件名を変更出来ます"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "モデレーターのみがチャットルームの件名を変更出来ます"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "ビジターが移住者ににメッセージを送ることは許可されていません"
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr "エラープレゼンスを送信したため、この参加者はキックされました"
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr ""
"ビジターはこのチャットルームでニックネームを変更することは許可されていません"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr "ニックネームは既に他の移住者によって使用されています"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "ニックネームは他の人によって登録されています"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "あなたはチャットルームからバンされています"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "チャットルームに入るにはメンバーでなければなりません"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "このチャットルームは非匿名です"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "チャットルームに入るにはパスワードが必要です"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "チャプタを生成することが出来ません。"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "パスワードが違います"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "管理者権限が必要です"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "モデレーター権限が必要です"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s は無効です"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "ニックネーム ~s はこのチャットルームに居ません"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "無効な提携です: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "無効なロールです: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "オーナー権限が必要です"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "チャットルーム ~s の設定"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "設定: "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "チャットルームの詳細"
+msgstr "詳細:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "チャットルームを永続化します"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "チャットルームを検索可能にします"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "参加者一覧を公開します"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "チャットルームにパスワードを設定します"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "最大移住者数"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "制限無し"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "本当の Jabber ID を公開する"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "モデレーターのみ"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "誰でも"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "チャットルームをメンバーのみに制限する"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "チャットルームをモデレートする"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "デフォルトのユーザーは参加者にする"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "ユーザーによる件名の変更を許可する"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "ユーザーによるプライベートメッセージの送信を許可する"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "ユーザーによる他のユーザーへの問い合わせを許可する"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "ユーザーによる招待を許可する"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr "ビジターがプレゼンス更新のステータス文を送信する事を許可する"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "ビジターがニックネームを変更する事を許可します"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "チャットルームをキャプチャで保護します"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "ロギングを有効にする"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
msgstr ""
"チャットルームを設定するにはにはクライアントが x:data をサポートする必要があ"
"ります"
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "居住者の数"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s はあなたをチャットルーム ~s に招待しています"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "パスワードは"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"宛先のオフラインメッセージキューが一杯です。このメッセージは破棄されます。"
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s's オフラインメッセージキュー"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "送信完了"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "時間"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "差出人"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "宛先"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "パケット"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "選択した項目を削除"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "オフラインメッセージ"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "すべてのオフラインメッセージを削除します"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe module"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "PubSub 購読リクエスト"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "このエントリを承認するかどうかを選択して下さい"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ノードID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "購読アドレス"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "この Jabber ID をこの pubsubノードへ購読することを許可しますか?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "イベント通知と同時にペイロードを配送します"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "イベント通知を配送します"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "ノード設定に変更があった時に購読者へ通知します"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "ノードが削除された時に購読者へ通知します"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr "アイテムがノードから消された時に購読者へ通知します"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "アイテムをストレージに保存する"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "ノードの為のフレンドリネーム"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "アイテムの最大保存数 #"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "購読を許可するかどうか"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "アクセスモデルを設定する"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "名簿グループは購読を許可しました"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "公開モデルを指定する"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "最大ぺイロードサイズ(byte)"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "最後の公開アイテムを送信するタイミングで"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "有効なユーザーにのみ告知を送信する"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "提携されたノードの集合です"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr "サーバーに登録するユーザー名とパスワードを選択して下さい"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "早すぎるユーザーアカウント登録は許可されていません"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
+msgstr "早すぎるユーザーアカウント登録は許可されませんでした"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "無し"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "認可"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "保留"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "グループ"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "検証"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "削除"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "名簿: "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "不正なフォーマット"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Jabber ID の追加"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "名簿"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "共有名簿グループ"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "新規追加"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "名前: "
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "詳細:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "メンバー:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "表示グループ"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "グループ"
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "送信"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "誕生日"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "都道府県"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "国"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "メールアドレス"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "姓"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1222,394 +1134,351 @@ msgstr ""
"フォームを埋めて Jabber User を検索して下さい(* を使用すると部分文字列にマッ"
"チします)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "氏名"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "ミドルネーム"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "名"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "会社名"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "部署名"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "ユーザーの検索: "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "ユーザー"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "検索を行うためにはクライアントが x:data をサポートする必要があります"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "vCard ユーザー検索"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard module"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "検索結果: "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
msgstr "項目を埋めて Jabber User を検索して下さい"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "認証されていません"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web 管理"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "管理"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Raw"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "ヴァーチャルホスト"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s アクセスルール設定"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "ejabberd ヴァーチャルホスト"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "ユーザー"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "ユーザーの活動履歴"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "期間: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "先月"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "去年"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "全て"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Ordinaryテーブルを表示"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Integralテーブルを表示"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "統計"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "見つかりません"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "ノードが見つかりません"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "ホスト"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "登録ユーザー"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "オフラインメッセージ"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "活動履歴"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "登録ユーザー:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "オンラインユーザー:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "外向き s2s コネクション:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "外向き s2s サービス:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "パスワードの変更"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "ユーザー "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "接続リソース:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "パスワード"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "データ無し"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "ノード"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
-msgid "Node "
-msgstr "ノード "
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "統計"
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "ユーザー"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "活動履歴"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Raw)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Raw"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s アクセスルール設定"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "ejabberd ヴァーチャルホスト"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "ユーザーの活動履歴"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "期間: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "先月"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "去年"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "全て"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Ordinaryテーブルを表示"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Integralテーブルを表示"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "ノードが見つかりません"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "ホスト"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "登録ユーザー"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "オフラインメッセージ"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "登録ユーザー:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "オンラインユーザー:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "外向き s2s コネクション:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "外向き s2s サービス:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "パスワードの変更"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "ユーザー "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "接続リソース:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "パスワード"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "データ無し"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
+msgid "Node "
+msgstr "ノード"
+
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Listenポート"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "更新"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "再起動"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "停止"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "RPC 呼び出しエラー"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "データーベーステーブル: "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "ストレージタイプ"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "要素"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "サイズ"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "メモリ"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "エラー"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "バックアップ: "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "バイナリバックアップの保存"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "直ちにバイナリバックアップからリストア"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr "ejabberd の再起動時にバイナリバックアップからリストア"
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "プレーンテキストバックアップの保存"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "直ちにプレーンテキストバックアップからリストア"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "ユーザーデータを PIEFXISファイルからインポート(XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-"サーバーにある全てのユーザーデータをPIEFXISファイルにエクスポート(XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr "ホストのユーザーデータをPIEFXISファイルにエクスポート(XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "ユーザーデータを jabberd14 Spool ファイルからインポート:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "ユーザーデータを jabberd14 Spool ディレクトリからインポート:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
-msgstr "Listen ポート "
+msgstr "Listen ポート: "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
-msgstr "モジュール "
+msgstr "モジュール: "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "~p の統計"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "起動時間"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "CPU時間:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "トランザクションのコミット:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "トランザクションの失敗:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "トランザクションの再起動:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "トランザクションのログ: "
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "更新 "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "更新計画"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "モジュールを変更しました"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "モジュールを更新しました"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "スクリプトの更新"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "低レベル更新スクリプト"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "スクリプトチェック"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "ポート"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "プロトコル"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "モジュール"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "オプション"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "削除"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "開始"
-
-#~ msgid "Encodings"
-#~ msgstr "エンコーディング"
-
-#~ msgid "(Raw)"
-#~ msgstr "(Raw)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "ヴァーチャルホスト"
-
-#~ msgid "Specified nickname is already registered"
-#~ msgstr "指定されたニックネームは既に登録されています"
-
-#~ msgid "Size"
-#~ msgstr "サイズ"
diff --git a/src/msgs/nl.msg b/src/msgs/nl.msg
index 977aa6d1d..778596334 100644
--- a/src/msgs/nl.msg
+++ b/src/msgs/nl.msg
@@ -15,7 +15,7 @@
{"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 change subject","Gebruikers mogen het onderwerp 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"}.
@@ -24,7 +24,6 @@
{"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"}.
@@ -44,10 +43,9 @@
{"City","Plaats"}.
{"Commands","Commando's"}.
{"Conference room does not exist","De chatruimte bestaat niet"}.
+{"Configuration for ","Instellingen van "}.
{"Configuration","Instellingen"}.
-{"Configuration of room ~s","Instellingen van chatruimte ~s"}.
{"Connected Resources:","Verbonden bronnen:"}.
-{"Connections parameters","Verbindingsparameters"}.
{"Country","Land"}.
{"CPU Time:","Processortijd:"}.
{"Database","Database"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd's vCard-module"}.
{"ejabberd virtual hosts","Virtuele hosts"}.
{"ejabberd Web Admin","ejabberd Webbeheer"}.
-{"Elements","Elementen"}.
{"Email","E-mail"}.
{"Enable logging","Logs aanzetten"}.
-{"Encoding for server ~b","Karakterset voor server ~b"}.
+{"Encodings","Coderingen:"}.
{"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"}.
@@ -86,14 +83,9 @@
{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Voer de gebruikersnaam en de coderingen in die u wilt gebruiken voor verbindingen 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Voorbeeld: [{\"irc.example.org\", \"koi8-r\"}, {\"vendetta.example.net\", \"iso8859-1\"}]."}.
{"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"}.
@@ -116,13 +108,10 @@
{"has been kicked","werd gekicked"}.
{" has set the subject to: "," veranderde het onderwerp in: "}.
{"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.","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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Als u verschillende coderingen wilt opgeven voor elke IRC-server, ga dan voor elke server te werk op als volgt: '{\"IRC-server\", \"codering\"}'. Standaard gebruikt dit IRC-transport de codering \"~s\"."}.
{"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"}.
@@ -130,24 +119,16 @@
{"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 ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","De Jabber ID ~s is ongeldig"}.
{"January","januari"}.
-{"Join IRC channel","Ga IRC kanaal binnen"}.
+{"Jabber ID ~s is invalid","De Jabber ID ~s is ongeldig"}.
{"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"}.
@@ -160,7 +141,6 @@
{"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"}.
@@ -172,13 +152,12 @@
{"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"}.
+{"Membership required to enter this room","U moet lid zijn om deze chatruimte te kunnen betreden"}.
{"Memory","Geheugen"}.
{"Message body","Bericht"}.
{"Middle Name","Tussennaam"}.
{"Moderator privileges required","U hebt moderatorprivileges nodig"}.
{"moderators only","moderators"}.
-{"Modified modules","Gewijzigde modules"}.
{"Module","Module"}.
{"Modules at ","Modules op "}.
{"Modules","Modules"}.
@@ -187,6 +166,8 @@
{"Name","Naam"}.
{"Never","Nooit"}.
{"Nickname","Bijnaam"}.
+{"Nickname is already in use by another occupant","Deze bijnaam is al in gebruik door een andere aanwezige"}.
+{"Nickname is registered by another person","Deze bijnaam is al geregistreerd door iemand anders"}.
{"Nickname Registration at ","Registratie van een bijnaam op "}.
{"Nickname ~s does not exist in the room","De bijnaam ~s bestaat niet in deze chatruimte"}.
{"No body provided for announce message","De mededeling bevat geen bericht"}.
@@ -198,7 +179,6 @@
{"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"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Alleen moderators en deelnemers mogen het onderwerp van deze chatruimte veranderen"}.
+{"Only moderators are allowed to change subject in this room","Alleen moderators mogen het onderwerp van deze chatruimte veranderen"}.
{"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"}.
@@ -227,7 +207,7 @@
{"Outgoing s2s Servers:","Uitgaande s2s-verbindingen:"}.
{"Owner privileges required","U hebt eigenaarsprivileges nodig"}.
{"Packet","Pakket"}.
-{"Password ~b","Wachtwoord ~b"}.
+{"Password required to enter this room","U hebt een wachtwoord nodig om deze chatruimte te kunnen betreden"}.
{"Password Verification","Wachtwoord Bevestiging"}.
{"Password:","Wachtwoord:"}.
{"Password","Wachtwoord"}.
@@ -237,26 +217,24 @@
{"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."}.
{"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"}.
{"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)"}.
{"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"}.
{"Registered Users:","Geregistreerde gebruikers:"}.
{"Registered Users","Geregistreerde gebruikers"}.
{"Registration in mod_irc for ","Registratie van "}.
+{"Remark 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 (een) andere database(s) gebruikt dan moet u daarvan (een) afzonderlijke backup(s) maken."}.
{"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"}.
@@ -270,8 +248,6 @@
{"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 "}.
@@ -289,7 +265,6 @@
{"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"}.
{"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"}.
@@ -297,6 +272,8 @@
{"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"}.
+{"Size","Grootte"}.
+{"Specified nickname is already registered","De gekozen bijnaam is al geregistreerd"}.
{"Specify the access model","Geef toegangsmodel"}.
{"Specify the publisher model","Publicatietype opgeven"}.
{"~s's Offline Messages Queue","offline berichten van ~s"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","De collecties waar een node mee is gerelateerd"}.
{"the password is","het wachtwoord is"}.
{"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"}.
@@ -338,9 +311,8 @@
{"Transactions Logged:","Gelogde transacties:"}.
{"Transactions Restarted:","Herstarte transacties:"}.
{"Tuesday","dinsdag"}.
-{"Unable to generate a captcha","Het generen van een gautomatiseerde Turing test is mislukt"}.
-{"Unauthorized","Niet geautoriseerd"}.
{"Update","Bijwerken"}.
+{"Updated modules","Modules opwaarderen"}.
{"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 "}.
@@ -351,11 +323,12 @@
{"User ","Gebruiker "}.
{"User","Gebruiker"}.
{"User Management","Gebruikersbeheer"}.
-{"Users are not allowed to register accounts so quickly","Het is gebruikers niet toegestaan zo snel achter elkaar te registreren"}.
+{"Users are not allowed to register accounts so fast","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"}.
{"Wednesday","woensdag"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","U hebt een client nodig die x:data ondersteunt om een bijnaam te registreren"}.
{"You need an x:data capable client to search","U hebt een client nodig die x:data ondersteunt om te zoeken"}.
{"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 messages to ~s are being blocked. To unblock them, visit ~s","Uw berichten aan ~s worden geblokkeerd. Om ze te deblokkeren, ga naar ~s"}.
diff --git a/src/msgs/nl.po b/src/msgs/nl.po
index 3694634c3..a4253801f 100644
--- a/src/msgs/nl.po
+++ b/src/msgs/nl.po
@@ -1,38 +1,25 @@
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
-"Last-Translator: Andreas van Cranenburgh \n"
+"Last-Translator: Andreas van Cranenburgh\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:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Gebruik van STARTTLS is vereist"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Geen bron opgegeven"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Vervangen door een nieuwe verbinding"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Voer de getoonde tekst in"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -49,11 +36,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Wilt u het bericht van de dag verwijderen?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Onderwerp"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Bericht"
@@ -77,7 +64,7 @@ msgstr "Stuur aankondiging aan alle gebruikers op alle hosts"
msgid "Send announcement to all online users"
msgstr "Mededeling verzenden naar alle online gebruikers"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Mededeling verzenden naar alle online gebruikers op alle virtuele hosts"
@@ -108,633 +95,576 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Instellingen"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Database"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Modules starten"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Modules stoppen"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Backup"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Binaire backup direct herstellen"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Backup naar een tekstbestand schrijven"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Bestand importeren"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Directory importeren"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Herstart Service"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Stop Service"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Gebruiker toevoegen"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Verwijder Gebruiker"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Verwijder Gebruikers-sessie"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Gebruikerswachtwoord Opvragen"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Verander Gebruikerswachtwoord"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Tijd van Laatste Aanmelding Opvragen"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Gebruikers-statistieken Opvragen"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Aantal Geregistreerde Gebruikers Opvragen"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Aantal Aanwezige Gebruikers Opvragen"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Access control lists"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Access rules"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Gebruikersbeheer"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Online gebruikers"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Alle gebruikers"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Uitgaande s2s-verbindingen"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Draaiende nodes"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Gestopte nodes"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Modules"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Backup"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importeer gebruikers via spool-bestanden van jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Naar ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Van ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Instellingen van databasetabellen op "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Opslagmethode voor tabellen kiezen"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Harde schijf"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "RAM en harde schijf"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Op andere nodes in de cluster"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Modules stoppen op "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Selecteer de modules die u wilt stoppen"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Modules starten op "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Voer lijst met op te starten modules als volgt in: {Module, [Opties]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Lijst met op te starten modules"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Binaire backup maken op "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Voer pad naar backupbestand in"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Pad naar bestand"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Binaire backup direct herstellen op "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Backup naar een tekstbestand schrijven op "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Voer pad naar backupbestand in"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importeer gebruiker via bestand op "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Voer pad naar jabberd14-spool-bestand in"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Gebruikers importeren vanaf directory op "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Voer pad naar jabberd14-spool-directory in"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Pad naar directory"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Vertraging"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Instellingen van access control lists"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Access control lists"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Toegangsinstellingen"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Access rules"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Wachtwoord"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Wachtwoord Bevestiging"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Aantal Geregistreerde Gebruikers"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Aantal Aanwezige Gebruikers"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nooit"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Online"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Laatste Aanmelding"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Contactlijst Groote"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP-adres"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Bronnen"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Beheer van "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Actie op gebruiker"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Eigenschappen bewerken"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Gebruiker verwijderen"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "De toegang werd geweigerd door het beleid van deze dienst"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Transport"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd's IRC-module"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registratie van "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Voer de gebruikersnaam en de coderingen in die u wilt gebruiken voor "
+"verbindingen met IRC-servers"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Gebruikersnaam voor IRC:"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"Als u verschillende coderingen wilt opgeven voor elke IRC-server, ga dan "
+"voor elke server te werk op als volgt: '{\"IRC-server\", \"codering\"}'. "
+"Standaard gebruikt dit IRC-transport de codering \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Voorbeeld: [{\"irc.example.org\", \"koi8-r\", 6667, \"geheim\"}, {\"vendetta."
-"example.net\", \"iso8859-1\", 7000}, {irc,testserver.nl\", \"utf-8\"}]."
+"Voorbeeld: [{\"irc.example.org\", \"koi8-r\"}, {\"vendetta.example.net\", "
+"\"iso8859-1\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Verbindingsparameters"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Coderingen:"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Ga IRC kanaal binnen"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC kanaal (zonder eerste #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC-server"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Ga het IRC kanaal binnen"
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "IRC instellingen"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Gebruikersnaam voor IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Wachtwoord ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Poort ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Karakterset voor server ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Server ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
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:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "De chatruimte bestaat niet"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Groepsgesprekken"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"U hebt een client nodig die x:data ondersteunt om een bijnaam te registreren"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registratie van een bijnaam op "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Voer de bijnaam in die u wilt registreren"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Bijnaam"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Deze bijnaam is al geregistreerd door iemand anders"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "De gekozen bijnaam is al geregistreerd"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "U moet het veld \"bijnaam\" invullen"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd's MUC module"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "De instellingen van de chatruimte werden veranderd"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "betrad de chatruimte"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "verliet de chatruimte"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "werd verbannen"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "werd gekicked"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "is weggestuurd vanwege een affiliatieverandering"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "is weggestuurd omdat het systeem gestopt wordt"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "heet nu"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " veranderde het onderwerp in: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "maandag"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "dinsdag"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "woensdag"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "donderdag"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "vrijdag"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "zaterdag"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "zondag"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "januari"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "februari"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "maart"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "april"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "mei"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "juni"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "juli"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "augustus"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "september"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "oktober"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "november"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "december"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Instellingen van de chatruimte"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Aantal aanwezigen"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Naam van de chatruimte"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Dataverkeerslimiet overschreden"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Onjuist berichttype"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -742,497 +672,484 @@ msgstr ""
"Deze deelnemer wordt weggestuurd vanwege het sturen van een "
"foutmeldingsbericht aan een andere deelnemer"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "De ontvanger is niet in de chatruimte"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Het is niet toegestaan priveberichten te sturen"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privé, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr ""
"Alleen moderators en deelnemers mogen het onderwerp van deze chatruimte "
"veranderen"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Alleen moderators mogen het onderwerp van deze chatruimte veranderen"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "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:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Deze bijnaam is al geregistreerd door iemand anders"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "U werd verbannen uit deze chatruimte"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "U moet lid zijn om deze chatruimte te kunnen betreden"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Deze chatruimte is niet anoniem"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "U hebt een wachtwoord nodig om deze chatruimte te kunnen betreden"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Het generen van een gautomatiseerde Turing test is mislukt"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Foutief wachtwoord"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "U hebt beheerdersprivileges nodig"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "U hebt moderatorprivileges nodig"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "De Jabber ID ~s is ongeldig"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "De bijnaam ~s bestaat niet in deze chatruimte"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Ongeldige affiliatie: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Ongeldige rol: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "U hebt eigenaarsprivileges nodig"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Instellingen van chatruimte ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Instellingen van "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Beschrijving"
+msgstr "Beschrijving:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Chatruimte blijvend maken"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Chatruimte doorzoekbaar maken"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Deelnemerslijst publiek maken"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Chatruimte beveiligen met een wachtwoord"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Maximum aantal aanwezigen"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Geen limiet"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Jabber ID's kunnen achterhaald worden door"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "moderators"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "iedereen"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Chatruimte enkel toegankelijk maken voor leden"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Chatruimte gemodereerd maken"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Gebruikers standaard instellen als deelnemers"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
-msgstr "Sta gebruikers toe het onderwerp te veranderen"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
+msgstr "Gebruikers mogen het onderwerp veranderen"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Gebruikers mogen privéberichten verzenden"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Gebruikers mogen naar andere gebruikers verzoeken verzenden"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Gebruikers mogen uitnodigingen verzenden"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Sta bezoekers toe hun naam te veranderen"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Chatruimte beveiligen met een geautomatiseerde Turing test"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Logs aanzetten"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Aantal aanwezigen"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s nodigt je uit voor het groepsgesprek ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "het wachtwoord is"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "offline berichten van ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Verzonden"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Tijd"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Van"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Aan"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Pakket"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Geselecteerde verwijderen"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Offline berichten:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Verwijder alle offline berichten"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe module"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "PubSub abonnee verzoek"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Beslis of dit verzoek tot abonneren zal worden goedgekeurd"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Node ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Abonnee Adres"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Berichten bezorgen samen met gebeurtenisnotificaties"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Gebeurtenisbevestigingen Sturen"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Abonnees informeren wanneer de instellingen van de node veranderen"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Abonnees informeren wanneer de node verwijderd word"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Items in het geheugen bewaren"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Bijnaam voor deze knoop"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Maximum aantal in het geheugen te bewaren items"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Abonnementsaanvraag toestaan"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Geef toegangsmodel"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Contactlijst-groepen die mogen abonneren"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Publicatietype opgeven"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Maximumgrootte van bericht in bytes"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Wanneer het laatst gepubliceerde item verzonden moet worden"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Notificaties alleen verzenden naar online gebruikers"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "De collecties waar een node mee is gerelateerd"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Het is gebruikers niet toegestaan zo snel achter elkaar te registreren"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Geen"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Inschrijving"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Bezig"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Groepen"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Bevestigen"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Verwijderen"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Roster van "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Slecht formaat"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Jabber ID toevoegen"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Roster"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Gedeelde rostergroepen"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Toevoegen"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Naam:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Beschrijving:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Groepsleden:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Weergegeven groepen:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Groep "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Verzenden"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Geboortedatum"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Plaats"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Land"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "E-mail"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Achternaam"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1240,383 +1157,352 @@ 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Volledige naam"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Tussennaam"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Naam"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Organisatie"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Afdeling"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Gebruikers zoeken in "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Gebruiker"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Gebruikers zoeken"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd's vCard-module"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Zoekresultaten voor "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Niet geautoriseerd"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Webbeheer"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Beheer"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Ruw"
-
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Access rules op ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
msgstr "Virtuele hosts"
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Gebruikers"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Laatste activiteit van gebruikers"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Periode: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Afgelopen maand"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Afgelopen jaar"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Alle activiteit"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Deel van tabel laten zien"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Volledige tabel laten zien"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistieken"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Niet gevonden"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Node niet gevonden"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Host"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Geregistreerde gebruikers"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Offline berichten"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Laatste activiteit"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Geregistreerde gebruikers:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Online gebruikers:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Uitgaande s2s-verbindingen:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Uitgaande s2s-verbindingen:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Wachtwoord wijzigen"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Gebruiker "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Verbonden bronnen:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Wachtwoord:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Geen gegevens"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nodes"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistieken"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Gebruikers"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Laatste activiteit"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Ruw)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Ruw"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Access rules op ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Virtuele hosts"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Laatste activiteit van gebruikers"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Periode: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Afgelopen maand"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Afgelopen jaar"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Alle activiteit"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Deel van tabel laten zien"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Volledige tabel laten zien"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Node niet gevonden"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Host"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Geregistreerde gebruikers"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Offline berichten"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Geregistreerde gebruikers:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Online gebruikers:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Uitgaande s2s-verbindingen:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Uitgaande s2s-verbindingen:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Wachtwoord wijzigen"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Gebruiker "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Verbonden bronnen:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Geen gegevens"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Node "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Openstaande poorten"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Bijwerken"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Herstarten"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Stoppen"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "RPC-oproepfout"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Databasetabellen van "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Opslagmethode"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementen"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Grootte"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Geheugen"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Fout"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Backup maken van "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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."
+"Mnesia. Als u (een) andere database(s) gebruikt dan moet u daarvan (een) "
+"afzonderlijke backup(s) maken."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Binaire backup maken:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Binaire backup direct herstellen:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Backup naar een tekstbestand schrijven:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Backup in een tekstbestand direct herstellen:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Importeer gebruikersdata van een PIEFXIS-bestand (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importeer gebruikersdata via spool-bestanden van jabberd14"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importeer gebruikersdata via spool-bestanden van jabberd14"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Openstaande poorten op "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Modules op "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistieken van ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Uptime:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Processortijd:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Bevestigde transacties:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Afgebroken transacties:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Herstarte transacties:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Gelogde transacties:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Opwaarderen van "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Plan voor de opwaardering"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Gewijzigde modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Modules opwaarderen"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Script voor de opwaardering"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Lowlevel script voor de opwaardering"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Controle van script"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Poort"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protocol"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Module"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opties"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Verwijderen"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Starten"
diff --git a/src/msgs/no.msg b/src/msgs/no.msg
index 61567cdb9..d8f407aa1 100644
--- a/src/msgs/no.msg
+++ b/src/msgs/no.msg
@@ -14,17 +14,16 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Tillat denne JID å abonnere på denne pubsub noden?"}.
+{"Allow users to change 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 status text in presence updates","Tillat besøkende å sende status tekst i "}.
+{"Allow visitors to send status text in presence updates","Tillat besøkende å sende status tekst i tilgjengelighets oppdateringer"}.
{"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"}.
@@ -37,17 +36,16 @@
{"Change User Password","Endre Brukers Passord"}.
{"Chatroom configuration modified","Samtalerommets konfigurasjon er endret"}.
{"Chatrooms","Samtalerom"}.
-{"Choose a username and password to register with this server","Velg et brukernavn og passord for å registrere på "}.
+{"Choose a username and password to register with this server","Velg et brukernavn og passord for å registrere på denne serveren"}.
{"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 for ","Konfigurasjon for "}.
{"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"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard modul"}.
{"ejabberd virtual hosts","virtuella ejabberd maskiner"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
-{"Elements","Elementer"}.
{"Email","Epost"}.
{"Enable logging","Slå på logging"}.
-{"Encoding for server ~b","Tekstkoding for server ~b"}.
+{"Encodings","Tekstkodinger"}.
{"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"}.
@@ -86,14 +83,9 @@
{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Skriv inn brukernavn og tekstkoding du ønsker å bruke for å koble til IRC tjenere"}.
{"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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Eksempel: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Etternavn"}.
{"February","februar"}.
{"Fill in fields to search for any matching Jabber User","Fyll inn felt for å søke etter Jabber brukere"}.
@@ -116,13 +108,10 @@
{"has been kicked","har blitt kastet ut"}.
{" has set the subject to: "," har satt emnet til: "}.
{"Host","Maskin"}.
-{"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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Om du ønsker å spesifisere tekstkoding for IRC tjenere, fyller du ut en liste med verdier i formatet '{\"irc server\", \"encoding\"}'. Denne tjenesten bruker \"~s\" som standard."}.
{"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"}.
@@ -130,24 +119,16 @@
{"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 "}.
+{"It is not allowed to send private messages of type \"groupchat\"","Det er ikke tillatt å sende private meldinger med typen \"groupchat\""}.
+{"It is not allowed to send private messages to the conference","Det er ikke tillatt å sende private meldinger til konferansen"}.
{"Jabber ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Ugyldig Jabber ID ~s"}.
{"January","januar"}.
-{"Join IRC channel","Bli med i IRC kanal"}.
+{"Jabber ID ~s is invalid","Ugyldig JID ~s"}.
{"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"}.
@@ -160,7 +141,6 @@
{"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"}.
@@ -171,14 +151,13 @@
{"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"}.
+{"Membership required to enter this room","Du må være medlem for å gå inn i dette rommet"}.
{"Members:","Medlemmer:"}.
{"Memory","Minne"}.
{"Message body","Meldingskropp"}.
{"Middle Name","Mellomnavn"}.
{"Moderator privileges required","Redaktørprivilegier kreves"}.
{"moderators only","kun for redaktører"}.
-{"Modified modules","Endrede moduler"}.
{"Module","Modul"}.
{"Modules at ","Moduler på "}.
{"Modules","Moduler"}.
@@ -186,6 +165,8 @@
{"Name:","Navn:"}.
{"Name","Navn"}.
{"Never","Aldri"}.
+{"Nickname is already in use by another occupant","Kallenavnet er allerede i bruk av en annen bruker"}.
+{"Nickname is registered by another person","Kallenavnet er reservert av en annen person"}.
{"Nickname","Kallenavn"}.
{"Nickname Registration at ","Registrer Kallenavn på "}.
{"Nickname ~s does not exist in the room","Kallenavn ~s eksisterer ikke i dette rommet"}.
@@ -198,7 +179,6 @@
{"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"}.
@@ -214,11 +194,11 @@
{"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 and participants are allowed to change subject in this room","Bare redaktører og deltakere kan endre emnet i dette rommet"}.
+{"Only moderators are allowed to change subject in this room","Bare redaktører kan endre emnet i dette rommet"}.
{"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 "}.
+{"Only occupants are allowed to send queries to the conference","Bare deltakere er tillatt å sende forespørsler til konferansen"}.
+{"Only service administrators are allowed to send service messages","Bare tjeneste administratorer er tilatt å sende tjeneste meldinger"}.
{"Options","Alternativer"}.
{"Organization Name","Organisasjonsnavn"}.
{"Organization Unit","Organisasjonsenhet"}.
@@ -227,9 +207,9 @@
{"Outgoing s2s Servers:","Utgående s2s Tjenere"}.
{"Owner privileges required","Eierprivilegier kreves"}.
{"Packet","Pakke"}.
-{"Password ~b","Passord ~b"}.
{"Password:","Passord:"}.
{"Password","Passord"}.
+{"Password required to enter this room","Passord kreves for å komme inn i dette rommet"}.
{"Password Verification","Passord Bekreftelse"}.
{"Path to Dir","Sti til Katalog"}.
{"Path to File","Sti til Fil"}.
@@ -237,26 +217,24 @@
{"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."}.
{"Pong","Pong"}.
-{"Port ~b","Port ~b"}.
{"Port","Port"}.
-{"Present real Jabber IDs to","Presenter ekte Jabber IDer til"}.
+{"Present real Jabber IDs to","Presenter ekte JIDer til"}.
{"private, ","privat, "}.
-{"Protocol","Protokoll"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","PubSub abonements forespørsel"}.
-{"Queries to the conference members are not allowed in this room","Forespørsler til konferanse medlemmene er ikke tillat i dette rommet"}.
+{"Queries to the conference members are not allowed in this room","Det er ikke tillatt å sende forespørsler til deltakerene i dette rommet"}.
{"RAM and disc copy","RAM og diskkopi"}.
{"RAM copy","RAM kopi"}.
+{"(Raw)","(Rå)"}.
{"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"}.
{"Registered Users:","Registrerte Brukere:"}.
{"Registered Users","Registrerte Brukere"}.
{"Registration in mod_irc for ","Registrering i mod_irc for "}.
+{"Remark 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."}.
{"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"}.
@@ -270,8 +248,6 @@
{"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"}.
@@ -284,19 +260,20 @@
{"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 on all hosts","Send kunngjøring til alle tilkoblede brukere på alle maskiner"}.
{"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"}.
{"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 "}.
+{"Set message of the day on all hosts and send to online users","Angi melding for dagen på alle maskiner og send til tilkoblede brukere"}.
{"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"}.
+{"Size","Størrelse"}.
+{"Specified nickname is already registered","Dette kallenavnet er allerede registrert"}.
{"Specify the access model","Spesifiser aksess modellen"}.
{"Specify the publisher model","Angi publiserings modell"}.
{"~s's Offline Messages Queue","~ss kø for Frakoblede Meldinger"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","Samlingene som en node er assosiert med"}.
{"the password is","passordet er"}.
{"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"}.
@@ -338,8 +311,7 @@
{"Transactions Logged:","Loggede Transasksjoner:"}.
{"Transactions Restarted:","Omstartede Transasksjoner:"}.
{"Tuesday","tirsdag"}.
-{"Unable to generate a captcha","Umulig å generere en captcha"}.
-{"Unauthorized","Uautorisert"}.
+{"Updated modules","Oppdater moduler"}.
{"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 "}.
@@ -351,21 +323,21 @@
{"User ","Bruker "}.
{"User","Bruker"}.
{"User Management","Bruker Behandling"}.
-{"Users are not allowed to register accounts so quickly","Brukere får ikke lov til registrere kontoer så fort"}.
+{"Users are not allowed to register accounts so fast","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"}.
-{"Visitors are not allowed to change their nicknames in this room","Besøkende får ikke lov å endre kallenavn i dette "}.
+{"Virtual Hosts","Virtuelle Maskiner"}.
+{"Visitors are not allowed to change their nicknames in this room","Besøkende får ikke lov å endre kallenavn i dette rommet"}.
{"Visitors are not allowed to send messages to all occupants","Besøkende får ikke sende meldinger til alle deltakere"}.
{"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 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 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 register nickname","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 "}.
+{"You need an x:data capable client to configure mod_irc settings","Du trenger en klient som støtter x:data 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 å konfigurere rommet"}.
+{"You need an x:data capable client to register nickname","Du trenger en klient som søtter x:data for å registrere kallenavn"}.
+{"You need an x:data capable client to search","Du tregner en klient som støtter x:data for å kunne søke"}.
{"Your contact offline message queue is full. The message has been discarded.","Kontaktens frakoblede meldingskø er full. Meldingen har blitt kassert."}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","Dine meldinger til ~s blir blokkert. For å åpne igjen, besøk ~s"}.
diff --git a/src/msgs/no.po b/src/msgs/no.po
index 59cbf8e00..081c21ef8 100644
--- a/src/msgs/no.po
+++ b/src/msgs/no.po
@@ -1,36 +1,24 @@
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
-"Last-Translator: Stian B. Barmen \n"
+"Last-Translator: Stian B. Barmen\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:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Bruk av STARTTLS kreves"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Ingen ressurs angitt"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Erstattet av en ny tilkobling"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Skriv inn teksten du ser"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -47,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Virkelig slette melding for dagen?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Tittel"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Meldingskropp"
@@ -75,9 +63,9 @@ msgstr "Send kunngjøring til alle brukere på alle maskiner"
msgid "Send announcement to all online users"
msgstr "Send kunngjøring alle tilkoblede brukere"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
-msgstr "Send kunngjøring til alle tilkoblede brukere på alle "
+msgstr "Send kunngjøring til alle tilkoblede brukere på alle maskiner"
#: mod_announce.erl:643
msgid "Set message of the day and send to online users"
@@ -85,7 +73,7 @@ msgstr "Angi melding for dagen og send til tilkoblede brukere"
#: mod_announce.erl:645
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 "
+msgstr "Angi melding for dagen på alle maskiner og send til tilkoblede brukere"
#: mod_announce.erl:647
msgid "Update message of the day (don't send)"
@@ -104,624 +92,569 @@ msgid "Delete message of the day on all hosts"
msgstr "Slett melding for dagen på alle maskiner"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Konfigurasjon"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Database"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Start Moduler"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Stop Moduler"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Sikkerhetskopier"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Gjenopprett"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Dump til Tekstfil"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importer File"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importer Katalog"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Start Tjeneste på Nytt"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Avslutt Tjeneste"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Legg til Bruker"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Slett Bruker"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Avslutt Bruker Sesjon"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Hent Brukers Passord"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Endre Brukers Passord"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Vis Brukers Siste Påloggings Tidspunkt"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Vis Bruker Statistikk"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Vis Antall Registrerte Brukere"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Vis Antall Tilkoblede Brukere"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Tilgangskontrollister"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Tilgangsregler"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Bruker Behandling"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Tilkoblede Brukere"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Alle Brukere"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Utgående s2s Koblinger"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Kjørende Noder"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Stoppede Noder"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Moduler"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Håndtere Sikkerehetskopiering"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importer Brukere Fra jabberd14 Spoolfiler"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Til ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Fra ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Database Tabell Konfigurasjon på "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Velg lagringstype for tabeller"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Kun diskkopi"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "RAM og diskkopi"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "RAM kopi"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Lagres ikke lokalt"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Stopp Moduler på "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Velg hvilke moduler som skal stoppes"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Start Moduler på "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Skriv inn en liste av {Module, [Options]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Liste over moduler som skal startes"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Sikkerhetskopiere til Fil på "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Skriv inn sti til sikkerhetskopi filen"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Sti til Fil"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Gjenopprett fra Sikkerhetsopifil på "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Dump Sikkerhetskopi til Tekstfil på "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Skriv inn sti til tekstfil"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importer Bruker fra Fil på "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Skriv inn sti til jabberd14 spoolfil"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importer Brukere fra Katalog på "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Skriv inn sti til jabberd14 spoolkatalog"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Sti til Katalog"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Tids forsinkelse"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Konfigurasjon for Tilgangskontroll lister"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Tilgangskontroll lister"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Tilgangskonfigurasjon"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Tilgangsregler"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Passord"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Passord Bekreftelse"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Antall registrerte brukere"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Antall tilkoblede brukere"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Aldri"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Tilkoblet"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Siste pålogging"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Kontaktliste størrelse"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP adresser"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Ressurser"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administrasjon av "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Handling på bruker"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Redigere Egenskaper"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Fjern Bruker"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Tilgang nektes på grunn av en tjeneste regel"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Transport"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC modul"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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"
+"Du trenger en klient som støtter x:data for å konfigurere mod_irc "
+"instillinger"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registrering i mod_irc for "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-"Skriv brukernavn, tekstkoding, porter og passord du ønsker å bruke for "
-"tilkobling til IRC servere"
+"Skriv inn brukernavn og tekstkoding du ønsker å bruke for å koble til IRC "
+"tjenere"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRC Brukernavn"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"liste med verdier i formatet '{\"irc server\", \"encoding\"}'. Denne "
+"tjenesten bruker \"~s\" som standard."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Eksempel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta."
-"fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Eksempel: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-"
+"1\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Tilkoblings parametere"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Tekstkodinger"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Bli med i IRC kanal"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC kanal (ikke skriv den første #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC server"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Bli med i IRC kanalen her. "
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "IRC instillinger"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRC brukernavn"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Passord ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Tekstkoding for server ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Server ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
-msgstr "Bare tjeneste administratorer er tilatt å sende tjeneste "
+msgstr "Bare tjeneste administratorer er tilatt å sende tjeneste meldinger"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Oppretting av rom nektes av en tjenste regel"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Konferanserommet finnes ikke"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Samtalerom"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
-msgstr "Du trenger en klient som støtter x:data for å "
+msgstr "Du trenger en klient som søtter x:data for å registrere kallenavn"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registrer Kallenavn på "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Skriv inn kallenavnet du ønsker å registrere"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Kallenavn"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Det kallenavnet er registrert av en annen person"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Dette kallenavnet er allerede registrert"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Du må fylle inn feltet \"Nickname\" i skjemaet"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modul"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Samtalerommets konfigurasjon er endret"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "kommer inn i rommet"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "forlater rommet"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "har blitt bannlyst"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "har blitt kastet ut"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
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:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "er nå kjent som"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " har satt emnet til: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "mandag"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "tirsdag"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "onsdag"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "torsdag"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "fredag"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "lørdag"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "søndag"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "januar"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "februar"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "mars"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "april"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "mai"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "juni"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "juli"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "august"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "september"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "oktober"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "november"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "desember"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Rom Konfigurasjon"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Samtalerom Deltakere"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Romtittel"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Trafikkmengde grense overskredet"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
-msgstr "Det er ikke tillatt å sende private meldinger til "
+msgstr "Det er ikke tillatt å sende private meldinger til konferansen"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Feilaktig meldingstype"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -729,488 +662,476 @@ msgstr ""
"Denne deltakeren er kastet ut av rommet fordi han sendte en feilmelding til "
"en annen deltaker"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
-msgstr "Det er ikke tillatt å sende private meldinger med typen "
+msgstr "Det er ikke tillatt å sende private meldinger med typen \"groupchat\""
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Mottakeren er ikke i konferanserommet"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Det er ikke tillatt å sende private meldinger"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
-msgstr "Bare deltakere er tillatt å sende forespørsler til "
+msgstr "Bare deltakere er tillatt å sende forespørsler til konferansen"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
-msgstr "Forespørsler til konferanse medlemmene er ikke tillat i dette rommet"
+msgstr ""
+"Det er ikke tillatt å sende forespørsler til deltakerene i dette rommet"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privat, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr "Bare redaktører og deltakere kan endre emnet i dette rommet"
-#: mod_muc/mod_muc_room.erl:806
-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:853
+msgid "Only moderators are allowed to change subject in this room"
+msgstr "Bare redaktører kan endre emnet i dette rommet"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
-msgstr "Besøkende får ikke lov å endre kallenavn i dette "
+msgstr "Besøkende får ikke lov å endre kallenavn i dette rommet"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-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:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "Kallenavnet er allerede i bruk av en annen bruker"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Kallenavnet er reservert av en annen person"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Du har blitt bannlyst i dette rommet."
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
-msgstr "Medlemskap kreves for tilgang til samtalerommet"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
+msgstr "Du må være medlem for å gå inn i dette rommet"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Dette rommet er ikke anonymt"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
-msgstr "Et passord kreves for tilgang til samtalerommet"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
+msgstr "Passord kreves for å komme inn i dette rommet"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Umulig å generere en captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Feil passord"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Administratorprivilegier kreves"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Redaktørprivilegier kreves"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Ugyldig Jabber ID ~s"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Kallenavn ~s eksisterer ikke i dette rommet"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Ugyldig rang: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Ugyldig rolle: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Eierprivilegier kreves"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Konfigurasjon for rom ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Konfigurasjon for "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Rom beskrivelse"
+msgstr "Beskrivelse:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Gjør rommet permanent"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Gjør rommet offentlig søkbart"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Gjør deltakerlisten offentlig"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Passordbeskytt rommet"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Maksimum Antall Deltakere"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Ingen grense"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Presenter ekte Jabber IDer til"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "kun for redaktører"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "hvem som helst"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Gjør rommet tilgjengelig kun for medlemmer"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Gjør rommet redaktørstyrt"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Standard brukere som deltakere"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Tillat brukere å endre emne"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Tillat brukere å sende private meldinger"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Tillat brukere å sende forespørsel til andre brukere"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Tillat brukere å sende invitasjoner"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
-msgstr "Tillat besøkende å sende status tekst i "
+msgstr "Tillat besøkende å sende status tekst i tilgjengelighets oppdateringer"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Tillat besøkende å endre kallenavn"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Gjør rommet captcha beskyttet"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Slå på logging"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
-msgstr "Du trenger en klient som støtter x:data for å "
+msgstr "Du trenger en klient som støtter x:data for å konfigurere rommet"
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Antall deltakere"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s inviterer deg til rommet ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "passordet er"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~ss kø for Frakoblede Meldinger"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Innsendt"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Tid"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Fra"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Til"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Pakke"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Slett valgte"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Frakoblede Meldinger:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Fjern Alle Frakoblede Meldinger"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams modul"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe modul"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "PubSub abonements forespørsel"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Velg om du vil godkjenne denne eksistensens abonement"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Node ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Abonnements Adresse"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
-msgstr "Tillat denne Jabber ID å abonnere på denne pubsub "
+msgstr "Tillat denne Jabber ID å abonnere på denne pubsub noden?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Send innhold sammen med kunngjøringer"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Lever begivenhets kunngjøringer"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Informer abonnenter når node konfigurasjonen endres"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Informer abonnenter når noden slettes"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr "Informer abonnenter når elementer fjernes fra noden"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Vedvarende elementer til lagring"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Et vennlig navn for noden"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Høyeste # elementer som skal lagres"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Om man skal tillate abonnenter"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Spesifiser aksess modellen"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Kontaktliste grupper som tillates å abonnere"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Angi publiserings modell"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Største innholdsstørrelse i byte"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Når skal siste publiserte artikkel sendes"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Send kunngjøringer bare til tilgjengelige brukere"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Samlingene som en node er assosiert med"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
-msgstr "Velg et brukernavn og passord for å registrere på "
+msgstr "Velg et brukernavn og passord for å registrere på denne serveren"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "Brukere får ikke lov til registrere kontoer så fort"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
+msgstr "Brukere får ikke lov til å registrere kontoer så fort"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Ingen"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Abonnement"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Ventende"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grupper"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Bekrefte gyldighet"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Fjern"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Kontaktliste for "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Feil format"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Legg til Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Kontaktliste"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Delte Kontaktgrupper"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Legg til ny"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Navn:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Beskrivelse:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Medlemmer:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Viste grupper:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Gruppe "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Send"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Fødselsdag"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "By"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Land"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Epost"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Etternavn"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1218,379 +1139,355 @@ 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Fullstendig Navn"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Mellomnavn"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Navn"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Organisasjonsnavn"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Organisasjonsenhet"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Søk etter brukere i "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Bruker"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
-msgstr "Du tregner en klient som støtter x:data for å kunne "
+msgstr "Du tregner en klient som støtter x:data for å kunne søke"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "vCard Bruker Søk"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard modul"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Søke Resultater for "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Uautorisert"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administrasjon"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Rå"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Virtuelle Maskiner"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "tilgangsregel konfigurasjon for ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "virtuella ejabberd maskiner"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Brukere"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Brukers Siste Aktivitet"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Periode: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Siste måned"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Siste året"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "All aktivitet"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Vis Ordinær Tabell"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Vis Integral Tabell"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistikk"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Finnes Ikke"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Noden finnes ikke"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Maskin"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Registrerte Brukere"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Frakoblede Meldinger"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Siste Aktivitet"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Registrerte Brukere:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Tilkoblede Brukere:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Utgående s2s Koblinger"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Utgående s2s Tjenere"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Endre Passord"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Bruker "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Tilkoblede Ressurser:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Passord:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Ingen Data"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Noder"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistikk"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Brukere"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Siste Aktivitet"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Rå)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Rå"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "tilgangsregel konfigurasjon for ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "virtuella ejabberd maskiner"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Brukers Siste Aktivitet"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Periode: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Siste måned"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Siste året"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "All aktivitet"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Vis Ordinær Tabell"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Vis Integral Tabell"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Noden finnes ikke"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Maskin"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Registrerte Brukere"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Frakoblede Meldinger"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Registrerte Brukere:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Tilkoblede Brukere:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Utgående s2s Koblinger"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Utgående s2s Tjenere"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Endre Passord"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Bruker "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Tilkoblede Ressurser:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Passord:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Ingen Data"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Node "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Lyttende Porter"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Oppdatere"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Starte på nytt"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Stoppe"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "RPC Kall Feil"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Database Tabeller på "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Lagringstype"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementer"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Størrelse"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Minne"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Feil"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Sikkerhetskopi av "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Lagre binær sikkerhetskopi:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Gjenopprette binær backup umiddelbart:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Lagre rentekst sikkerhetskopi:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Gjenopprette rentekst sikkerhetskopi umiddelbart:"
-#: web/ejabberd_web_admin.erl:1999
-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:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importer bruker data fra jabberd14 spoolfiler:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importer brukeres data fra jabberd14 spoolfil katalog:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Lyttende Porter på "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Moduler på "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistikk for ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Oppetid:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "CPU Tid:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Sendte Transaksjoner:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Avbrutte Transasksjoner:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Omstartede Transasksjoner:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Loggede Transasksjoner:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Oppdater "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Oppdaterings plan"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Endrede moduler"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Oppdater moduler"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Oppdaterings skript"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Lavnivå oppdaterings skript"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Skript sjekk"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protokoll"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modul"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Alternativer"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Slett"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Start"
+
+#~ msgid "You must fill in field \"nick\" in the form"
+#~ msgstr "Du må fylle inn feltet \"nick\" i skjemaet"
diff --git a/src/msgs/pl.msg b/src/msgs/pl.msg
index f1aa9ae6e..b856b0c47 100644
--- a/src/msgs/pl.msg
+++ b/src/msgs/pl.msg
@@ -1,10 +1,10 @@
{"Access Configuration","Konfiguracja dostępu"}.
-{"Access Control List Configuration","Konfiguracja kontroli dostępu"}.
+{"Access Control List Configuration","Konfiguracja listy dostępowej"}.
{"Access Control Lists","Lista dostępowa"}.
{"Access control lists","Lista dostępu"}.
-{"Access denied by service policy","Kontrola dostępu - dostęp zabroniony"}.
-{"Access rules","Kontrola dostępu"}.
-{"Access Rules","Kontrola dostępu"}.
+{"Access denied by service policy","Dostęp zabroniony przez zabezpieczenia serwera"}.
+{"Access rules","Zasady dostępu"}.
+{"Access Rules","Zasady dostępu"}.
{"Action on user","Akcja dla użytkownika"}.
{"Add Jabber ID","Dodaj Jabber ID"}.
{"Add New","Dodaj nowe"}.
@@ -14,45 +14,43 @@
{"Administrator privileges required","Wymagane prawa 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 this Jabber ID to subscribe to this pubsub node?","Pozwól temu JID na zapisanie się do tego noda pubsub"}.
+{"Allow users to change subject","Pozwól użytkownikom zmienić tytuł pokoju"}.
{"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ę nika"}.
{"Allow visitors to send status text in presence updates","Pozwól uczestnikom na wysyłanie statusów opisowych"}.
{"All Users","Wszyscy użytkownicy"}.
-{"Announcements","Powiadomienia"}.
-{"anyone","ktokolwiek"}.
-{"A password is required to enter this room","Aby wejść do pokoju wymagane jest hasło"}.
+{"Announcements","Oznajmienia"}.
+{"anyone","wszyscy"}.
{"April","Kwiecień"}.
{"August","Sierpień"}.
{"Backup Management","Zarządzanie kopiami zapasowymi"}.
{"Backup of ","Kopia zapasowa "}.
{"Backup to File at ","Stwórz kopię do pliku na "}.
{"Backup","Tworzenie kopii"}.
-{"Bad format","Błędny format"}.
-{"Birthday","Data urodzenia"}.
+{"Bad format","Zły format"}.
+{"Birthday","Data urodzenia: "}.
{"Change Password","Zmień hasło"}.
{"Change User Password","Zmień hasło użytkownika"}.
{"Chatroom configuration modified","Konfiguracja pokoju zmodyfikowana"}.
{"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 tablic"}.
+{"Choose storage type of tables","Wybierz typ przechowalni tablic"}.
{"Choose whether to approve this entity's subscription.","Wybierz, czy akceptować subskrypcję tej jednostki"}.
-{"City","Miasto"}.
+{"City","Miasto: "}.
{"Commands","Polecenia"}.
{"Conference room does not exist","Pokój konferencyjny nie istnieje"}.
+{"Configuration for ","Konfiguracja dla "}.
{"Configuration","Konfiguracja"}.
-{"Configuration of room ~s","Konfiguracja pokoju ~s"}.
-{"Connected Resources:","Zasoby podłączone:"}.
-{"Connections parameters","Parametry połączenia"}.
-{"Country","Państwo"}.
-{"CPU Time:","Czas CPU:"}.
-{"Database","Baza danych"}.
+{"Connected Resources:","Zasoby podłączone"}.
+{"Country","Państwo: "}.
+{"CPU Time:","Czas CPU"}.
+{"Database","Baza"}.
{"Database Tables at ","Tabele bazy na "}.
-{"Database Tables Configuration at ","Konfiguracja tabel bazy do "}.
+{"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"}.
@@ -63,91 +61,74 @@
{"Deliver event notifications","Dostarczaj powiadomienia o zdarzeniach"}.
{"Deliver payloads with event notifications","Dołącz zawartość publikowanego przedmiotu podczas wysyłania powiadomienia o publikacji"}.
{"Description:","Opis:"}.
-{"Disc only copy","Kopia na dysku"}.
+{"Disc only copy","Kopia samego dysku"}.
{"Displayed Groups:","Wyświetlane grupy:"}.
{"Dump Backup to Text File at ","Zrzuć kopię zapasową do pliku tekstowego na "}.
{"Dump to Text File","Zrzucanie do pliku tekstowego"}.
{"Edit Properties","Edytuj właściwości"}.
-{"ejabberd IRC module","Moduł IRC ejabberd"}.
+{"ejabberd IRC module","Moduł IRC"}.
{"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 SOCKS5 Bytestreams module","Mudł SOCKS5 Bytestreams"}.
+{"ejabberd vCard module","Erlang Jabber Server"}.
{"ejabberd virtual hosts","wirtualne hosty ejabberda"}.
{"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"}.
+{"Encodings","Kodowania"}.
{"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 nickname you want to register","Wprowadz nicka 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 katalogu spool serwera jabberd14"}.
{"Enter path to jabberd14 spool file","Wprowadź ścieżkę do pliku spool dla serwera jabberd14"}.
{"Enter path to text file","Wprowadź scieżkę do pliku tekstowego"}.
-{"Enter the text you see","Wprowadź scieżkę do pliku tekstowego"}.
-{"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 kodowanie 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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Wprowadź nazwę użytkownika 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\"}]."}.
-{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Eksportuj dane wszystkich użytkowników serwera w formacie PIEFXIS files (XEP-0227):"}.
-{"Export data of users in a host to PIEFXIS files (XEP-0227):","Eksportuj dane użytkowników z hosta w formacie PIEFXIS files (XEP-0227):"}.
-{"Family Name","Nazwisko"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Przykład: [{\"wroclaw.irc.pl\",\"utf-8\"}, {\"warszawa.irc.pl\", \"iso8859-2\"}]."}.
+{"Family Name","Nazwisko rodowe: "}.
{"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)"}.
+{"Fill in fields to search for any matching Jabber User","Wypełnij pola aby znaleźdź 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ć pasujących użytkowników Jabbera (dodaj * na koniec pola aby dopasować)"}.
{"Friday","Piątek"}.
{"From","Od"}.
{"From ~s","Z ~s"}.
-{"Full Name","Pełna nazwa"}.
+{"Full Name","Pełna nazwa: "}.
{"Get Number of Online Users","Pokaż ilość użytkowników online"}.
{"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"}.
{"Group ","Grupa "}.
-{"Groups","Grupy"}.
+{"Groups","Grupy "}.
{"has been banned","został(a) zabanowany(a)"}.
{"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 parametrów pokoju: Tylko dla Członków"}.
{"has been kicked","został(a) kopnięty(a)"}.
-{" has set the subject to: ","zmienił(a) temat na: "}.
+{" has set the subject to: ","zmieł(a) temat na: "}.
{"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.","Jeśli chcesz ustawić inne hasło, port lub kodowanie dla poszczególnych serwerów IRC, wypełnij tą listę wartościami w formacie '{\"irc server\",\"encoding\", port, \"password\"}'. Domyślne ten serwis używa kodowania \"~s\", portu ~p, bez hasła."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Jeśli chcesz ustawić inne kodowanie dla serwerów IRC, wypełnij tą listę wartościami w formacie '{\"irc server\",\"encoding\"}'. Jako domyślne ten serwis używa kodowania \"~s\"."}.
{"Import Directory","Importuj katalog"}.
{"Import File","Importuj plik"}.
-{"Import user data from jabberd14 spool file:","Importuj dane użytkownika z pliku spool 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 files (XEP-0227):"}.
-{"Import users data from jabberd14 spool directory:","Importuj użytkowników z katalogu spool 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 spool serwera jabberd14"}.
+{"Import Users From jabberd14 Spool Files","Importuj użytkowników z plików spool serwera jabber 1.4"}.
{"Improper message type","Nieprawidłowy typ wiadomości"}.
{"Incorrect password","Nieprawidłowe hasło"}.
{"Invalid affiliation: ~s","Nieprawidłowe powiązanie: ~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 kanału IRC"}.
{"IRC Transport","Transport IRC"}.
{"IRC Username","Nazwa użytkownika"}.
-{"IRC username","Nazwa użytkownika IRC"}.
{"is now known as","jest teraz znany(a) 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 of type \"groupchat\"","Nie mozna wysyłac prywatnych wiadomości typu \"Groupchat\" "}.
{"It is not allowed to send private messages to the conference","Nie wolno wysyłac prywatnych wiadomości na konferencje"}.
{"It is not allowed to send private messages","Wysyłanie prywatnych wiadomości jest zabronione"}.
{"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"}.
+{"Jabber ID ~s is invalid","JID ~s jest niepoprawny"}.
{"joins the room","dołączył(a) się 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ść"}.
@@ -155,12 +136,11 @@
{"Last month","Ostatni miesiąc"}.
{"Last year","Ostatni rok"}.
{"leaves the room","opuścił(a) pokój"}.
-{"Listened Ports at ","Porty nasłuchujące na "}.
+{"Listened Ports at ","Porty nasłuchujące "}.
{"Listened Ports","Porty nasłuchujące"}.
{"List of modules to start","Lista modułów do uruchomienia"}.
-{"Low level update script","Aktualizacje niskiego poziomu"}.
+{"Low level update script","Skrypt update-u niskiego poziomu"}.
{"Make participants list public","Upublicznij listę uczestników"}.
-{"Make room captcha protected","Zabezpiecz pokój captchą"}.
{"Make room members-only","Utwórz pokój tylko dla uczestnikóww"}.
{"Make room moderated","Moderuj pokój"}.
{"Make room password protected","Zabezpiecz pokój hasłem"}.
@@ -172,200 +152,192 @@
{"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ść"}.
+{"Membership required to enter this room","Aby wejść do pokoju wymagane jest jego członkostwo"}.
{"Memory","Pamięć"}.
{"Message body","Treść wiadomości"}.
-{"Middle Name","Drugie imię"}.
+{"Middle Name","Nazwisko: "}.
{"Moderator privileges required","Wymagane prawa 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:"}.
+{"Name","Nazwa"}.
{"Never","Nigdy"}.
-{"Nickname","Nazwa użytkownika"}.
-{"Nickname Registration at ","Rejestracja użytkownika na "}.
+{"Nickname is already in use by another occupant","Nick jest używany przez innego użytkownika"}.
+{"Nickname is registered by another person","Nick jest już zarejestrowany przez inną osobę"}.
+{"Nickname","Nick "}.
+{"Nickname Registration at ","Rejestracja nicka na "}.
{"Nickname ~s does not exist in the room","Nick ~s nie istnieje w tym pokoju"}.
-{"No body provided for announce message","Adresat nie został podany"}.
+{"No body provided for announce message","Nikt nie jest uprawniony do rozsyłania oznajmień"}.
{"No Data","Brak danych"}.
-{"Node ID","ID węzła"}.
-{"Node not found","Węzeł nie znaleziony"}.
-{"Nodes","Węzły"}.
-{"Node ","Węzeł "}.
+{"Node ","Gałąź "}.
+{"Node ID","ID noda"}.
+{"Node not found","Gałąź nie znaleziona"}.
+{"Nodes","Gałęzie"}.
{"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 kiedy zostaną z węzeł usunięte jakieś elementy"}.
-{"Notify subscribers when the node configuration changes","Informuj subskrybentów gdy konfiguracja węzła się zmieni"}.
-{"Notify subscribers when the node is deleted","Informuj subskrybentów gdy węzeł zostanie skasowany"}.
+{"No resource provided","Brak dostarczonych zasobów"}.
+{"Notify subscribers when items are removed from the node","Informuj subskrybentów kiedy zostaną z gałęzi usunięte jakieś elementy"}.
+{"Notify subscribers when the node configuration changes","Informuj subskrybentów gdy konfiguracja gałęzi się zmieni"}.
+{"Notify subscribers when the node is deleted","Informuj subskrybentów gdy gałąż zostanie wykasowana"}.
{"November","Listopad"}.
{"Number of occupants","Liczba uczestników"}.
{"Number of online users","Ilość użytkowników online"}.
{"Number of registered users","Ilość zarejestrowanych użytkowników"}.
{"October","Październik"}.
-{"Offline Messages:","Wiadomości offline:"}.
+{"Offline Messages:","Wiadomości offline"}.
{"Offline Messages","Wiadomości offline"}.
{"OK","OK"}.
{"Online","Dostępny"}.
{"Online Users:","Użytkownicy online:"}.
{"Online Users","Użytkownicy zalogowani"}.
-{"Only deliver notifications to available users","Dostarczaj powiadomienia tylko do osiągalnych użytkowników"}.
-{"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 deliver notifications to available users","Dostarczaj notyfikacje tylko do osiągalnych użytkowników"}.
+{"Only moderators and participants are allowed to change subject in this room","Tylko moderatorzy i wlasciciele mogą zmienić temat tego pokoju"}.
+{"Only moderators are allowed to change subject in this room","Tylko moderatorzy mogą zmienić temat tego pokoju"}.
{"Only occupants are allowed to send messages to the conference","Tylko obecni mogą wysyłać wiadomości na konferencje"}.
{"Only occupants are allowed to send queries to the conference","Tylko użytkownicy mogą wysyłać zapytania do pokoju konferencyjnego"}.
-{"Only service administrators are allowed to send service messages","Jedynie administrator może wysyłać wiadomości"}.
+{"Only service administrators are allowed to send service messages","Jedynie administrator może wysyłać wiadomości serwisowe"}.
{"Options","Opcje"}.
-{"Organization Name","Nazwa organizacji"}.
-{"Organization Unit","Dział"}.
+{"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\t"}.
-{"Packet","Pakiet"}.
-{"Password ~b","Hasło ~b"}.
+{"Packet","Pakiet "}.
{"Password:","Hasło:"}.
{"Password","Hasło"}.
+{"Password required to enter this room","Aby wejść do pokoju wymagane jest hasło"}.
{"Password Verification","Weryfikacja hasła"}.
{"Path to Dir","Ścieżka do katalogu"}.
{"Path to File","Scieżka do pliku"}.
-{"Pending","Oczekiwanie"}.
-{"Period: ","Przedział czasu: "}.
-{"Persist items to storage","Przechowuj przedmioty pub/sub w bazie"}.
+{"Pending","Oczekiwanie "}.
+{"Period: ","Przedział czasu "}.
+{"Persist items to storage","Przechowuj przedmioty pub/sub w pamięci"}.
{"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."}.
{"Pong","Pong"}.
-{"Port ~b","Port ~b"}.
{"Port","Port"}.
-{"Present real Jabber IDs to","Kto może widzieć prawdziwe Jabber ID-y?"}.
+{"Present real Jabber IDs to","Kto może widzieć prawdziwe JID-y?"}.
{"private, ","prywatny, "}.
-{"Protocol","Protokół"}.
{"Publish-Subscribe","PubSub"}.
-{"PubSub subscriber request","Żądanie subskrybenta PubSub"}.
+{"PubSub subscriber request","Rządzanie subskrybenta PubSub"}.
{"Queries to the conference members are not allowed in this room","Zapytania do członków konferencji nie są dozwolone w tym pokoju"}.
-{"RAM and disc copy","Kopia na dysku i w pamięci RAM"}.
-{"RAM copy","Kopia w pamięci RAM"}.
-{"Raw","Surowy"}.
+{"RAM and disc copy","Kopia ramu i dysku"}.
+{"RAM copy","Kopia RAM"}.
+{"(Raw)","(Raw)"}.
+{"Raw","Raw"}.
{"Really delete message of the day?","Na pewno usunąć wiadomość dnia?"}.
{"Recipient is not in the conference room","Odbiorca nie jest obecny w pokoju"}.
{"Registered Users:","Użytkownicy zarejestrowani:"}.
{"Registered Users","Użytkownicy zarejestrowani"}.
{"Registration in mod_irc for ","Rejestracja w mod_irc dla "}.
-{"Remote copy","Kopia zdalna"}.
-{"Remove All Offline Messages","Usuń wszystkie wiadomości typu 'Offline'"}.
+{"Remark 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 backupują jedynie bazę Mnesia. Jeśli używasz modułu ODBC - musisz wykonać kopię SQL oddzielnie"}.
+{"Remote copy","Zdalna kopia"}.
{"Remove User","Usuń użytkownika"}.
-{"Remove","Usuń"}.
-{"Replaced by new connection","Zamienione przez nowe połączenie"}.
+{"Remove","Usuń "}.
+{"Replaced by new connection","Podmienione przez nowe połączenie"}.
{"Resources","Zasoby"}.
{"Restart","Restart"}.
{"Restart Service","Restart serwisu"}.
{"Restore Backup from File at ","Przywróć kopię zapasową z pliku na "}.
-{"Restore binary backup after next ejabberd restart (requires less memory):","Odtwórz kopię binarną podczas następnego restaru ejabberd-a (wymaga mniej pamięci):"}.
+{"Restore binary backup after next ejabberd restart (requires less memory):","Odtwórz kopię binarną podczas następnego restaru ejabberd-a (wymaga mniej pamięci)"}.
{"Restore binary backup immediately:","Natychmiast odtwórz kopię binarną:"}.
{"Restore","Odtwarzanie kopii"}.
-{"Restore plain text backup immediately:","Odtwórz kopię z czystego tekstu:"}.
+{"Restore plain text backup immediately:","Odtwórz kopię z czystego tekstu"}.
{"Room Configuration","Konfiguracja pokoju"}.
-{"Room creation is denied by service policy","Zasady serwera zabraniają tworzyć nowe pokoje"}.
-{"Room description","Opis pokoju"}.
-{"Room Occupants","Liczba uczestników"}.
+{"Room creation is denied by service policy","Tworzenie pokoju jest zabronione przez polisę"}.
{"Room title","Tytuł pokoju"}.
{"Roster groups allowed to subscribe","Grupy kontaktów które mogą się zapisać"}.
-{"Roster","Lista kontaktów"}.
-{"Roster of ","Lista kontaktów "}.
-{"Roster size","Rozmiar listy kontaktów"}.
-{"RPC Call Error","Błąd RPC"}.
-{"Running Nodes","Uruchomione węzły"}.
+{"Roster of ","Roster "}.
+{"Roster","Roster "}.
+{"Roster size","Rozmiar rostera"}.
+{"RPC Call Error","Błąd odwołania RPC"}.
+{"Running Nodes","Uruchomione gałęzie"}.
{"~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 użytkowników online na wszystkich hostach"}.
-{"Send announcement to all online users","Wyślij powiadomienie do wszystkich użytkowników online"}.
+{"Send announcement to all online users on all hosts","Wyślij oznajmienie do wszystkich użytkowników online na wszystkich hostach"}.
+{"Send announcement to all online users","Wyślij oznajmienie do wszystkich użytkowników online"}.
{"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"}.
+{"Send announcement to all users","Wyślij oznajmienie do wszystkich użytkowników"}.
{"September","Wrzesień"}.
-{"Server ~b","Serwer ~b"}.
{"Set message of the day and send to online users","Wyślij wiadomość dnia do wszystkich użytkowników online"}.
{"Set message of the day on all hosts and send to online users","Ustaw wiadomość dnia dla wszystkich hostów i wyślij do uzytkowników online"}.
-{"Shared Roster Groups","Wspólne grupy kontaktów"}.
+{"Shared Roster Groups","Grupy współdzielone"}.
{"Show Integral Table","Pokaż tabelę całkowitą"}.
{"Show Ordinary Table","Pokaż zwykłą tabelę"}.
{"Shut Down Service","Wyłączenie serwisu"}.
{"~s invites you to the room ~s","~s zaprasza Cię do pokoju ~s"}.
+{"Size","Wielkość"}.
+{"Specified nickname is already registered","Podany nick jest już zarejestrowany"}.
{"Specify the access model","Oznacz model dostępu"}.
{"Specify the publisher model","Oznacz model publikującego"}.
-{"~s's Offline Messages Queue","Kolejka wiadomości offline użytkownika ~s"}.
-{"Start Modules at ","Uruchom moduł na "}.
+{"~s's Offline Messages Queue","~s skolejkowanych wiadomości offline"}.
+{"Start Modules at ","Uruchom moduł o "}.
{"Start Modules","Uruchom moduły"}.
{"Start","Start"}.
{"Statistics of ~p","Statystyki ~p"}.
{"Statistics","Statystyki"}.
-{"Stop Modules at ","Zatrzymaj moduł na "}.
+{"Stop Modules at ","Zatrzymaj moduł o "}.
{"Stop Modules","Zatrzymaj moduły"}.
-{"Stopped Nodes","Zatrzymane węzły"}.
+{"Stopped Nodes","Zatrzymane gałęzie"}.
{"Stop","Stop"}.
{"Storage Type","Typ bazy"}.
{"Store binary backup:","Zachowaj kopię binarną:"}.
-{"Store plain text backup:","Zachowaj kopię w czystym tekście:"}.
+{"Store plain text backup:","Zachowaj kopię w czystym tekście"}.
{"Subject","Temat"}.
{"Submitted","Wprowadzone"}.
{"Submit","Wprowadź"}.
{"Subscriber Address","Adres subskrybenta"}.
-{"Subscription","Subskrypcja"}.
+{"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 collections with which a node is affiliated","Grupy do których należy węzeł"}.
{"the password is","hasło to"}.
-{"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 message","Ten uczestnik został wyrzucony z pokoju ponieważ wysłał błędną wiadomość"}.
+{"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ł błędą wiadomość do innego uczestnika"}.
{"This participant is kicked from the room because he sent an error presence","Ten uczestnik został wyrzucony z pokoju ponieważ informacja o statusie zawierała błędy"}.
-{"This room is not anonymous","Pokój nie jest anonimowy"}.
+{"This room is not anonymous","Pokój nie jest nieznany"}.
{"Thursday","Czwartek"}.
{"Time","Czas"}.
-{"Time delay","Czas zwłoki"}.
+{"Time delay","Opóźnienie czasu"}.
{"To","Do"}.
{"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:"}.
+{"Transactions Aborted:","Transakcje anulowane"}.
+{"Transactions Committed:","Transakcje zakończone"}.
+{"Transactions Logged:","Transakcje logowane"}.
+{"Transactions Restarted:","Transakcje uruchomione ponownie"}.
{"Tuesday","Wtorek"}.
-{"Unable to generate a captcha","Nie można wygenerować captcha"}.
-{"Unauthorized","Brak zezwolenia"}.
{"Update","Aktualizacja"}.
+{"Updated modules","Uaktualnione moduły"}.
{"Update message of the day (don't send)","Zmień wiadomość dnia (nie wysyłaj)"}.
{"Update message of the day on all hosts (don't send)","Odśwież wiadomośc dnia na wszystkich hostach (nie wysyłaj)"}.
-{"Update plan","Plan aktualizacji"}.
-{"Update script","Skrypt aktualizacji"}.
-{"Update ","Uaktualnij "}.
-{"Uptime:","Uptime:"}.
+{"Update plan","Uaktualnij plan"}.
+{"Update script","Uaktualnij skrypt"}.
+{"Update ","Uaktualnij"}.
+{"Uptime:","Uptime"}.
{"Use of STARTTLS required","Wymagane użycie STARTTLS"}.
{"User Management","Zarządzanie użytkownikami"}.
-{"Users are not allowed to register accounts so quickly","Nie możesz tak szybko rejestrować nowych kont"}.
+{"Users are not allowed to register accounts so fast","Nie możesz tak szybko rejestrować nowych kont"}.
{"Users Last Activity","Ostatnia aktywność użytkowników"}.
{"Users","Użytkownicy"}.
{"User ","Użytkownik "}.
-{"User","Użytkownik"}.
+{"User","Użytkownik: "}.
{"Validate","Zatwierdź"}.
{"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 ników"}.
{"Visitors are not allowed to send messages to all occupants","Odwiedzający nie mogą wysyłać wiadomości do wszystkich obecnych"}.
{"Wednesday","Środa"}.
{"When to send the last published item","Kiedy wysłać ostatnio opublikowaną rzecz"}.
{"Whether to allow subscriptions","Czy pozwolić na subskrypcje"}.
{"You have been banned from this room","Zostałeś zabanowany w tym pokoju"}.
-{"You must fill in field \"Nickname\" in the form","Musisz wypełnić pole \"Nazwa użytkownika\" w formularzu"}.
-{"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 register nickname","Potrzebujesz klienta obsługującego x:data aby zarejestrować nick"}.
-{"You need an x:data capable client to search","Potrzebujesz klienta obsługującego x:data aby wyszukiwać"}.
-{"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 messages to ~s are being blocked. To unblock them, visit ~s","Twoje wiadomości do użytkownika ~s są blokowane. Aby je odblokować, odwiedź ~s"}.
+{"You must fill in field \"Nickname\" in the form","Musisz wypełnić pole NICKNAME w formularzu"}.
+{"You need an x:data capable client to configure mod_irc settings","Potrzebujesz klienta kompatybilnego z x:data aby skonfigurować mod_irc"}.
+{"You need an x:data capable client to configure room","Potrzebujesz klienta kompatybilnego z x:data aby skonfigurować pokój"}.
+{"You need an x:data capable client to register nickname","Potrzebujesz klienta kompatybilnego z x:data aby zarejestrować nick"}.
+{"You need an x:data capable client to search","Potrzebujesz klienta kompatybilnego z x:data aby wyszukiwać"}.
+{"Your contact offline message queue is full. The message has been discarded.","Twoja kolejka wiadomoci offline jest pełna. Wiadomoć została odrzucona."}.
diff --git a/src/msgs/pl.po b/src/msgs/pl.po
index 590af0787..4f1e2c19a 100644
--- a/src/msgs/pl.po
+++ b/src/msgs/pl.po
@@ -1,40 +1,25 @@
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
-"Last-Translator: Zbyszek Żółkiewski \n"
+"Last-Translator: Zbyszek Żółkiewski\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: Marcin Owsiany\n"
"X-Additional-Translator: Andrzej Smyk\n"
"X-Additional-Translator: Mateusz Gajewski\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:663
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Wymagane użycie STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
-msgstr "Nie podano zasobu"
+msgstr "Brak dostarczonych zasobów"
-#: ejabberd_c2s.erl:1075
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
-msgstr "Zamienione przez nowe połączenie"
-
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Wprowadź scieżkę do pliku tekstowego"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-"Twoje wiadomości do użytkownika ~s są blokowane. Aby je odblokować, odwiedź "
-"~s"
-
-#: ejabberd_captcha.erl:235
-msgid "The captcha is valid."
-msgstr "Captcha jest poprawna."
+msgstr "Podmienione przez nowe połączenie"
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
@@ -52,25 +37,25 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Na pewno usunąć wiadomość dnia?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Temat"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Treść wiadomości"
#: mod_announce.erl:598
msgid "No body provided for announce message"
-msgstr "Adresat nie został podany"
+msgstr "Nikt nie jest uprawniony do rozsyłania oznajmień"
#: mod_announce.erl:633
msgid "Announcements"
-msgstr "Powiadomienia"
+msgstr "Oznajmienia"
#: mod_announce.erl:635
msgid "Send announcement to all users"
-msgstr "Wyślij powiadomienie do wszystkich użytkowników"
+msgstr "Wyślij oznajmienie do wszystkich użytkowników"
#: mod_announce.erl:637
msgid "Send announcement to all users on all hosts"
@@ -78,12 +63,12 @@ msgstr "Wyślij powiadomienie do wszystkich użytkowników na wszystkich hostach
#: mod_announce.erl:639
msgid "Send announcement to all online users"
-msgstr "Wyślij powiadomienie do wszystkich użytkowników online"
+msgstr "Wyślij oznajmienie do wszystkich użytkowników online"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr ""
-"Wyślij powiadomienie do wszystkich użytkowników online na wszystkich hostach"
+"Wyślij oznajmienie do wszystkich użytkowników online na wszystkich hostach"
#: mod_announce.erl:643
msgid "Set message of the day and send to online users"
@@ -111,1506 +96,1405 @@ msgid "Delete message of the day on all hosts"
msgstr "Usuń wiadomość dnia ze wszystkich hostów"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Konfiguracja"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
-msgstr "Baza danych"
+msgstr "Baza"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Uruchom moduły"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Zatrzymaj moduły"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Tworzenie kopii"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Odtwarzanie kopii"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Zrzucanie do pliku tekstowego"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importuj plik"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importuj katalog"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Restart serwisu"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Wyłączenie serwisu"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Dodaj użytkownika"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Usuń użytkownika"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Zakończ sesję uzytkownika"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Pobierz hasło użytkownika"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Zmień hasło użytkownika"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Pokaż czas ostatniego zalogowania uzytkownika"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Pobierz statystyki użytkownika"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Pokaż liczbę zarejestrowanych użytkowników"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Pokaż ilość użytkowników online"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Lista dostępowa"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
-msgstr "Kontrola dostępu"
+msgstr "Zasady dostępu"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Zarządzanie użytkownikami"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Użytkownicy zalogowani"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Wszyscy użytkownicy"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Wychodzące połączenia s2s"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
-msgstr "Uruchomione węzły"
+msgstr "Uruchomione gałęzie"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
-msgstr "Zatrzymane węzły"
+msgstr "Zatrzymane gałęzie"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Moduły"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Zarządzanie kopiami zapasowymi"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
-msgstr "Importuj użytkowników z plików spool serwera jabberd14"
+msgstr "Importuj użytkowników z plików spool serwera jabber 1.4"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Do ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Z ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
-msgstr "Konfiguracja tabel bazy do "
+msgstr "Konfiguracja tabel bazy na "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
-msgstr "Wybierz typ bazy dla tablic"
+msgstr "Wybierz typ przechowalni tablic"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
-msgstr "Kopia na dysku"
+msgstr "Kopia samego dysku"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
-msgstr "Kopia na dysku i w pamięci RAM"
+msgstr "Kopia ramu i dysku"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
-msgstr "Kopia w pamięci RAM"
+msgstr "Kopia RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
-msgstr "Kopia zdalna"
+msgstr "Zdalna kopia"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
-msgstr "Zatrzymaj moduł na "
+msgstr "Zatrzymaj moduł o "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Wybierz moduły do zatrzymania"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
-msgstr "Uruchom moduł na "
+msgstr "Uruchom moduł o "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Wprowadź listę {Moduł, [Opcje]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Lista modułów do uruchomienia"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Stwórz kopię do pliku na "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Wprowadź scieżkę do pliku kopii zapasowej"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Scieżka do pliku"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Przywróć kopię zapasową z pliku na "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Zrzuć kopię zapasową do pliku tekstowego na "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Wprowadź scieżkę do pliku tekstowego"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importuj użytkownika z pliku na "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Wprowadź ścieżkę do pliku spool dla serwera jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importuj użytkowników z katalogu na "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Wprowadź ścieżkę do katalogu spool serwera jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Ścieżka do katalogu"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
-msgstr "Czas zwłoki"
+msgstr "Opóźnienie czasu"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
-msgstr "Konfiguracja kontroli dostępu"
+msgstr "Konfiguracja listy dostępowej"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Lista dostępu"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Konfiguracja dostępu"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
-msgstr "Kontrola dostępu"
+msgstr "Zasady dostępu"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Hasło"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Weryfikacja hasła"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Ilość zarejestrowanych użytkowników"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Ilość użytkowników online"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nigdy"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Dostępny"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Ostatnie logowanie"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
-msgstr "Rozmiar listy kontaktów"
+msgstr "Rozmiar rostera"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Adresy IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Zasoby"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administracja "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Akcja dla użytkownika"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Edytuj właściwości"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Usuń użytkownika"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
-msgstr "Kontrola dostępu - dostęp zabroniony"
+msgstr "Dostęp zabroniony przez zabezpieczenia serwera"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Transport IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
-msgstr "Moduł IRC ejabberd"
+msgstr "Moduł IRC"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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"
+msgstr "Potrzebujesz klienta kompatybilnego z x:data aby skonfigurować mod_irc"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Rejestracja w mod_irc dla "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Wprowadź nazwę użytkownika i kodowanie których chcesz używać do łączenia z "
+"serwerami IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nazwa użytkownika"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"Jeśli chcesz ustawić inne hasło, port lub kodowanie dla poszczególnych "
-"serwerów IRC, wypełnij tą listę wartościami w formacie '{\"irc server\","
-"\"encoding\", port, \"password\"}'. Domyślne ten serwis używa kodowania \"~s"
-"\", portu ~p, bez hasła."
+"Jeśli chcesz ustawić inne kodowanie dla serwerów IRC, wypełnij tą listę "
+"wartościami w formacie '{\"irc server\",\"encoding\"}'. Jako domyślne ten "
+"serwis używa kodowania \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
"Przykład: [{\"wroclaw.irc.pl\",\"utf-8\"}, {\"warszawa.irc.pl\", \"iso8859-2"
"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Parametry połączenia"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Kodowania"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Dołącz do kanału IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Kanał IRC (nie używaj #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Serwer IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Dołącz do kanału IRC."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "Ustawienia kanału IRC"
-
-#: mod_irc/mod_irc.erl:851
-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 kodowanie 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:857
-msgid "IRC username"
-msgstr "Nazwa użytkownika IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Hasło ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Kodowanie znaków dla serwera ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Serwer ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
-msgstr "Jedynie administrator może wysyłać wiadomości"
+msgstr "Jedynie administrator może wysyłać wiadomości serwisowe"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
-msgstr "Zasady serwera zabraniają tworzyć nowe pokoje"
+msgstr "Tworzenie pokoju jest zabronione przez polisę"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Pokój konferencyjny nie istnieje"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Pokoje rozmów"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
-msgstr "Potrzebujesz klienta obsługującego x:data aby zarejestrować nick"
+msgstr "Potrzebujesz klienta kompatybilnego z x:data aby zarejestrować nick"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
-msgstr "Rejestracja użytkownika na "
+msgstr "Rejestracja nicka na "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
-msgstr "Wprowadz nazwę użytkownika którego chcesz zarejestrować"
+msgstr "Wprowadz nicka którego chcesz zarejestrować"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
-msgstr "Nazwa użytkownika"
+msgstr "Nick "
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Ta nazwa użytkownika jest już zarejestrowana przez inną osobę"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Podany nick jest już zarejestrowany"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
-msgstr "Musisz wypełnić pole \"Nazwa użytkownika\" w formularzu"
+msgstr "Musisz wypełnić pole NICKNAME w formularzu"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Moduł MUC"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Konfiguracja pokoju zmodyfikowana"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "dołączył(a) się do pokoju"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "opuścił(a) pokój"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "został(a) zabanowany(a)"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "został(a) kopnięty(a)"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "został wyrzucony z powodu zmiany przynależności"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr "został wyrzucony z powodu zmiany parametrów pokoju: Tylko dla Członków"
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "został wyrzucony z powodu wyłączenia systemu"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "jest teraz znany(a) jako"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
-msgstr "zmienił(a) temat na: "
+msgstr "zmieł(a) temat na: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Poniedziałek"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Wtorek"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Środa"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Czwartek"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Piątek"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Sobota"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Niedziela"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Styczeń"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Luty"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Marzec"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Kwiecień"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Maj"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Czerwiec"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Lipiec"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Sierpień"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Wrzesień"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Październik"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Listopad"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Grudzień"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Konfiguracja pokoju"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Liczba uczestników"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Tytuł pokoju"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Limit transferu przekroczony"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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"
+"Ten uczestnik został wyrzucony z pokoju ponieważ wysłał błędną wiadomość"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "Nie wolno wysyłac prywatnych wiadomości na konferencje"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Nieprawidłowy typ wiadomości"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
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 "
+"Ten uczestnik został wyrzucony z pokoju ponieważ wysłał błędą wiadomość do "
"innego uczestnika"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
-msgstr "Nie można wysyłać prywatnych wiadomości typu \"Groupchat\" "
+msgstr "Nie mozna wysyłac prywatnych wiadomości typu \"Groupchat\" "
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Odbiorca nie jest obecny w pokoju"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Tylko obecni mogą wysyłać wiadomości na konferencje"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Wysyłanie prywatnych wiadomości jest zabronione"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Tylko użytkownicy mogą wysyłać zapytania do pokoju konferencyjnego"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr "Zapytania do członków konferencji nie są dozwolone w tym pokoju"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "prywatny, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
-msgstr "Tylko moderatorzy i uczestnicy mogą zmienić temat tego pokoju"
+"Only moderators and participants are allowed to change subject in this room"
+msgstr "Tylko moderatorzy i wlasciciele mogą zmienić temat tego pokoju"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Tylko moderatorzy mogą zmienić temat tego pokoju"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Ten uczestnik został wyrzucony z pokoju ponieważ informacja o statusie "
"zawierała błędy"
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Uczestnicy tego pokoju nie mogą zmieniać swoich ników"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-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:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "Nick jest używany przez innego użytkownika"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Nick jest już zarejestrowany przez inną osobę"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Zostałeś zabanowany w tym pokoju"
-#: mod_muc/mod_muc_room.erl:1497
-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:1476
+msgid "Membership required to enter this room"
+msgstr "Aby wejść do pokoju wymagane jest jego członkostwo"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
-msgstr "Pokój nie jest anonimowy"
+msgstr "Pokój nie jest nieznany"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Aby wejść do pokoju wymagane jest hasło"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Nie można wygenerować captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Nieprawidłowe hasło"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Wymagane prawa administratora"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Wymagane prawa moderatora"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s jest niepoprawny"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Nick ~s nie istnieje w tym pokoju"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Nieprawidłowe powiązanie: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Nieprawidłowa rola: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Wymagane uprawnienia właściciela\t"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Konfiguracja pokoju ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Konfiguracja dla "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Opis pokoju"
+msgstr "Opis:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Utwórz pokój na stałe"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Pozwól wyszukiwać pokój"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Upublicznij listę uczestników"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Zabezpiecz pokój hasłem"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Maksymalna liczba uczestników"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Bez limitu"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Kto może widzieć prawdziwe Jabber ID-y?"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "tylko moderatorzy"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
-msgstr "ktokolwiek"
+msgstr "wszyscy"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Utwórz pokój tylko dla uczestnikóww"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Moderuj pokój"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Domyślni użytkownicy jako uczestnicy"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
-msgstr "Pozwól użytkownikom zmieniać temat"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
+msgstr "Pozwól użytkownikom zmienić tytuł pokoju"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Pozwól użytkownikom wysyłać prywatne wiadomości"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Pozwól użytkownikom pobierać informacje o innych użytkownikach"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Pozwól użytkownikom wysyłać zaproszenia"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Pozwól uczestnikom na zmianę nika"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Zabezpiecz pokój captchą"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Włącz logowanie"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
-msgstr "Potrzebujesz klienta obsługującego x:data aby skonfigurować pokój"
+msgstr "Potrzebujesz klienta kompatybilnego z x:data aby skonfigurować pokój"
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Liczba uczestników"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s zaprasza Cię do pokoju ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "hasło to"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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."
+"Twoja kolejka wiadomoci offline jest pełna. Wiadomoć została odrzucona."
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
-msgstr "Kolejka wiadomości offline użytkownika ~s"
+msgstr "~s skolejkowanych wiadomości offline"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Wprowadzone"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Czas"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Od"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Do"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
-msgstr "Pakiet"
+msgstr "Pakiet "
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Usuń zaznaczone"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
-msgstr "Wiadomości offline:"
+msgstr "Wiadomości offline"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Usuń wszystkie wiadomości typu 'Offline'"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Moduł SOCKS5 Bytestreams"
-#: mod_pubsub/mod_pubsub.erl:1074 mod_pubsub/mod_pubsub_odbc.erl:900
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "PubSub"
-#: mod_pubsub/mod_pubsub.erl:1171 mod_pubsub/mod_pubsub_odbc.erl:998
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Moduł Publish-Subscribe"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
-msgstr "Żądanie subskrybenta PubSub"
+msgstr "Rządzanie subskrybenta PubSub"
-#: mod_pubsub/mod_pubsub.erl:1456 mod_pubsub/mod_pubsub_odbc.erl:1287
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Wybierz, czy akceptować subskrypcję tej jednostki"
-#: mod_pubsub/mod_pubsub.erl:1462 mod_pubsub/mod_pubsub_odbc.erl:1293
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
-msgstr "ID węzła"
+msgstr "ID noda"
-#: mod_pubsub/mod_pubsub.erl:1467 mod_pubsub/mod_pubsub_odbc.erl:1298
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Adres subskrybenta"
-#: mod_pubsub/mod_pubsub.erl:1473 mod_pubsub/mod_pubsub_odbc.erl:1304
+#: mod_pubsub/mod_pubsub.erl:1016
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"
+msgstr "Pozwól temu Jabber ID na zapisanie się do tego noda pubsub"
-#: mod_pubsub/mod_pubsub.erl:3293 mod_pubsub/mod_pubsub_odbc.erl:3147
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr ""
"Dołącz zawartość publikowanego przedmiotu podczas wysyłania powiadomienia o "
"publikacji"
-#: mod_pubsub/mod_pubsub.erl:3294 mod_pubsub/mod_pubsub_odbc.erl:3148
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Dostarczaj powiadomienia o zdarzeniach"
-#: mod_pubsub/mod_pubsub.erl:3295 mod_pubsub/mod_pubsub_odbc.erl:3149
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
-msgstr "Informuj subskrybentów gdy konfiguracja węzła się zmieni"
+msgstr "Informuj subskrybentów gdy konfiguracja gałęzi się zmieni"
-#: mod_pubsub/mod_pubsub.erl:3296 mod_pubsub/mod_pubsub_odbc.erl:3150
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
-msgstr "Informuj subskrybentów gdy węzeł zostanie skasowany"
+msgstr "Informuj subskrybentów gdy gałąż zostanie wykasowana"
-#: mod_pubsub/mod_pubsub.erl:3297 mod_pubsub/mod_pubsub_odbc.erl:3151
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
-msgstr "Informuj subskrybentów kiedy zostaną z węzeł usunięte jakieś elementy"
+msgstr "Informuj subskrybentów kiedy zostaną z gałęzi usunięte jakieś elementy"
-#: mod_pubsub/mod_pubsub.erl:3298 mod_pubsub/mod_pubsub_odbc.erl:3152
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
-msgstr "Przechowuj przedmioty pub/sub w bazie"
+msgstr "Przechowuj przedmioty pub/sub w pamięci"
-#: mod_pubsub/mod_pubsub.erl:3299 mod_pubsub/mod_pubsub_odbc.erl:3153
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Przyjazna nazwa węzła"
-#: mod_pubsub/mod_pubsub.erl:3300 mod_pubsub/mod_pubsub_odbc.erl:3154
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Maksymalna ilość przechowywanych przedmiotów"
-#: mod_pubsub/mod_pubsub.erl:3301 mod_pubsub/mod_pubsub_odbc.erl:3155
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Czy pozwolić na subskrypcje"
-#: mod_pubsub/mod_pubsub.erl:3302 mod_pubsub/mod_pubsub_odbc.erl:3156
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Oznacz model dostępu"
-#: mod_pubsub/mod_pubsub.erl:3305 mod_pubsub/mod_pubsub_odbc.erl:3159
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Grupy kontaktów które mogą się zapisać"
-#: mod_pubsub/mod_pubsub.erl:3306 mod_pubsub/mod_pubsub_odbc.erl:3160
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Oznacz model publikującego"
-#: mod_pubsub/mod_pubsub.erl:3308 mod_pubsub/mod_pubsub_odbc.erl:3162
-#, fuzzy
-msgid "Specify the event message type"
-msgstr "Oznacz model dostępu"
-
-#: mod_pubsub/mod_pubsub.erl:3310 mod_pubsub/mod_pubsub_odbc.erl:3164
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Maksymalna wielkość powiadomienia w bajtach"
-#: mod_pubsub/mod_pubsub.erl:3311 mod_pubsub/mod_pubsub_odbc.erl:3165
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Kiedy wysłać ostatnio opublikowaną rzecz"
-#: mod_pubsub/mod_pubsub.erl:3313 mod_pubsub/mod_pubsub_odbc.erl:3167
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
-msgstr "Dostarczaj powiadomienia tylko do osiągalnych użytkowników"
+msgstr "Dostarczaj notyfikacje tylko do osiągalnych użytkowników"
-#: mod_pubsub/mod_pubsub.erl:3314 mod_pubsub/mod_pubsub_odbc.erl:3168
-msgid "The collections with which a node is affiliated"
-msgstr "Grupy do których należy węzeł"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Nie możesz tak szybko rejestrować nowych kont"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Brak"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
-msgstr "Subskrypcja"
+msgstr "Subskrypcja "
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
-msgstr "Oczekiwanie"
+msgstr "Oczekiwanie "
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
-msgstr "Grupy"
+msgstr "Grupy "
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Zatwierdź"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
-msgstr "Usuń"
+msgstr "Usuń "
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
-msgstr "Lista kontaktów "
+msgstr "Roster "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
-msgstr "Błędny format"
+msgstr "Zły format"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Dodaj Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
-msgstr "Lista kontaktów"
+msgstr "Roster "
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
-msgstr "Wspólne grupy kontaktów"
+msgstr "Grupy współdzielone"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Dodaj nowe"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Nazwa:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Opis:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Członkowie:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Wyświetlane grupy:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Grupa "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Wprowadź"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
-msgstr "Data urodzenia"
+msgstr "Data urodzenia: "
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
-msgstr "Miasto"
+msgstr "Miasto: "
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
-msgstr "Państwo"
+msgstr "Państwo: "
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Email"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
-msgstr "Nazwisko"
+msgstr "Nazwisko rodowe: "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
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)"
+"Wypełnij formularz aby wyszukać pasujących użytkowników Jabbera (dodaj * na "
+"koniec pola aby dopasować)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
-msgstr "Pełna nazwa"
+msgstr "Pełna nazwa: "
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
-msgstr "Drugie imię"
+msgstr "Nazwisko: "
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
-msgstr "Imię"
+msgstr "Nazwa"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
-msgstr "Nazwa organizacji"
+msgstr "Nazwa organizacji: "
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
-msgstr "Dział"
+msgstr "Dział: "
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Wyszukaj użytkowników w "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
-msgstr "Użytkownik"
+msgstr "Użytkownik: "
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
-msgstr "Potrzebujesz klienta obsługującego x:data aby wyszukiwać"
+msgstr "Potrzebujesz klienta kompatybilnego z x:data aby wyszukiwać"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Wyszukiwanie vCard użytkowników"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
-msgstr "Moduł vCard ejabberd"
+msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Wyniki wyszukiwania dla "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
-msgstr "Wypełnij pola aby znaleźć pasujących użytkowników Jabbera"
+msgstr "Wypełnij pola aby znaleźdź pasujących użytkowników Jabbera"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Brak zezwolenia"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd: Panel Administracyjny"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administracja"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Surowy"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Wirtualne hosty"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s konfiguracja zasad dostępu"
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
+msgid "Nodes"
+msgstr "Gałęzie"
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "wirtualne hosty ejabberda"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Użytkownicy"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Ostatnia aktywność użytkowników"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Przedział czasu: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Ostatni miesiąc"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Ostatni rok"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Cała aktywność"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Pokaż zwykłą tabelę"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Pokaż tabelę całkowitą"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
msgid "Statistics"
msgstr "Statystyki"
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Nie znaleziono"
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Użytkownicy"
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Węzeł nie znaleziony"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Host"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Użytkownicy zarejestrowani"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Wiadomości offline"
-
-#: web/ejabberd_web_admin.erl:1553
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
msgid "Last Activity"
msgstr "Ostatnia aktywność"
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Raw)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Raw"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s konfiguracja zasad dostępu"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "wirtualne hosty ejabberda"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Ostatnia aktywność użytkowników"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Przedział czasu "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Ostatni miesiąc"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Ostatni rok"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Cała aktywność"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Pokaż zwykłą tabelę"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Pokaż tabelę całkowitą"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Gałąź nie znaleziona"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Host"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Użytkownicy zarejestrowani"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Wiadomości offline"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
msgid "Registered Users:"
msgstr "Użytkownicy zarejestrowani:"
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
msgid "Online Users:"
msgstr "Użytkownicy online:"
-#: web/ejabberd_web_admin.erl:1615
+#: web/ejabberd_web_admin.erl:1443
msgid "Outgoing s2s Connections:"
msgstr "Wychodzące połączenia s2s:"
-#: web/ejabberd_web_admin.erl:1617
+#: web/ejabberd_web_admin.erl:1445
msgid "Outgoing s2s Servers:"
msgstr "Serwery zewnętrzne s2s:"
-#: web/ejabberd_web_admin.erl:1683
+#: web/ejabberd_web_admin.erl:1501
msgid "Change Password"
msgstr "Zmień hasło"
-#: web/ejabberd_web_admin.erl:1686
+#: web/ejabberd_web_admin.erl:1504
msgid "User "
msgstr "Użytkownik "
-#: web/ejabberd_web_admin.erl:1693
+#: web/ejabberd_web_admin.erl:1511
msgid "Connected Resources:"
-msgstr "Zasoby podłączone:"
+msgstr "Zasoby podłączone"
-#: web/ejabberd_web_admin.erl:1694
+#: web/ejabberd_web_admin.erl:1512
msgid "Password:"
msgstr "Hasło:"
-#: web/ejabberd_web_admin.erl:1755
+#: web/ejabberd_web_admin.erl:1567
msgid "No Data"
msgstr "Brak danych"
-#: web/ejabberd_web_admin.erl:1833
-msgid "Nodes"
-msgstr "Węzły"
-
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
-msgstr "Węzeł "
+msgstr "Gałąź "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Porty nasłuchujące"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Aktualizacja"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Restart"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Stop"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
-msgstr "Błąd RPC"
+msgstr "Błąd odwołania RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Tabele bazy na "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Typ bazy"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementy"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Wielkość"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Pamięć"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Błąd"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Kopia zapasowa "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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."
+"Te opcje backupują jedynie bazę Mnesia. Jeśli używasz modułu ODBC - musisz "
+"wykonać kopię SQL oddzielnie"
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Zachowaj kopię binarną:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Natychmiast odtwórz kopię binarną:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Odtwórz kopię binarną podczas następnego restaru ejabberd-a (wymaga mniej "
-"pamięci):"
+"pamięci)"
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
-msgstr "Zachowaj kopię w czystym tekście:"
+msgstr "Zachowaj kopię w czystym tekście"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
-msgstr "Odtwórz kopię z czystego tekstu:"
+msgstr "Odtwórz kopię z czystego tekstu"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr ""
-"Importuj dane użytkowników z pliku w formacie PIEFXIS files (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Eksportuj dane wszystkich użytkowników serwera w formacie PIEFXIS files (XEP-"
-"0227):"
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Eksportuj dane użytkowników z hosta w formacie PIEFXIS files (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importuj dane użytkownika z pliku spool serwera jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importuj użytkowników z katalogu spool serwera jabberd14"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
-msgstr "Porty nasłuchujące na "
+msgstr "Porty nasłuchujące "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Moduły na "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statystyki ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
-msgstr "Uptime:"
+msgstr "Uptime"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
-msgstr "Czas CPU:"
+msgstr "Czas CPU"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
-msgstr "Transakcje zakończone:"
+msgstr "Transakcje zakończone"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
-msgstr "Transakcje anulowane:"
+msgstr "Transakcje anulowane"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
-msgstr "Transakcje uruchomione ponownie:"
+msgstr "Transakcje uruchomione ponownie"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
-msgstr "Transakcje zalogowane:"
+msgstr "Transakcje zalogowane"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
-msgstr "Uaktualnij "
+msgstr "Uaktualnij"
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
-msgstr "Plan aktualizacji"
+msgstr "Uaktualnij plan"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Zmodyfikowane moduły"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Uaktualnione moduły"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
-msgstr "Skrypt aktualizacji"
+msgstr "Uaktualnij skrypt"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
-msgstr "Aktualizacje niskiego poziomu"
+msgstr "Skrypt update-u niskiego poziomu"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Sprawdź skrypt"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protokół"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Moduł"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opcje"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Usuń"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Start"
+
+#~ msgid "You must fill in field \"Icon\" in the form"
+#~ msgstr "Musisz wypełnić w formularzu pole \"Icon\""
+
+#~ msgid "You must fill in field \"Xml\" in the form"
+#~ msgstr "Musisz wypełnić w formularzu pole \"XML\""
diff --git a/src/msgs/pt-br.msg b/src/msgs/pt-br.msg
index ad8abb67a..d313e37ab 100644
--- a/src/msgs/pt-br.msg
+++ b/src/msgs/pt-br.msg
@@ -14,8 +14,8 @@
{"Administrator privileges required","Se necessita privilégios de administrador"}.
{"A friendly name for the node","Um nome familiar para o nó"}.
{"All activity","Toda la atividade"}.
-{"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 this Jabber ID to subscribe to this pubsub node?","Autorizar este JID para a inscrição neste tópico pubsub ?"}.
+{"Allow users to change 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"}.
@@ -24,7 +24,6 @@
{"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 copia de segurança"}.
@@ -45,9 +44,8 @@
{"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"}.
+{"Configuration for ","Configuração para "}.
{"Connected Resources:","Recursos conectados:"}.
-{"Connections parameters","Parametros para as Conexões"}.
{"Country","País"}.
{"CPU Time:","Tempo de CPU"}.
{"Database","Base de dados"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
{"ejabberd virtual hosts","Maquinas virtuais de ejabberd"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
-{"Elements","Elementos"}.
{"Email","e-mail"}.
{"Enable logging","Permitir criação de logs"}.
-{"Encoding for server ~b","Codificação para o servidor ~b"}.
+{"Encodings","Codificação"}.
{"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"}.
@@ -86,14 +83,9 @@
{"Enter path to jabberd14 spool dir","Introduza o caminho para o diretório de spools do jabberd14"}.
{"Enter path to jabberd14 spool file","Introduza o caminho para o arquivo de spool do jabberd14"}.
{"Enter path to text file","Introduza caminho para o arquivo de 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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Introduza o nome de usuário e codificações de caracteres que quer usar ao conectar-se aos servidores de 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\"}]."}.
-{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar dados de todos os usuários no servidor para arquivos PIEFXIS files (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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Exemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Nome de família"}.
{"February","Fevereiro"}.
{"Fill in fields to search for any matching Jabber User","Preencha campos para buscar usuários Jabber que concordem"}.
@@ -116,13 +108,10 @@
{"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)"}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Se deseja especificar codificações de caracteres diferentes para cada servidor IRC preencha esta lista com valores no formato '{\"servidor irc\", \"codificação\"}'. Este serviço usa por padrão a codificação \"~s\"."}.
{"Import Directory","Importar diretório"}.
{"Import File","Importar arquivo"}.
-{"Import user data from jabberd14 spool file:","Importar usuário de arquivo 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 a partir da 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"}.
@@ -130,24 +119,16 @@
{"Invalid affiliation: ~s","Afiliação não válida: ~s"}.
{"Invalid role: ~s","Rol 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","IRC Transport"}.
-{"IRC username","Nome de usuário no IRC"}.
{"IRC Username","Nome de usuário no 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 privados a la sala"}.
{"Jabber ID","ID Jabber"}.
-{"Jabber ID ~s is invalid","O Jabber ID ~s não es válido"}.
{"January","Janeiro"}.
-{"Join IRC channel","Entrar no canal IRC"}.
+{"Jabber ID ~s is invalid","O JID ~s não es válido"}.
{"joins the room","Entrar na sala"}.
-{"Join the IRC channel here.","Entrar no 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"}.
@@ -160,7 +141,6 @@
{"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"}.
@@ -171,14 +151,13 @@
{"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"}.
+{"Membership required to enter this room","Necessitas ser membro de esta sala para poder entrar"}.
{"Members:","Miembros:"}.
{"Memory","Memória"}.
{"Message body","Corpo da mensagem"}.
{"Middle Name","Apelido"}.
{"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"}.
@@ -187,6 +166,8 @@
{"Name","Nome"}.
{"Never","Nunca"}.
{"Nickname","Apelido"}.
+{"Nickname is already in use by another occupant","O nick já está sendo usado por outro ocupante"}.
+{"Nickname is registered by another person","O nick já está registrado por outra pessoa"}.
{"Nickname Registration at ","Registro do apelido em "}.
{"Nickname ~s does not exist in the room","O nick ~s não existe em la sala"}.
{"No body provided for announce message","Nenhum corpo de texto fornecido para anunciar mensagem"}.
@@ -198,7 +179,6 @@
{"No limit","Ilimitado"}.
{"None","Nenhum"}.
{"No resource provided","Recurso não foi fornecido"}.
-{"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"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Solo os moderadores y participantes podem cambiar o assunto de esta sala"}.
+{"Only moderators are allowed to change subject in this room","Solo os moderadores podem cambiar o assunto de esta sala"}.
{"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"}.
@@ -227,7 +207,7 @@
{"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 required to enter this room","Se necessita senha para entrar em esta sala"}.
{"Password:","Senha:"}.
{"Password","Senha"}.
{"Password Verification","Verificação de Senha"}.
@@ -237,26 +217,24 @@
{"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."}.
{"Pong","Pong"}.
-{"Port ~b","Porta ~b"}.
{"Port","Porta"}.
-{"Present real Jabber IDs to","Tornar o Jabber ID real visível por"}.
+{"Present real Jabber IDs to","Tornar o JID real visível por"}.
{"private, ","privado"}.
-{"Protocol","Porta"}.
{"Publish-Subscribe","Publicação de Tópico"}.
{"PubSub subscriber request","PubSub requisição de assinante"}.
{"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","Copia em RAM y disco"}.
{"RAM copy","Copia em RAM"}.
+{"(Raw)","(Intocado)"}.
{"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"}.
{"Registered Users:","Usuários registrados"}.
{"Registered Users","Usuários Registrados"}.
{"Registration in mod_irc for ","Registro em mod_irc para"}.
+{"Remark 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."}.
{"Remote copy","Copia remota"}.
-{"Remove All Offline Messages","Remover Todas as Mensagens Offline"}.
{"Remove","Borrar"}.
{"Remove User","Remover usuário"}.
{"Replaced by new connection","Substituído por nova conexão"}.
@@ -270,8 +248,6 @@
{"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"}.
@@ -289,7 +265,6 @@
{"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"}.
@@ -297,6 +272,8 @@
{"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"}.
+{"Size","Tamanho"}.
+{"Specified nickname is already registered","O apelido especificado já está registrado"}.
{"Specify the access model","Especificar os modelos de acesso"}.
{"Specify the publisher model","Especificar o modelo do publicante"}.
{"~s's Offline Messages Queue","~s's Fila de Mensagens Offline"}.
@@ -318,10 +295,6 @@
{"Subscriber Address","Enderç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 collections with which a node is affiliated","As coleções com as quais o nó está relacionado"}.
{"the password is","a senha é"}.
{"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."}.
@@ -338,10 +311,9 @@
{"Transactions Logged:","Transações de log:"}.
{"Transactions Restarted:","Transações restauradas:"}.
{"Tuesday","Terça"}.
-{"Unable to generate a captcha","Impossível gerar um captcha"}.
-{"Unauthorized","Não Autorizado"}.
{"Update ","Atualizar"}.
{"Update","Atualizar"}.
+{"Updated modules","Módulos atualizados"}.
{"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"}.
@@ -349,13 +321,14 @@
{"Uptime:","Uptime:"}.
{"Use of STARTTLS required","É obrigatório usar 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 are not allowed to register accounts so fast","Usuários ainda não podem registrar novas contas"}.
{"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","Maquinas 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"}.
{"Wednesday","Quarta"}.
@@ -365,7 +338,6 @@
{"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 register nickname","Você precisa de um cliente com suporte de x:data para poder registrar o nick"}.
+{"You need an x:data capable client to register nickname","Necessitas um cliente com suporte de x:data para poder registrar o nick"}.
{"You need an x:data capable client to search","Necessitas um cliente com suporte de x:data para poder buscar"}.
{"Your contact offline message queue is full. The message has been discarded.","Sua fila de mensagens offline esta cheia. Sua mensagem foi descartada"}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","Suas mensagens para ~s estão bloqueadas. Para desbloquea-las, visite: ~s"}.
diff --git a/src/msgs/pt-br.po b/src/msgs/pt-br.po
index 54ef36b56..5d7bd1a30 100644
--- a/src/msgs/pt-br.po
+++ b/src/msgs/pt-br.po
@@ -11,31 +11,18 @@ msgstr ""
"X-Additional-Translator: Felipe Brito Vasconcellos\n"
"X-Additional-Translator: Victor Hugo dos Santos\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "É obrigatório usar STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Recurso não foi fornecido"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Substituído por nova conexão"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Insira o texto que você vê"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -52,11 +39,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Deletar realmente a mensagem do dia?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Assunto"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Corpo da mensagem"
@@ -80,7 +67,7 @@ msgstr "Enviar aviso para todos os usuários em todos os hosts"
msgid "Send announcement to all online users"
msgstr "Enviar anúncio a todos os usuárions online"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anúncio a todos usuários online em todas as máquinas"
@@ -110,630 +97,572 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Configuração"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Base de dados"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Iniciar módulos"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Parar módulos"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Salvar cópia de segurança"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Restaurar"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Exportar para arquivo de texto"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importar arquivo"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importar diretório"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Reiniciar Serviço"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Parar Serviço"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Adicionar usuário"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Deletar Usuário"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Terminar Sessão do Usuário"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Obter Senha do Usuário"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Alterar Senha do Usuário"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Obter a Data do Último Login"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Obter Estatísticas do Usuário"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Obter Número de Usuários Registrados"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Obter Número de Usuários Online"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Listas de Controle de Acesso"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Regras de Aceso"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Gerenciamento de Usuários"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Usuários conectados"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Todos os usuários"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Conexões que partam de s2s"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nos em execução"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nos parados"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Módulos"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Gestão de copia de segurança"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuários de arquivos jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Para ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "De ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Configuração de Tabelas de Base de dados em "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Selecione o tipo de armazenamento das tabelas"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Copia em disco somente"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Copia em RAM y disco"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Copia em RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Copia remota"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Parar módulos em "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Selecione módulos a parar"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Iniciar módulos em "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Introduza lista de {módulo, [opções]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Listas de módulos para inicializar"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Salvar cópia de segurança para arquivo em "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Introduza o caminho do arquivo de cópia de segurança"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Caminho do arquivo"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Restaura cópia de segurança a partir do arquivo em "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Exporta cópia de segurança para arquivo de texto em "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Introduza caminho para o arquivo de texto"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importar usuário a partir do arquivo em "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Introduza o caminho para o arquivo de spool do jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importar usuários a partir do diretório em "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduza o caminho para o diretório de spools do jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Caminho para o diretório"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Intervalo de Tempo"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Configuração da Lista de Controle de Acesso"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Listas de Controle de Acesso"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Configuração de Acesso"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Regras de acesso"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "ID Jabber"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Senha"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Verificação de Senha"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Número de usuários registrados"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Número de usuários online"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nunca"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Conectado"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Último login"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Tamanho da Lista"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Endereços IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Recursos"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administração de "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Ação no usuário"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Editar propriedades"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Remover usuário"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Aceso denegado por la política do serviço"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Transport"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Módulo de IRC para ejabberd"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registro em mod_irc para"
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Introduza o nome de usuário e codificações de caracteres que quer usar ao "
+"conectar-se aos servidores de IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nome de usuário no IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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)"
+"Se deseja especificar codificações de caracteres diferentes para cada "
+"servidor IRC preencha esta lista com valores no formato '{\"servidor irc\", "
+"\"codificação\"}'. Este serviço usa por padrão a codificação \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Exemplo: [{\"irc.teste.net\", \"koi8-r\"}, 6667, \"senha\"}, {\"dominio.foo."
-"net\", \"iso8859-1\", 7000}, {\"irc.servidordeteste.net\", \"utf-8\"}]."
+"Exemplo: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Parametros para as Conexões"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Codificação"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Entrar no canal IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Canal IRC (não coloque o #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Servidor IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Entrar no canal IRC."
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "Entrar no canal IRC, neste ID Jabber: ~s"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "Configurações do IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Nome de usuário no IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Senha ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Porta ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Codificação para o servidor ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Servidor ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
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:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "La sala de conferencias não existe"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Salas de Chat"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
-"Você precisa de um cliente com suporte de x:data para poder registrar o nick"
+"Necessitas um cliente com suporte de x:data para poder registrar o nick"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registro do apelido em "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Introduza o apelido que quer registrar"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Apelido"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "O nick já está registrado por outra pessoa"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "O apelido especificado já está registrado"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Módulo de MUC para ejabberd"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Configuração da sala de bate-papo modificada"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "Entrar na sala"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "Sair da sala"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "foi banido"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "foi removido"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "foi desconectado porque por afiliação inválida"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "foi desconectado porque o sistema foi desligado"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "é agora conhecido como"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " a posto o assunto: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Segunda"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Terça"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Quarta"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Quinta"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Sexta"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Sábado"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Domingo"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Janeiro"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Fevereiro"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Março"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Abril"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Maio"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Junho"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Julho"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Agosto"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Setembro"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Outubro"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Novembro"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Dezembro"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Configuração de salas"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Número de participantes"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Título da sala"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Limite de banda excedido"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "Impedir o envio de mensagens privados a la sala"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Tipo de mensagem incorreto"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -741,490 +670,476 @@ 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:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
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:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Não é permitido enviar mensagens privadas"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privado"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr ""
-"Somente os moderadores e os participamentes podem alterar o assunto desta "
-"sala"
+"Solo os moderadores y participantes podem cambiar o assunto de esta sala"
-#: mod_muc/mod_muc_room.erl:806
-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:853
+msgid "Only moderators are allowed to change subject in this room"
+msgstr "Solo os moderadores podem cambiar o assunto de esta sala"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
-msgstr "O apelido (nick) já está sendo utilizado"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "O nick já está sendo usado por outro ocupante"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "O nick já está registrado por outra pessoa"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "As sido bloqueado em esta sala"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Necessitas ser membro de esta sala para poder entrar"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Essa sala não é anônima"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Se necessita senha para entrar em esta sala"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Impossível gerar um captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Senha incorreta"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Se necessita privilégios de administrador"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Se necessita privilégios de moderador"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "O Jabber ID ~s não es válido"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
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:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Afiliação não válida: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Rol não válido: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Se requere privilégios de proprietário da sala"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Configuração para ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Configuração para "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Descrição da Sala"
+msgstr "Descrição:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Tornar sala persistente"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Tornar sala pública possível de ser encontrada"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Tornar pública a lista de participantes"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Tornar protegida a senha da sala"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Número máximo de participantes"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Ilimitado"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Tornar o Jabber ID real visível por"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "apenas moderadores"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "qualquer um"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Tornar sala apenas para membros"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Tornar a sala moderada"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Usuários padrões como participantes"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Permitir a usuários modificar o assunto"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Permitir a usuários enviarem mensagens privadas"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Permitir a usuários pesquisar informações sobre os demais"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Permitir a usuários envio de convites"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr "Permitir atualizações de status aos visitantes"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Permitir mudança de apelido aos visitantes"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Tornar protegida a senha da sala"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Permitir criação de logs"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Número de participantes"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s convidou você para a sala ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "a senha é"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s's Fila de Mensagens Offline"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Submetido"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Fecha"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "De"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Para"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Pacote"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Remover os selecionados"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Mensagens offline"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Remover Todas as Mensagens Offline"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Modulo ejabberd SOCKS5 Bytestreams"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publicação de Tópico"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo para Publicar Tópicos do ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "PubSub requisição de assinante"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Aprovar esta assinatura."
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID do Tópico"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Enderço dos Assinantes"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Enviar payloads junto com as notificações de eventos"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Entregar as notificações de evento"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscritores quando cambia la configuração do nodo"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscritores quando o nodo se elimine"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Persistir elementos ao armazenar"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Um nome familiar para o nó"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Máximo # de elementos que persistem"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Permitir subscrições"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Especificar os modelos de acesso"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Listar grupos autorizados"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Especificar o modelo do publicante"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Máximo tamanho do payload em bytes"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Quando enviar o último tópico publicado"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Solo enviar notificações aos usuários disponíveis"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "As coleções com as quais o nó está relacionado"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "Usuários não estão autorizados a registrar contas imediatamente"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
+msgstr "Usuários ainda não podem registrar novas contas"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Nenhum"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Subscrição"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Pendente"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grupos"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validar"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Borrar"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Lista de contatos de "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Formato incorreto"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Adicionar ID jabber"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Lista de contatos"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Grupos Shared Roster"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Adicionar novo"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Nome:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Descrição:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Miembros:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Grupos Indicados"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Grupo "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Enviar"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber em Erlang"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Aniversário"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Cidade"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "País"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "e-mail"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Nome de família"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1232,383 +1147,353 @@ msgstr ""
"Preencha o formulário para buscar usuários Jabber. Agrega * ao final de um "
"campo para buscar sub-palavras."
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Nome completo"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Apelido"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nome"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Nome da organização"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unidade da organização"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Procurar usuários em "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Usuário"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Busca de Usuário vCard"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Módulo vCard para ejabberd"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Resultados de pesquisa para"
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Não Autorizado"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administração"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Intocado"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Maquinas Virtuais"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Configuração da Regra de Acesso ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Maquinas virtuais de ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Usuários"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Ultimas atividades dos usuários"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Período: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Último mês"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Último ano"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Toda la atividade"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Mostrar Tabela Ordinária"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Mostrar Tabela Integral"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Estatísticas"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Nào encontrado"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Nó não encontrado"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Máquina"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Usuários Registrados"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Mensagens offline"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Última atividade"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Usuários registrados"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Usuários online"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Conexões que partem de s2s"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Servidores que partem de s2s"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Mudar senha"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Usuário"
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Recursos conectados:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Senha:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Nenhum dado"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nós"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Estatísticas"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Usuários"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Última atividade"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Intocado)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Intocado"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Configuração da Regra de Acesso ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Maquinas virtuais de ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Ultimas atividades dos usuários"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Período: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Último mês"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Último ano"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Toda la atividade"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Mostrar Tabela Ordinária"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Mostrar Tabela Integral"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Nó não encontrado"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Máquina"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Usuários Registrados"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Mensagens offline"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Usuários registrados"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Usuários online"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Conexões que partem de s2s"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Servidores que partem de s2s"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Mudar senha"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Usuário"
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Recursos conectados:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Senha:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Nenhum dado"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nó"
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Portas escutadas"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Atualizar"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Reiniciar"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Parar"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Erro de chamada RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Tabelas de base de dados em"
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Tipo de armazenamento"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementos"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Tamanho"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memória"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Erro"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Backup de"
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Armazenar backup binário:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Restaurar backup binário imediatamente"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Armazenar backup plain text"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Restaurar backup plain text imediatamente:"
-#: web/ejabberd_web_admin.erl:1999
-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:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Exportar dados de todos os usuários no servidor para arquivos PIEFXIS files "
-"(XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importar usuário de arquivo jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importar dados dos usuários a partir da fila jabberd14"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Portas de escuta em "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Módulos em "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Estatísticas de ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Uptime:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Tempo de CPU"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transações:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transações abortadas:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transações restauradas:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transações de log:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Atualizar"
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Plano de Atualização"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr "Módulos atualizados"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Script de atualização"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Script de atualização low level"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Verificação de Script"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Porta"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Porta"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Módulo"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opções"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Eliminar"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Iniciar"
diff --git a/src/msgs/pt.msg b/src/msgs/pt.msg
index 9153e658e..415424f70 100644
--- a/src/msgs/pt.msg
+++ b/src/msgs/pt.msg
@@ -22,6 +22,7 @@
{"City","Cidade"}.
{"Conference room does not exist","A sala não existe"}.
{"Configuration","Configuração"}.
+{"Configuration for ","Configuração para "}.
{"Connected Resources:","Recursos conectados:"}.
{"Country","País"}.
{"Delete","Eliminar"}.
@@ -33,12 +34,14 @@
{"ejabberd IRC module","Módulo de IRC ejabberd"}.
{"ejabberd MUC module","Módulo MUC de ejabberd"}.
{"ejabberd vCard module","Módulo vCard de ejabberd"}.
+{"Encodings","Codificações"}.
{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Introduza o nome de utilizador e codificações de caracteres que quer usar ao conectar-se aos servidores de IRC"}.
{"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"}.
@@ -47,6 +50,7 @@
{"Full Name","Nome completo"}.
{"Groups","Grupos"}.
{" has set the subject to: "," colocou o tópico: "}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","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\"."}.
{"Import Directory","Importar directório"}.
{"Import File","Importar ficheiro"}.
{"Import User from File at ","Importar utilizador a partir do ficheiro em "}.
@@ -58,11 +62,12 @@
{"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"}.
+{"Jabber ID ~s is invalid","O JID ~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"}.
+{"Membership required to enter this room","É necessário ser membro desta sala para poder entrar"}.
{"Memory","Memória"}.
{"Middle Name","Segundo nome"}.
{"Moderator privileges required","São necessários privilégios de moderador"}.
@@ -71,6 +76,8 @@
{"Name","Nome"}.
{"Never","Nunca"}.
{"Nickname","Alcunha"}.
+{"Nickname is already in use by another occupant","A alcunha já está a ser usado por outro ocupante"}.
+{"Nickname is registered by another person","A alcunha já está registada por outra pessoa"}.
{"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"}.
@@ -81,6 +88,8 @@
{"OK","OK"}.
{"Online","Ligado"}.
{"Online Users","Utilizadores ligados"}.
+{"Only moderators and participants are allowed to change subject in this room","Só os moderadores e os participantes podem mudar o tópico desta sala"}.
+{"Only moderators are allowed to change subject in this room","Só os moderadores podem mudar o tópico desta sala"}.
{"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"}.
@@ -91,6 +100,7 @@
{"Packet","Pacote"}.
{"Password:","Palavra-chave:"}.
{"Password","Palavra-chave"}.
+{"Password required to enter this room","É necessária a palavra-chave para poder entrar nesta sala"}.
{"Path to Dir","Caminho para o directório"}.
{"Path to File","Caminho do ficheiro"}.
{"Pending","Pendente"}.
@@ -113,6 +123,8 @@
{"Running Nodes","Nodos a correr"}.
{"~s access rule configuration","Configuração das Regra de Acesso ~s"}.
{"Search users in ","Procurar utilizadores em "}.
+{"Size","Tamanho"}.
+{"Specified nickname is already registered","A alcunha especificada já está registada"}.
{"Start Modules at ","Iniciar os módulos em "}.
{"Start Modules","Iniciar módulos"}.
{"Statistics","Estatísticas"}.
diff --git a/src/msgs/pt.po b/src/msgs/pt.po
index e24d94cd6..eb158e93f 100644
--- a/src/msgs/pt.po
+++ b/src/msgs/pt.po
@@ -7,31 +7,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Portuguese (português)\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr ""
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Não foi passado nenhum recurso"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr ""
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-#, fuzzy
-msgid "Enter the text you see"
-msgstr "Introduza caminho para o ficheiro de texto"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-
-#: ejabberd_captcha.erl:235
-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 ""
@@ -49,12 +36,12 @@ msgstr ""
msgid "Really delete message of the day?"
msgstr ""
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
#, fuzzy
msgid "Subject"
msgstr "Enviar"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr ""
@@ -78,7 +65,7 @@ msgstr ""
msgid "Send announcement to all online users"
msgstr ""
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr ""
@@ -108,1607 +95,1479 @@ msgid "Delete message of the day on all hosts"
msgstr ""
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Configuração"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr ""
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Iniciar módulos"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Parar módulos"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Guardar cópia de segurança"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Restaurar"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Exportar para ficheiro de texto"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importar ficheiro"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importar directório"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
#, fuzzy
msgid "Restart Service"
msgstr "Reiniciar"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr ""
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Adicionar utilizador"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
#, fuzzy
msgid "Delete User"
msgstr "Eliminar"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr ""
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
#, fuzzy
msgid "Get User Password"
msgstr "Palavra-chave"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
#, fuzzy
msgid "Change User Password"
msgstr "Mudar palavra-chave"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr ""
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
#, fuzzy
msgid "Get User Statistics"
msgstr "Estatísticas"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
#, fuzzy
msgid "Get Number of Registered Users"
msgstr "Utilizadores registados"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
#, fuzzy
msgid "Get Number of Online Users"
msgstr "Utilizadores ligados"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Listas de Controlo de Acesso"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Regras de Acesso"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
#, fuzzy
msgid "User Management"
msgstr "Gestão da BD"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Utilizadores ligados"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Todos os utilizadores"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
#, fuzzy
msgid "Outgoing s2s Connections"
msgstr "Conexões S2S para fora"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nodos a correr"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nodos parados"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Módulos"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Gestão de cópias de segurança"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
#, fuzzy
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar utilizadores a partir de ficheiros da spool do jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "A ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "De ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
#, fuzzy
msgid "Database Tables Configuration at "
msgstr "Configuração de tabelas da BD em "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Seleccione o tipo de armazenagem das tabelas"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Cópia apenas em disco"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Cópia em RAM e em disco"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Cópia em RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Cópia remota"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Parar módulos em "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Seleccione os módulos a parar"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Iniciar os módulos em "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Introduza lista de {módulos, [opções]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Lista de módulos a iniciar"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Guardar cópia de segurança para ficheiro em "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Introduza o caminho do ficheiro de cópia de segurança"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Caminho do ficheiro"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Restaura cópia de segurança a partir do ficheiro em "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Exporta cópia de segurança para ficheiro de texto em "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Introduza caminho para o ficheiro de texto"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importar utilizador a partir do ficheiro em "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Introduza o caminho para o ficheiro de spool do jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importar utilizadores a partir do directório em "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduza o caminho para o directório de spools do jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Caminho para o directório"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr ""
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Configuração da Lista de Controlo de Acesso"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Listas de Controlo de Acesso"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Configuração de acessos"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Regras de acesso"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr ""
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Palavra-chave"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr ""
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
#, fuzzy
msgid "Number of registered users"
msgstr "Utilizadores registados"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
#, fuzzy
msgid "Number of online users"
msgstr "Utilizadores ligados"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nunca"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Ligado"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr ""
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
#, fuzzy
msgid "Roster size"
msgstr "Lista de contactos"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr ""
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
#, fuzzy
msgid "Resources"
msgstr "Restaurar"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administração de "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Acção no utilizador"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Editar propriedades"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Eliminar utilizador"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Acesso negado pela política de serviço"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr ""
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Módulo de IRC ejabberd"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registo no mod_irc para"
-#: mod_irc/mod_irc.erl:569
-#, fuzzy
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Nome do utilizador de IRC"
-#: mod_irc/mod_irc.erl:584
-#, fuzzy
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr ""
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Codificações"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:720
-#, fuzzy
-msgid "IRC server"
-msgstr "Nome do utilizador de IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr ""
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:851
-#, 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:857
-#, fuzzy
-msgid "IRC username"
-msgstr "Nome do utilizador de IRC"
-
-#: mod_irc/mod_irc.erl:906
-#, fuzzy
-msgid "Password ~b"
-msgstr "Palavra-chave"
-
-#: mod_irc/mod_irc.erl:911
-#, fuzzy
-msgid "Port ~b"
-msgstr "Porta"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr ""
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
#, fuzzy
msgid "Room creation is denied by service policy"
msgstr "Acesso negado pela política de serviço"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "A sala não existe"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr ""
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"É necessário um cliente com suporte de x:data para poder registar a alcunha"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registo da alcunha em "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Introduza a alcunha que quer registar"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Alcunha"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-#, fuzzy
-msgid "That nickname is registered by another person"
-msgstr "A alcunha já está registada por outra pessoa"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "A alcunha especificada já está registada"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
#, 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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Módulo MUC de ejabberd"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
#, fuzzy
msgid "Chatroom configuration modified"
msgstr "Configuração para "
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr ""
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr ""
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr ""
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr ""
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr ""
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr ""
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr ""
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " colocou o tópico: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr ""
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr ""
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr ""
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr ""
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr ""
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr ""
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr ""
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr ""
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr ""
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr ""
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr ""
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
#, fuzzy
msgid "November"
msgstr "Nunca"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr ""
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
#, fuzzy
msgid "Room Configuration"
msgstr "Configuração"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr ""
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Título da sala"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr ""
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Tipo de mensagem incorrecto"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "O destinatário não está na sala"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
#, 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:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privado"
-#: mod_muc/mod_muc_room.erl:801
-#, fuzzy
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr "Só os moderadores e os participantes podem mudar o tópico desta sala"
-#: mod_muc/mod_muc_room.erl:806
-#, fuzzy
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Só os moderadores podem mudar o tópico desta sala"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
#, 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:915 mod_muc/mod_muc_room.erl:1505
-#, fuzzy
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "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:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "A alcunha já está registada por outra pessoa"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Foi banido desta sala"
-#: mod_muc/mod_muc_room.erl:1497
-#, fuzzy
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "É necessário ser membro desta sala para poder entrar"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
#, fuzzy
msgid "This room is not anonymous"
msgstr "Tornar a sala anónima?"
-#: mod_muc/mod_muc_room.erl:1559
-#, fuzzy
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "É necessária a palavra-chave para poder entrar nesta sala"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr ""
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Palavra-chave incorrecta"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "São necessários privilégios de administrador"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "São necessários privilégios de moderador"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "O Jabber ID ~s não é válido"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "A alcunha ~s não existe na sala"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Afiliação inválida: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Papel inválido: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "São necessários privilégios de dono"
-#: mod_muc/mod_muc_room.erl:2820
-#, fuzzy
-msgid "Configuration of room ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
msgstr "Configuração para "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
#, fuzzy
msgid "Room description"
msgstr "Subscrição"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
#, fuzzy
msgid "Make room persistent"
msgstr "Tornar a sala permanente?"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
#, fuzzy
msgid "Make room public searchable"
msgstr "Tornar a sala publicamente visível?"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
#, fuzzy
msgid "Make participants list public"
msgstr "Tornar pública a lista de participantes?"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
#, fuzzy
msgid "Make room password protected"
msgstr "Proteger a sala com palavra-chave?"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
#, fuzzy
msgid "anyone"
msgstr "Nenhum"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
#, fuzzy
msgid "Make room members-only"
msgstr "Tornar a sala exclusiva a membros?"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Tornar a sala moderada"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
#, fuzzy
msgid "Default users as participants"
msgstr "Os utilizadores são membros por omissão?"
-#: mod_muc/mod_muc_room.erl:2896
+#: mod_muc/mod_muc_room.erl:2754
#, fuzzy
-msgid "Allow users to change the subject"
+msgid "Allow users to change subject"
msgstr "Permitir aos utilizadores mudar o tópico?"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
#, fuzzy
msgid "Allow users to send private messages"
msgstr "Permitir que os utilizadores enviem mensagens privadas?"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
#, fuzzy
msgid "Allow users to query other users"
msgstr "Permitir aos utilizadores consultar outros utilizadores?"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
#, fuzzy
msgid "Allow users to send invites"
msgstr "Permitir que os utilizadores enviem convites?"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr ""
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
#, fuzzy
msgid "Allow visitors to change nickname"
msgstr "Permitir aos utilizadores mudar o tópico?"
-#: mod_muc/mod_muc_room.erl:2917
-#, fuzzy
-msgid "Make room captcha protected"
-msgstr "Proteger a sala com palavra-chave?"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
#, fuzzy
msgid "Enable logging"
msgstr "Guardar históricos?"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr ""
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr ""
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
#, fuzzy
msgid "the password is"
msgstr "Mudar palavra-chave"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
#, fuzzy
msgid "~s's Offline Messages Queue"
msgstr "~s fila de mensagens diferidas"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
#, fuzzy
msgid "Submitted"
msgstr "enviado"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Data"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "De"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Para"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Pacote"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Eliminar os seleccionados"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
#, fuzzy
msgid "Offline Messages:"
msgstr "Mensagens diferidas:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-#, fuzzy
-msgid "Remove All Offline Messages"
-msgstr "Mensagens diferidas"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
#, fuzzy
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Módulo vCard de ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
#, fuzzy
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo pub/sub de ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
#, fuzzy
msgid "Node ID"
msgstr "Nodo"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr ""
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
+#: mod_register.erl:232
#, fuzzy
-msgid "Users are not allowed to register accounts so quickly"
+msgid "Users are not allowed to register accounts so fast"
msgstr "Os visitantes não podem enviar mensagens para todos os ocupantes"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Nenhum"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Subscrição"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Pendente"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grupos"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr ""
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Remover"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Lista de contactos de "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
#, fuzzy
msgid "Bad format"
msgstr "formato inválido"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
#, fuzzy
msgid "Add Jabber ID"
msgstr "Adicionar Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Lista de contactos"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
#, fuzzy
msgid "Shared Roster Groups"
msgstr "Lista de contactos partilhada"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Adicionar novo"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
#, fuzzy
msgid "Name:"
msgstr "Nome"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
#, fuzzy
msgid "Description:"
msgstr "Subscrição"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr ""
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr ""
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
#, fuzzy
msgid "Group "
msgstr "Grupos"
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Enviar"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber em Erlang"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Data de nascimento"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Cidade"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "País"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
#, fuzzy
msgid "Email"
msgstr "email"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Apelido"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
#, 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Nome completo"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Segundo nome"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Nome"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Nome da organização"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unidade da organização"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Procurar utilizadores em "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Utilizador"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr ""
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Módulo vCard de ejabberd"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
#, fuzzy
msgid "Search Results for "
msgstr "Procurar utilizadores em "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
#, fuzzy
msgid "ejabberd Web Admin"
msgstr "Administração do ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
#, fuzzy
msgid "Administration"
msgstr "Administração de "
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr ""
+
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
+msgid "Nodes"
+msgstr "Nodos"
+
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Estatísticas"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Utilizadores"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Última actividade"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+#, fuzzy
+msgid "(Raw)"
+msgstr "(modo texto)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
#, fuzzy
msgid "Raw"
msgstr "modo texto"
-#: web/ejabberd_web_admin.erl:997
+#: web/ejabberd_web_admin.erl:868
msgid "~s access rule configuration"
msgstr "Configuração das Regra de Acesso ~s"
-#: web/ejabberd_web_admin.erl:1015
+#: web/ejabberd_web_admin.erl:885
#, fuzzy
msgid "ejabberd virtual hosts"
msgstr "Estatísticas do ejabberd"
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Utilizadores"
-
-#: web/ejabberd_web_admin.erl:1058
+#: web/ejabberd_web_admin.erl:924
#, fuzzy
msgid "Users Last Activity"
msgstr "Última actividade"
-#: web/ejabberd_web_admin.erl:1060
+#: web/ejabberd_web_admin.erl:926
msgid "Period: "
msgstr ""
-#: web/ejabberd_web_admin.erl:1070
+#: web/ejabberd_web_admin.erl:936
msgid "Last month"
msgstr ""
-#: web/ejabberd_web_admin.erl:1071
+#: web/ejabberd_web_admin.erl:937
msgid "Last year"
msgstr ""
-#: web/ejabberd_web_admin.erl:1072
+#: web/ejabberd_web_admin.erl:938
#, fuzzy
msgid "All activity"
msgstr "Última actividade"
-#: web/ejabberd_web_admin.erl:1074
+#: web/ejabberd_web_admin.erl:940
msgid "Show Ordinary Table"
msgstr ""
-#: web/ejabberd_web_admin.erl:1076
+#: web/ejabberd_web_admin.erl:942
msgid "Show Integral Table"
msgstr ""
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Estatísticas"
-
-#: web/ejabberd_web_admin.erl:1097
-#, fuzzy
-msgid "Not Found"
-msgstr "Nodo não encontrado"
-
-#: web/ejabberd_web_admin.erl:1114
+#: web/ejabberd_web_admin.erl:971
msgid "Node not found"
msgstr "Nodo não encontrado"
-#: web/ejabberd_web_admin.erl:1441
+#: web/ejabberd_web_admin.erl:1273
#, fuzzy
msgid "Host"
msgstr "Nome do servidor"
-#: web/ejabberd_web_admin.erl:1442
+#: web/ejabberd_web_admin.erl:1274
#, fuzzy
msgid "Registered Users"
msgstr "Utilizadores registados"
-#: web/ejabberd_web_admin.erl:1552
+#: web/ejabberd_web_admin.erl:1382
#, fuzzy
msgid "Offline Messages"
msgstr "Mensagens diferidas"
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Última actividade"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
#, fuzzy
msgid "Registered Users:"
msgstr "Utilizadores registados"
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
#, fuzzy
msgid "Online Users:"
msgstr "Utilizadores ligados"
-#: web/ejabberd_web_admin.erl:1615
+#: web/ejabberd_web_admin.erl:1443
#, fuzzy
msgid "Outgoing s2s Connections:"
msgstr "Conexões S2S para fora"
-#: web/ejabberd_web_admin.erl:1617
+#: web/ejabberd_web_admin.erl:1445
#, fuzzy
msgid "Outgoing s2s Servers:"
msgstr "Servidores S2S de saída"
-#: web/ejabberd_web_admin.erl:1683
+#: web/ejabberd_web_admin.erl:1501
msgid "Change Password"
msgstr "Mudar palavra-chave"
-#: web/ejabberd_web_admin.erl:1686
+#: web/ejabberd_web_admin.erl:1504
msgid "User "
msgstr "Utilizador"
-#: web/ejabberd_web_admin.erl:1693
+#: web/ejabberd_web_admin.erl:1511
msgid "Connected Resources:"
msgstr "Recursos conectados:"
-#: web/ejabberd_web_admin.erl:1694
+#: web/ejabberd_web_admin.erl:1512
msgid "Password:"
msgstr "Palavra-chave:"
-#: web/ejabberd_web_admin.erl:1755
+#: web/ejabberd_web_admin.erl:1567
msgid "No Data"
msgstr ""
-#: web/ejabberd_web_admin.erl:1833
-msgid "Nodes"
-msgstr "Nodos"
-
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nodo"
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
#, fuzzy
msgid "Listened Ports"
msgstr "Portas em escuta em "
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Actualizar"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Reiniciar"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Parar"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
#, fuzzy
msgid "RPC Call Error"
msgstr "Erro na chamada RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
#, fuzzy
msgid "Database Tables at "
msgstr "Tabelas da BD em "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Tipo de armazenagem"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr ""
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Tamanho"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memória"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
#, fuzzy
msgid "Backup of "
msgstr "Guardar cópia de segurança"
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
#, fuzzy
msgid "Store binary backup:"
msgstr "Armazenar uma cópia de segurança no ficheiro"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
#, fuzzy
msgid "Restore binary backup immediately:"
msgstr "Recuperar uma cópia de segurança a partir de ficheiro"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr ""
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
#, fuzzy
msgid "Restore plain text backup immediately:"
msgstr "Recuperar uma cópia de segurança a partir de ficheiro"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2021
-#, 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:2028
-#, 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:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Portas em escuta em "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
#, fuzzy
msgid "Modules at "
msgstr "Parar módulos em "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
#, fuzzy
msgid "Statistics of ~p"
msgstr "Estatísticas"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
#, fuzzy
msgid "Uptime:"
msgstr "Tempo de funcionamento"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
#, fuzzy
msgid "CPU Time:"
msgstr "Tempo de processador consumido"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
#, fuzzy
msgid "Transactions Committed:"
msgstr "Transacções realizadas"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
#, fuzzy
msgid "Transactions Aborted:"
msgstr "Transacções abortadas"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
#, fuzzy
msgid "Transactions Restarted:"
msgstr "Transacções reiniciadas"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
#, fuzzy
msgid "Transactions Logged:"
msgstr "Transacções armazenadas"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
#, fuzzy
msgid "Update "
msgstr "Actualizar"
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
#, fuzzy
msgid "Update plan"
msgstr "Actualizar"
-#: web/ejabberd_web_admin.erl:2177
+#: web/ejabberd_web_admin.erl:1915
#, fuzzy
-msgid "Modified modules"
+msgid "Updated modules"
msgstr "Iniciar módulos"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
#, fuzzy
msgid "Update script"
msgstr "Actualizar"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr ""
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr ""
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Porta"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2350
-#, fuzzy
-msgid "Protocol"
-msgstr "Porta"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Módulo"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Opções"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Eliminar"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
#, fuzzy
msgid "Start"
msgstr "Reiniciar"
-#~ 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 "
diff --git a/src/msgs/ru.msg b/src/msgs/ru.msg
index bb16ca903..4ef272f95 100644
--- a/src/msgs/ru.msg
+++ b/src/msgs/ru.msg
@@ -14,8 +14,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Разрешить этому JID подписаться на данный узел?"}.
+{"Allow users to change subject","Разрешить пользователям изменять тему"}.
{"Allow users to query other users","Разрешить iq-запросы к пользователям"}.
{"Allow users to send invites","Разрешить пользователям посылать приглашения"}.
{"Allow users to send private messages","Разрешить приватные сообщения"}.
@@ -24,7 +24,6 @@
{"All Users","Все пользователи"}.
{"Announcements","Объявления"}.
{"anyone","всем участникам"}.
-{"A password is required to enter this room","Чтобы войти в эту конференцию, нужен пароль"}.
{"April","апреля"}.
{"August","августа"}.
{"Backup Management","Управление резервным копированием"}.
@@ -44,10 +43,9 @@
{"City","Город"}.
{"Commands","Команды"}.
{"Conference room does not exist","Конференция не существует"}.
-{"Configuration of room ~s","Конфигурация комнаты ~s"}.
+{"Configuration for ","Конфигурация "}.
{"Configuration","Конфигурация"}.
{"Connected Resources:","Подключённые ресурсы:"}.
-{"Connections parameters","Параметры соединения"}.
{"Country","Страна"}.
{"CPU Time:","Процессорное время:"}.
{"Database Tables at ","Таблицы базы данных на "}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard модуль"}.
{"ejabberd virtual hosts","Виртуальные хосты ejabberd"}.
{"ejabberd Web Admin","Web-интерфейс администрирования ejabberd"}.
-{"Elements","Элементы"}.
{"Email","Электронная почта"}.
{"Enable logging","Включить журналирование"}.
-{"Encoding for server ~b","Кодировка сервера ~b"}.
+{"Encodings","Кодировки"}.
{"End User Session","Завершить сеанс пользователя"}.
{"Enter list of {Module, [Options]}","Введите список вида {Module, [Options]}"}.
{"Enter nickname you want to register","Введите псевдоним, который Вы хотели бы зарегистрировать"}.
@@ -86,14 +83,9 @@
{"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-серверам"}.
+{"Enter username and encodings 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Примеры: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Фамилия"}.
{"February","февраля"}.
{"Fill in fields to search for any matching Jabber User","Заполните форму для поиска пользователя Jabber"}.
@@ -116,13 +108,10 @@
{"has been kicked","выгнали из комнаты"}.
{" has set the subject to: "," установил(а) тему: "}.
{"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.","Чтобы указать различные порты, пароли, кодировки для разных серверов IRC, заполните список значениями в формате '{\"сервер IRC\", \"кодировка\", порт, \"пароль\"}'. По умолчанию сервис использует кодировку \"~s\", порт ~p, пустой пароль."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Чтобы указать различные кодировки для разных серверов IRC, заполните список значениями в формате '{\"irc server\", \"encoding\"}'. По умолчанию эта служба использует кодировку \"~s\"."}.
{"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","Неправильный тип сообщения"}.
@@ -130,24 +119,16 @@
{"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 ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s недопустимый"}.
{"January","января"}.
-{"Join IRC channel","Присоединиться к каналу IRC"}.
+{"Jabber ID ~s is invalid","JID ~s недопустимый"}.
{"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","Последнее подключение"}.
@@ -160,7 +141,6 @@
{"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","Сделать комнату защищённой паролем"}.
@@ -171,14 +151,13 @@
{"Max # of items to persist","Максимальное число сохраняемых публикаций"}.
{"Max payload size in bytes","Максимальный размер полезной нагрузки в байтах"}.
{"May","мая"}.
-{"Membership is required to enter this room","В эту конференцию могут входить только её члены"}.
+{"Membership required to enter this room","В эту конференцию могут входить только её члены"}.
{"Members:","Члены:"}.
{"Memory","Память"}.
{"Message body","Тело сообщения"}.
{"Middle Name","Отчество"}.
{"Moderator privileges required","Требуются права модератора"}.
{"moderators only","только модераторам"}.
-{"Modified modules","Изменённые модули"}.
{"Modules at ","Модули на "}.
{"Modules","Модули"}.
{"Module","Модуль"}.
@@ -186,6 +165,8 @@
{"Name:","Название:"}.
{"Name","Название"}.
{"Never","Никогда"}.
+{"Nickname is already in use by another occupant","Псевдоним занят кем-то из присутствующих"}.
+{"Nickname is registered by another person","Псевдоним зарегистрирован кем-то другим"}.
{"Nickname Registration at ","Регистрация псевдонима на "}.
{"Nickname ~s does not exist in the room","Псевдоним ~s в комнате отсутствует"}.
{"Nickname","Псевдоним"}.
@@ -198,7 +179,6 @@
{"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","Уведомлять подписчиков об удалении сборника"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Только модераторы и участники могут изменять тему в этой комнате"}.
+{"Only moderators are allowed to change 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","Только администратор службы может посылать служебные сообщения"}.
@@ -227,7 +207,7 @@
{"Outgoing s2s Servers:","Исходящие s2s-серверы:"}.
{"Owner privileges required","Требуются права владельца"}.
{"Packet","Пакет"}.
-{"Password ~b","Пароль ~b"}.
+{"Password required to enter this room","Чтобы войти в эту конференцию, нужен пароль"}.
{"Password Verification","Проверка пароля"}.
{"Password:","Пароль:"}.
{"Password","Пароль"}.
@@ -237,26 +217,24 @@
{"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 участников видимыми"}.
+{"Present real Jabber IDs to","Сделать реальные JID участников видимыми"}.
{"private, ","приватная, "}.
-{"Protocol","Протокол"}.
{"Publish-Subscribe","Публикация-Подписка"}.
{"PubSub subscriber request","Запрос подписчика PubSub"}.
{"Queries to the conference members are not allowed in this room","Запросы к пользователям в этой конференции запрещены"}.
{"RAM and disc copy","ОЗУ и диск"}.
{"RAM copy","ОЗУ"}.
+{"(Raw)","(Необработанный формат)"}.
{"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 для "}.
+{"Remark 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), то его резервное копирование следует осуществлять отдельно."}.
{"Remote copy","не хранится локально"}.
-{"Remove All Offline Messages","Удалить все офлайновые сообщения"}.
{"Remove User","Удалить пользователя"}.
{"Remove","Удалить"}.
{"Replaced by new connection","Заменено новым соединением"}.
@@ -270,8 +248,6 @@
{"Restore","Восстановление из резервной копии"}.
{"Room Configuration","Конфигурация комнаты"}.
{"Room creation is denied by service policy","Cоздавать конференцию запрещено политикой службы"}.
-{"Room description","Описание комнаты"}.
-{"Room Occupants","Участники комнаты"}.
{"Room title","Название комнаты"}.
{"Roster groups allowed to subscribe","Группы списка контактов, которым разрешена подписка"}.
{"Roster of ","Ростер пользователя "}.
@@ -289,7 +265,6 @@
{"Send announcement to all users on all hosts","Разослать объявление всем пользователям на всех виртуальных серверах"}.
{"Send announcement to all users","Разослать объявление всем пользователям"}.
{"September","сентября"}.
-{"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","Группы общих контактов"}.
@@ -297,6 +272,8 @@
{"Show Ordinary Table","Показать обычную таблицу"}.
{"Shut Down Service","Остановить службу"}.
{"~s invites you to the room ~s","~s приглашает вас в комнату ~s"}.
+{"Size","Размер"}.
+{"Specified nickname is already registered","Указанный псевдоним уже зарегистрирован"}.
{"Specify the access model","Укажите механизм управления доступом"}.
{"Specify the publisher model","Условия публикации"}.
{"~s's Offline Messages Queue","Oчередь офлайновых сообщений ~s"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","Имя коллекции, в которую входит узел"}.
{"the password is","пароль:"}.
{"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","Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке"}.
@@ -338,8 +311,7 @@
{"Transactions Logged:","Транзакции запротоколированные:"}.
{"Transactions Restarted:","Транзакции перезапущенные:"}.
{"Tuesday","Вторник"}.
-{"Unable to generate a captcha","Не получилось создать капчу"}.
-{"Unauthorized","Не авторизован"}.
+{"Updated modules","Обновлённые модули"}.
{"Update message of the day (don't send)","Обновить сообщение дня (не рассылать)"}.
{"Update message of the day on all hosts (don't send)","Обновить сообщение дня на всех виртуальных серверах (не рассылать)"}.
{"Update plan","План обновления"}.
@@ -349,13 +321,14 @@
{"Uptime:","Время работы:"}.
{"Use of STARTTLS required","Вы обязаны использовать STARTTLS"}.
{"User Management","Управление пользователями"}.
-{"Users are not allowed to register accounts so quickly","Пользователи не могут регистрировать учётные записи так быстро"}.
+{"Users are not allowed to register accounts so fast","Пользователи не могут регистрировать учётные записи так быстро"}.
{"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","Среда"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Чтобы зарегистрировать псевдоним, требуется 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.","Очередь недоставленных сообщений Вашего адресата переполнена. Сообщение не было сохранено."}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ваши сообщения к ~s блокируются. Для снятия блокировки перейдите по ссылке ~s"}.
diff --git a/src/msgs/ru.po b/src/msgs/ru.po
index 70642b62e..f46e372b3 100644
--- a/src/msgs/ru.po
+++ b/src/msgs/ru.po
@@ -9,31 +9,18 @@ msgstr ""
"X-Additional-Translator: Konstantin Khomoutov\n"
"X-Additional-Translator: Sergei Golovan\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Вы обязаны использовать STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Не указан ресурс"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Заменено новым соединением"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Введите увиденный текст"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-"Ваши сообщения к ~s блокируются. Для снятия блокировки перейдите по ссылке ~s"
-
-#: ejabberd_captcha.erl:235
-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 "Команды"
@@ -50,11 +37,11 @@ msgstr "Понг"
msgid "Really delete message of the day?"
msgstr "Действительно удалить сообщение дня?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Тема"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Тело сообщения"
@@ -78,7 +65,7 @@ msgstr "Разослать объявление всем пользовател
msgid "Send announcement to all online users"
msgstr "Разослать объявление всем подключённым пользователям"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Разослать объявление всем подключённым пользователям на всех виртуальных "
@@ -111,623 +98,566 @@ msgid "Delete message of the day on all hosts"
msgstr "Удалить сообщение дня со всех виртуальных серверов"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Конфигурация"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "База данных"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Запуск модулей"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Остановка модулей"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Резервное копирование"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Восстановление из резервной копии"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Копирование в текстовый файл"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Импорт из файла"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Импорт из директории"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Перезапустить службу"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Остановить службу"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Добавить пользователя"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Удалить пользователя"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Завершить сеанс пользователя"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Получить пароль пользователя"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Изменить пароль пользователя"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Получить время последнего подключения пользователя"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Получить статистику по пользователю"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Получить количество зарегистрированных пользователей"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Получить количество подключённых пользователей"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Списки управления доступом"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Правила доступа"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Управление пользователями"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Подключённые пользователи"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Все пользователи"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Исходящие s2s-соединения"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Работающие узлы"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Остановленные узлы"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Модули"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Управление резервным копированием"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Импорт пользователей из спула jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "К ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "От ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Конфигурация таблиц базы данных на "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Выберите тип хранения таблиц"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "только диск"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "ОЗУ и диск"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "ОЗУ"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "не хранится локально"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Остановка модулей на "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Выберите модули, которые следует остановить"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Запуск модулей на "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Введите список вида {Module, [Options]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Список запускаемых модулей"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Резервное копирование в файл на "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Введите путь к резервному файлу"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Путь к файлу"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Восстановление из резервной копии на "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Копирование в текстовый файл на "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Введите путь к текстовому файлу"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Импорт пользователя из файла на "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Введите путь к файлу из спула jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Импорт пользователей из директории на "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Введите путь к директории спула jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Путь к директории"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "По истечение"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Конфигурация списков управления доступом"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Списки управления доступом"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Конфигурация доступа"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Правила доступа"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Пароль"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Проверка пароля"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Количество зарегистрированных пользователей"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Количество подключённых пользователей"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Никогда"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Подключён"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Время последнего подключения"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Размер списка контактов"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP адреса"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Ресурсы"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Администрирование "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Действие над пользователем"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Изменить параметры"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Удалить пользователя"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Доступ запрещён политикой службы"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Транспорт"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC модуль"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Чтобы настроить параметры mod_irc, требуется x:data-совместимый клиент"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Регистрация в mod_irc для "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-"Введите имя пользователя, кодировки, порты и пароли, которые будут "
-"использоваться при подключении к IRC-серверам"
+"Введите имя пользователя и кодировки, которые будут использоваться при "
+"подключении к IRC-серверам"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Имя пользователя IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"Чтобы указать различные порты, пароли, кодировки для разных серверов IRC, "
-"заполните список значениями в формате '{\"сервер IRC\", \"кодировка\", порт, "
-"\"пароль\"}'. По умолчанию сервис использует кодировку \"~s\", порт ~p, "
-"пустой пароль."
+"Чтобы указать различные кодировки для разных серверов IRC, заполните список "
+"значениями в формате '{\"irc server\", \"encoding\"}'. По умолчанию эта "
+"служба использует кодировку \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Пример: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Примеры: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Параметры соединения"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Кодировки"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Присоединиться к каналу IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Канал IRC (без символа #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "Сервер IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Присоединяйтесь к каналу IRC"
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "Присоединиться к каналу IRC с Jabber ID: ~s"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "Настройки IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Имя пользователя IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Пароль ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Порт ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Кодировка сервера ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Сервер ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "Только администратор службы может посылать служебные сообщения"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Cоздавать конференцию запрещено политикой службы"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Конференция не существует"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Комнаты"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr "Чтобы зарегистрировать псевдоним, требуется x:data-совместимый клиент"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Регистрация псевдонима на "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Введите псевдоним, который Вы хотели бы зарегистрировать"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Псевдоним"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Этот псевдоним зарегистрирован кем-то другим"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Указанный псевдоним уже зарегистрирован"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Вы должны заполнить поле \"Псевдоним\" в форме"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC модуль"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Конфигурация комнаты изменилась"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "вошёл(а) в комнату"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "вышел(а) из комнаты"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "запретили входить в комнату"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "выгнали из комнаты"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "выгнали из комнаты вследствие смены ранга"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr "выгнали из комнаты потому что она стала только для членов"
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "выгнали из комнаты из-за останова системы"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "изменил(а) имя на"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " установил(а) тему: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Понедельник"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Вторник"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Среда"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Четверг"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Пятница"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Суббота"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Воскресенье"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "января"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "февраля"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "марта"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "апреля"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "мая"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "июня"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "июля"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "августа"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "сентября"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "октября"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "ноября"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "декабря"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Конфигурация комнаты"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Участники комнаты"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Название комнаты"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Превышен лимит скорости посылки информации"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "Не разрешается посылать частные сообщения прямо в конференцию"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Неправильный тип сообщения"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -735,490 +665,477 @@ msgstr ""
"Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке "
"другому участнику"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Нельзя посылать частные сообщения типа \"groupchat\""
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Адресата нет в конференции"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Только присутствующим разрешается посылать сообщения в конференцию"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Запрещено посылать приватные сообщения"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Только присутствующим разрешается посылать запросы в конференцию"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr "Запросы к пользователям в этой конференции запрещены"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "приватная, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr "Только модераторы и участники могут изменять тему в этой комнате"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Только модераторы могут изменять тему в этой комнате"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Посетителям не разрешается посылать сообщения всем присутствующим"
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Этого участника выгнали из комнаты за то, что он послал присутствие с ошибкой"
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Посетителям запрещено изменять свои псевдонимы в этой комнате"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
-msgstr "Этот псевдоним уже знят другим участником"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "Псевдоним занят кем-то из присутствующих"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Псевдоним зарегистрирован кем-то другим"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Вам запрещено входить в эту конференцию"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "В эту конференцию могут входить только её члены"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Эта комната не анонимная"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Чтобы войти в эту конференцию, нужен пароль"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Не получилось создать капчу"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Неправильный пароль"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Требуются права администратора"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Требуются права модератора"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s недопустимый"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Псевдоним ~s в комнате отсутствует"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Недопустимый ранг: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Недопустимая роль: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Требуются права владельца"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Конфигурация комнаты ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Конфигурация "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Описание комнаты"
+msgstr "Описание:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Сделать комнату постоянной"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Сделать комнату видимой всем"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Сделать список участников видимым всем"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Сделать комнату защищённой паролем"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Максимальное количество участников"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Не ограничено"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Сделать реальные Jabber ID участников видимыми"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "только модераторам"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "всем участникам"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Комната только для зарегистрированных участников"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Сделать комнату модерируемой"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Сделать пользователей участниками по умолчанию"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Разрешить пользователям изменять тему"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Разрешить приватные сообщения"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Разрешить iq-запросы к пользователям"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Разрешить пользователям посылать приглашения"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Разрешить посетителям вставлять текcт статуса в сообщения о присутствии"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Разрешить посетителям изменять псевдоним"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Сделать комнату защищённой капчей"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Включить журналирование"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
msgstr "Чтобы сконфигурировать комнату, требуется x:data-совместимый клиент"
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Число присутствующих"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s приглашает вас в комнату ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "пароль:"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Очередь недоставленных сообщений Вашего адресата переполнена. Сообщение не "
"было сохранено."
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "Oчередь офлайновых сообщений ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Отправлено"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Время"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "От кого"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Кому"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Пакет"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Удалить выделенные"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Офлайновые сообщения:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Удалить все офлайновые сообщения"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams модуль"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Публикация-Подписка"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Модуль ejabberd Публикации-Подписки"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Запрос подписчика PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Решите: предоставить ли подписку этому объекту."
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID узла"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Адрес подписчика"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Разрешить этому Jabber ID подписаться на данный узел?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Доставлять вместе с уведомлениями o публикациях сами публикации"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Доставлять уведомления о событиях"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Уведомлять подписчиков об изменении конфигурации сборника"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Уведомлять подписчиков об удалении сборника"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr "Уведомлять подписчиков об удалении публикаций из сборника"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Сохранять публикации в хранилище"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Легко запоминаемое имя для узла"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Максимальное число сохраняемых публикаций"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Разрешить подписку"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Укажите механизм управления доступом"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Группы списка контактов, которым разрешена подписка"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Условия публикации"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Максимальный размер полезной нагрузки в байтах"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Когда посылать последний опубликованный элемент"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Доставлять уведомления только доступным пользователям"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Имя коллекции, в которую входит узел"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr "Выберите имя пользователя и пароль для регистрации на этом сервере"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Пользователи не могут регистрировать учётные записи так быстро"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Нет"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Подписка"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Ожидание"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Группы"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Утвердить"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Удалить"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Ростер пользователя "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Неправильный формат"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Добавить Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Ростер"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Группы общих контактов"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Добавить"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Название:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Описание:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Члены:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Видимые группы:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Группа "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Отправить"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "День рождения"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Город"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Страна"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Электронная почта"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Фамилия"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1226,239 +1143,242 @@ msgstr ""
"Заполните форму для поиска пользователя Jabber (Если добавить * в конец "
"поля, то происходит поиск подстроки)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Полное имя"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Отчество"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Название"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Название организации"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Отдел организации"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Поиск пользователей в "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Пользователь"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "Чтобы воспользоваться поиском, требуется x:data-совместимый клиент"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Поиск пользователей по vCard"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard модуль"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Результаты поиска в "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Заполните форму для поиска пользователя Jabber"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Не авторизован"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Web-интерфейс администрирования ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Администрирование"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Необработанный формат"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Виртуальные хосты"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Конфигурация правила доступа ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Виртуальные хосты ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Пользователи"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Статистика последнего подключения пользователей"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Период"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "За последний месяц"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "За последний год"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Вся статистика"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Показать обычную таблицу"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Показать интегральную таблицу"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Статистика"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Не Найдено"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Узел не найден"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Хост"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Зарегистрированные пользователи"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Офлайновые сообщения"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Последнее подключение"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Зарегистрированные пользователи:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Подключённые пользователи:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Исходящие s2s-серверы:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Исходящие s2s-серверы:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Сменить пароль"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Пользователь "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Подключённые ресурсы:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Пароль:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Нет данных"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Узлы"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Статистика"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Пользователи"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Последнее подключение"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Необработанный формат)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Необработанный формат"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Конфигурация правила доступа ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Виртуальные хосты ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Статистика последнего подключения пользователей"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Период"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "За последний месяц"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "За последний год"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Вся статистика"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Показать обычную таблицу"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Показать интегральную таблицу"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Узел не найден"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Хост"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Зарегистрированные пользователи"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Офлайновые сообщения"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Зарегистрированные пользователи:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Подключённые пользователи:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Исходящие s2s-серверы:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Исходящие s2s-серверы:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Сменить пароль"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Пользователь "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Подключённые ресурсы:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Пароль:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Нет данных"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Узел "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Прослушиваемые порты"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Обновить"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Перезапустить"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Остановить"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Ошибка вызова RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Таблицы базы данных на "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Тип таблицы"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Элементы"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Размер"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Память"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Ошибка"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Резервное копирование "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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 ""
"Заметьте, что здесь производится резервное копирование только встроенной "
@@ -1466,143 +1386,111 @@ msgstr ""
"(например с помощью модуля ODBC), то его резервное копирование следует "
"осуществлять отдельно."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Сохранить бинарную резервную копию:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "Продолжить"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Восстановить из бинарной резервной копии немедленно:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Восстановить из бинарной резервной копии при следующем запуске (требует "
"меньше памяти):"
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Сохранить текстовую резервную копию:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Восстановить из текстовой резервной копии немедленно:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Импорт пользовательских данных из файла формата PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Экспорт данных всех пользователей сервера в файлы формата PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Экспорт пользовательских данных домена в файлы формата PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Импорт пользовательских данных из буферного файла jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Импорт пользовательских данных из буферной директории jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Прослушиваемые порты на "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Модули на "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "статистика узла ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Время работы:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Процессорное время:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Транзакции завершенные:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Транзакции отмененные:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Транзакции перезапущенные:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Транзакции запротоколированные:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Обновление "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "План обновления"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Изменённые модули"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Обновлённые модули"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Сценарий обновления"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Низкоуровневый сценарий обновления"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Проверка сценария"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Порт"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Протокол"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Модуль"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Параметры"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Удалить"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Запустить"
diff --git a/src/msgs/sk.msg b/src/msgs/sk.msg
index f4f338cee..be3539991 100644
--- a/src/msgs/sk.msg
+++ b/src/msgs/sk.msg
@@ -14,8 +14,8 @@
{"Administrator privileges required","Sú potrebné práva administrátora"}.
{"A friendly name for the node","Prístupný názov pre uzol"}.
{"All activity","Všetky aktivity"}.
-{"Allow this Jabber ID to subscribe to this pubsub node?","Dovoliť tomuto Jabber ID odoberať PubSub uzol?"}.
-{"Allow users to change the subject","Povoliť užívateľom meniť tému"}.
+{"Allow this Jabber ID to subscribe to this pubsub node?","Dovoliť tomuto JID odoberať PubSub uzol?"}.
+{"Allow users to change subject","Povoliť užívateľom zmeniť tému tejto miestnosti"}.
{"Allow users to query other users","Povoliť užívateľom dotazovať sa informácie o iných užívateľoch"}.
{"Allow users to send invites","Povoliť používateľom posielanie pozvánok"}.
{"Allow users to send private messages","Povoliť užívateľom odosielať súkromné správy"}.
@@ -24,15 +24,14 @@
{"All Users","Všetci užívatelia"}.
{"Announcements","Oznámenia"}.
{"anyone","všetkým"}.
-{"A password is required to enter this room","Pre vstup do miestnosti je potrebné heslo"}.
{"April","Apríl"}.
{"August","August"}.
{"Backup Management","Správa zálohovania"}.
-{"Backup of ","Záloha "}.
+{"Backup of ","Záloha na "}.
{"Backup to File at ","Záloha do súboru na "}.
{"Backup","Zálohovať"}.
{"Bad format","Zlý formát"}.
-{"Birthday","Dátum narodenia"}.
+{"Birthday","Dátum narodenia: "}.
{"Change Password","Zmeniť heslo"}.
{"Change User Password","Zmeniť heslo užívateľa"}.
{"Chatroom configuration modified","Nastavenie diskusnej miestnosti bolo zmenené"}.
@@ -41,14 +40,13 @@
{"Choose modules to stop","Vyberte moduly, ktoré majú byť zastavené"}.
{"Choose storage type of tables","Vyberte typ úložiska pre tabuľky"}.
{"Choose whether to approve this entity's subscription.","Zvolte, či chcete povoliť toto odoberanie"}.
-{"City","Mesto"}.
+{"City","Mesto: "}.
{"Commands","Príkazy"}.
{"Conference room does not exist","Diskusná miestnosť neexistuje"}.
+{"Configuration for ","Konfigurácia pre "}.
{"Configuration","Konfigurácia"}.
-{"Configuration of room ~s","Konfigurácia miestnosti ~s"}.
{"Connected Resources:","Pripojené zdroje:"}.
-{"Connections parameters","Parametre spojenia"}.
-{"Country","Krajina"}.
+{"Country","Krajina: "}.
{"CPU Time:","Čas procesoru"}.
{"Database","Databáza"}.
{"Database Tables at ","Databázové tabuľky na "}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard modul"}.
{"ejabberd virtual hosts","ejabberd virtuálne servery"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
-{"Elements","Prvky"}.
{"Email","E-mail"}.
{"Enable logging","Zapnúť zaznamenávanie histórie"}.
-{"Encoding for server ~b","Kódovanie pre server ~b"}.
+{"Encodings","Kódovania"}.
{"End User Session","Ukončiť reláciu užívateľa"}.
{"Enter list of {Module, [Options]}","Vložte zoznam modulov {Modul, [Parametre]}"}.
{"Enter nickname you want to register","Zadajte prezývku, ktorú chcete registrovať"}.
@@ -86,15 +83,10 @@
{"Enter path to jabberd14 spool dir","Zadajte cestu k jabberd14 spool adresáru"}.
{"Enter path to jabberd14 spool file","Zadajte cestu k spool súboru jabberd14"}.
{"Enter path to text file","Zadajte cestu k textovému súboru"}.
-{"Enter the text you see","Zadajte zobrazený text"}.
-{"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.","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."}.
-{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Vložte meno používateľa, kódovanie, porty a heslo ktoré chcete používať pri pripojení na IRC server"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Vložte meno používateľa a kódovanie, ktoré chcete používať pri pripojení na IRC server"}.
{"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\"}].","Príklad: [{\"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):","Exportovať dáta všetkých uživateľov na serveri do súborov PIEFXIS (XEP-0227):"}.
-{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportovať dáta uživateľov na hostitelovi do súborov PIEFXIS (XEP-0227):"}.
-{"Family Name","Priezvisko"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Príklad: [{\"irc.freenode.net\",\"utf-8\"}, {\"irc.freenode.net\", \"iso8859-2\"}]."}.
+{"Family Name","Priezvisko: "}.
{"February","Február"}.
{"Fill in fields to search for any matching Jabber User","Vyplnte políčka pre vyhľadávanie Jabber užívateľa"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Pre vyhľadanie Jabber používateľa vyplňte formulár (pridajte znak * na koniec, pre vyhľadanie podreťazca)"}.
@@ -116,13 +108,10 @@
{"has been kicked","bol(a) vyhodený(á) z miestnosti"}.
{" has set the subject to: ","zmenil(a) tému na: "}.
{"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.","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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Ak chcete zadať iné kódovania pre IRC servery, vyplnte zoznam s hodnotami vo formáte '{\"irc server\",\"encoding\"}'. Predvolené kódovanie pre túto službu je \"~s\"."}.
{"Import Directory","Import adresára"}.
{"Import File","Import súboru"}.
-{"Import user data from jabberd14 spool file:","Importovať dáta užívateľov z jabberd14 spool súboru:"}.
{"Import User from File at ","Importovať užívateľa zo súboru na "}.
-{"Import users data from a PIEFXIS file (XEP-0227):","Importovat dáta užívateľov zo súboru PIEFXIS (XEP-0227):"}.
-{"Import users data from jabberd14 spool directory:","Importovať dáta užívateľov z jabberd14 spool adresára:"}.
{"Import Users from Dir at ","Importovať užívateľov z adresára na "}.
{"Import Users From jabberd14 Spool Files","Importovať užívateľov z jabberd14 spool súborov"}.
{"Improper message type","Nesprávny typ správy"}.
@@ -130,24 +119,16 @@
{"Invalid affiliation: ~s","Neplatné priradenie: ~s"}.
{"Invalid role: ~s","Neplatná rola: ~s"}.
{"IP addresses","IP adresa"}.
-{"IP","IP"}.
-{"IRC channel (don't put the first #)","IRC kanál (bez počiatočnej #)"}.
-{"IRC server","IRC server"}.
-{"IRC settings","Nastavania IRC"}.
{"IRC Transport","IRC Transport"}.
-{"IRC username","IRC prezývka"}.
{"IRC Username","IRC prezývka"}.
{"is now known as","sa premenoval(a) na"}.
{"It is not allowed to send private messages","Nieje povolené posielať súkromné správy"}.
{"It is not allowed to send private messages of type \"groupchat\"","Nie je dovolené odoslanie súkromnej správy typu \"Skupinová správa\" "}.
{"It is not allowed to send private messages to the conference","Nie je povolené odosielať súkromné správy do konferencie"}.
{"Jabber ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s je neplatné"}.
{"January","Január"}.
-{"Join IRC channel","Pripojit IRC kanál"}.
+{"Jabber ID ~s is invalid","JID ~s je neplatné"}.
{"joins the room","vstúpil(a) do miestnosti"}.
-{"Join the IRC channel here.","Propojiť IRC kanál sem."}.
-{"Join the IRC channel in this Jabber ID: ~s","Pripojit IRC kanál k tomuto Jabber ID: ~s"}.
{"July","Júl"}.
{"June","Jún"}.
{"Last Activity","Posledná aktivita"}.
@@ -160,7 +141,6 @@
{"List of modules to start","Zoznam modulov, ktoré majú byť spustené"}.
{"Low level update script","Nízkoúrovňový aktualizačný skript"}.
{"Make participants list public","Nastaviť zoznam zúčastnených ako verejný"}.
-{"Make room captcha protected","Chrániť miestnosť systémom captcha"}.
{"Make room members-only","Nastaviť miestnosť len pre členov"}.
{"Make room moderated","Nastaviť miestnosť ako moderovanú"}.
{"Make room password protected","Chrániť miestnosť heslom"}.
@@ -172,13 +152,12 @@
{"Max payload size in bytes","Maximálny náklad v bajtoch"}.
{"May","Máj"}.
{"Members:","Členovia:"}.
-{"Membership is required to enter this room","Pre vstup do miestnosti je potrebné byť členom"}.
+{"Membership required to enter this room","Pre vstup do miestnosti je potrebné byť členom"}.
{"Memory","Pamäť"}.
{"Message body","Telo správy"}.
{"Middle Name","Prostredné meno: "}.
{"Moderator privileges required","Sú potrebné práva moderátora"}.
{"moderators only","moderátorom"}.
-{"Modified modules","Modifikované moduly"}.
{"Module","Modul"}.
{"Modules at ","Moduly na "}.
{"Modules","Moduly"}.
@@ -186,6 +165,8 @@
{"Name:","Meno:"}.
{"Name","Meno"}.
{"Never","Nikdy"}.
+{"Nickname is already in use by another occupant","Prezývka je už používaná iným členom"}.
+{"Nickname is registered by another person","Prezývka je registrovaná inou osobou"}.
{"Nickname","Prezývka"}.
{"Nickname Registration at ","Registrácia prezývky na "}.
{"Nickname ~s does not exist in the room","Prezývka ~s v miestnosti neexistuje"}.
@@ -198,7 +179,6 @@
{"No limit","Bez limitu"}.
{"None","Nič"}.
{"No resource provided","Nebol poskytnutý žiadny zdroj"}.
-{"Not Found","Nebol nájdený"}.
{"Notify subscribers when items are removed from the node","Upozorniť prihlásených používateľov na odstránenie položiek z uzlu"}.
{"Notify subscribers when the node configuration changes","Upozorniť prihlásených používateľov na zmenu nastavenia uzlu"}.
{"Notify subscribers when the node is deleted","Upozorniť prihlásených používateľov na zmazanie uzlu"}.
@@ -214,8 +194,8 @@
{"Online Users:","Online používatelia:"}.
{"Online Users","Online užívatelia"}.
{"Only deliver notifications to available users","Doručovať upozornenia len aktuálne prihláseným používateľom"}.
-{"Only moderators and participants are allowed to change the subject in this room","Len moderátori a zúčastnený majú povolené meniť tému tejto miestnosti"}.
-{"Only moderators are allowed to change the subject in this room","Len moderátori majú povolené meniť tému miestnosti"}.
+{"Only moderators and participants are allowed to change subject in this room","Len moderátori a zúčastnený majú povolené meniť tému tejto miestnosti"}.
+{"Only moderators are allowed to change subject in this room","Len moderátori majú povolené meniť tému miestnosti"}.
{"Only occupants are allowed to send messages to the conference","Len členovia majú povolené zasielať správy do konferencie"}.
{"Only occupants are allowed to send queries to the conference","Len členovia majú povolené dotazovať sa o konferencii"}.
{"Only service administrators are allowed to send service messages","Iba správcovia služby majú povolené odosielanie servisných správ"}.
@@ -227,9 +207,9 @@
{"Outgoing s2s Servers:","Odchádzajúce s2s servery:"}.
{"Owner privileges required","Sú vyžadované práva vlastníka"}.
{"Packet","Paket"}.
-{"Password ~b","Heslo ~b"}.
{"Password:","Heslo:"}.
{"Password","Heslo"}.
+{"Password required to enter this room","Pre vstup do miestnosti je potrebné heslo"}.
{"Password Verification","Overenie hesla"}.
{"Path to Dir","Cesta k adresáru"}.
{"Path to File","Cesta k súboru"}.
@@ -237,26 +217,24 @@
{"Period: ","Čas:"}.
{"Persist items to storage","Uložiť položky natrvalo do úložiska"}.
{"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.","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."}.
{"Pong","Pong"}.
-{"Port ~b","Port ~b"}.
{"Port","Port"}.
-{"Present real Jabber IDs to","Zobrazovať skutočné Jabber ID"}.
+{"Present real Jabber IDs to","Zobrazovať skutočné JID"}.
{"private, ","súkromná, "}.
-{"Protocol","Protokol"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","Žiadosť odberateľa PubSub"}.
{"Queries to the conference members are not allowed in this room","Dotazovať sa o členoch nie je v tejto miestnosti povolené"}.
{"RAM and disc copy","Kópia RAM a disku"}.
{"RAM copy","Kópia RAM"}.
+{"(Raw)","(Raw)"}.
{"Raw","Raw"}.
{"Really delete message of the day?","Skutočne zmazať správu dňa?"}.
{"Recipient is not in the conference room","Príjemca sa nenachádza v konferenčnej miestnosti"}.
{"Registered Users:","Registrovaní používatelia:"}.
{"Registered Users","Registrovaní používatelia"}.
{"Registration in mod_irc for ","Registrácia do mod_irc na "}.
+{"Remark 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ýkame, že tieto nastavenia budú zálohované do zabudovanej Mnesia databázy. Ak používate ODBC modul, musíte zálohovať vašu SQL databázu separátne."}.
{"Remote copy","Vzdialená kópia"}.
-{"Remove All Offline Messages","Odstrániť všetky offline správy"}.
{"Remove","Odstrániť"}.
{"Remove User","Odstrániť užívateľa"}.
{"Replaced by new connection","Nahradené novým spojením"}.
@@ -270,8 +248,6 @@
{"Restore plain text backup immediately:","Okamžite obnoviť zálohu z textového súboru:"}.
{"Room Configuration","Nastavenia miestnosti"}.
{"Room creation is denied by service policy","Vytváranie miestnosti nie je povolené"}.
-{"Room description","Popis miestnosti"}.
-{"Room Occupants","Ľudí v miestnosti"}.
{"Room title","Názov miestnosti"}.
{"Roster groups allowed to subscribe","Skupiny kontaktov, ktoré môžu odoberať"}.
{"Roster of ","Zoznam kontaktov "}.
@@ -289,7 +265,6 @@
{"Send announcement to all users","Odoslať oznam všetkým používateľom"}.
{"Send announcement to all users on all hosts","Poslať oznámenie všetkým užívateľom na všetkých serveroch"}.
{"September","September"}.
-{"Server ~b","Server ~b"}.
{"Set message of the day and send to online users","Nastaviť správu dňa a odoslať ju online používateľom"}.
{"Set message of the day on all hosts and send to online users","Nastaviť správu dňa na všetkých serveroch a poslať ju online užívateľom"}.
{"Shared Roster Groups","Skupiny pre zdieľaný zoznam kontaktov"}.
@@ -297,6 +272,8 @@
{"Show Ordinary Table","Zobraziť bežnú tabuľku"}.
{"Shut Down Service","Vypnúť službu"}.
{"~s invites you to the room ~s","~s Vás pozýva do miestnosti ~s"}.
+{"Size","Veľkosť"}.
+{"Specified nickname is already registered","Zadaná prezývka je už registrovaná"}.
{"Specify the access model","Uveďte model prístupu"}.
{"Specify the publisher model","Špecifikovať model publikovania"}.
{"~s's Offline Messages Queue","~s Offline správy"}.
@@ -308,7 +285,7 @@
{"Stop Modules at ","Zastaviť moduly na "}.
{"Stop Modules","Zastaviť moduly"}.
{"Stopped Nodes","Zastavené uzly"}.
-{"Stop","Zastaviť"}.
+{"Stop","Stop"}.
{"Storage Type","Typ úložiska"}.
{"Store binary backup:","Uložiť binárnu zálohu:"}.
{"Store plain text backup:","Uložiť zálohu do textového súboru:"}.
@@ -318,10 +295,6 @@
{"Subscriber Address","Adresa odberateľa"}.
{"Subscription","Prihlásenie"}.
{"Sunday","Nedeľa"}.
-{"That nickname is already in use by another occupant","Prezývka je už používaná iným členom"}.
-{"That nickname is registered by another person","Prezývka je už zaregistrovaná inou osobou"}.
-{"The captcha is valid.","Platná captcha."}.
-{"The collections with which a node is affiliated","Kolekcie asociované s uzlom"}.
{"the password is","heslo je"}.
{"This participant is kicked from the room because he sent an error message to another participant","Účastník bol vyhodený z miestnosti, pretože poslal chybovú správu inému účastníkovi"}.
{"This participant is kicked from the room because he sent an error message","Účastník bol vyhodený z miestnosti, pretože poslal chybovú správu"}.
@@ -338,10 +311,9 @@
{"Transactions Logged:","Transakcie zaznamenaná"}.
{"Transactions Restarted:","Transakcie reštartovaná"}.
{"Tuesday","Utorok"}.
-{"Unable to generate a captcha","Nepodarilo sa vygenerovat captcha"}.
-{"Unauthorized","Neautorizovaný"}.
{"Update ","Aktualizovať "}.
{"Update","Aktualizovať"}.
+{"Updated modules","Aktualizované moduly"}.
{"Update message of the day (don't send)","Aktualizovať správu dňa (neodosielať)"}.
{"Update message of the day on all hosts (don't send)","Upraviť správu dňa na všetkých serveroch"}.
{"Update plan","Aktualizovať plán"}.
@@ -350,12 +322,13 @@
{"Use of STARTTLS required","Použitie STARTTLS je vyžadované"}.
{"User Management","Správa užívateľov"}.
{"User ","Používateľ "}.
-{"Users are not allowed to register accounts so quickly","Nieje dovolené vytvárať účty tak rýchlo po sebe"}.
+{"Users are not allowed to register accounts so fast","Nieje možné vytvárať účty tak rýchlo po sebe"}.
{"Users Last Activity","Posledná aktivita používateľa"}.
{"Users","Používatelia"}.
-{"User","Užívateľ"}.
+{"User","Užívateľ: "}.
{"Validate","Overiť"}.
{"vCard User Search","Hľadať užívateľov vo vCard"}.
+{"Virtual Hosts","Virtuálne servery"}.
{"Visitors are not allowed to change their nicknames in this room","V tejto miestnosti nieje povolené meniť prezývky"}.
{"Visitors are not allowed to send messages to all occupants","Návštevníci nemajú povolené zasielať správy všetkým prihláseným do konferencie"}.
{"Wednesday","Streda"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Na registráciu prezývky potrebujete klienta podporujúceho z x:data"}.
{"You need an x:data capable client to search","Na vyhľadávanie potrebujete klienta podporujúceho x:data"}.
{"Your contact offline message queue is full. The message has been discarded.","Fronta offline správ tohoto kontaktu je plná. Správa bola zahodená."}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","Správa určená pre ~s bola zablokovaná. Oblokovať ju môžete na ~s"}.
diff --git a/src/msgs/sk.po b/src/msgs/sk.po
index cc0e30196..1501c2f51 100644
--- a/src/msgs/sk.po
+++ b/src/msgs/sk.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
-"Last-Translator: Marek Bečka\n"
+"Last-Translator: Marek Becka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -9,30 +9,18 @@ msgstr ""
"X-Additional-Translator: Juraj Michalek\n"
"X-Additional-Translator: SkLUG\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Použitie STARTTLS je vyžadované"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Nebol poskytnutý žiadny zdroj"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Nahradené novým spojením"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Zadajte zobrazený text"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -49,11 +37,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Skutočne zmazať správu dňa?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Predmet"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Telo správy"
@@ -77,7 +65,7 @@ msgstr "Poslať oznámenie všetkým užívateľom na všetkých serveroch"
msgid "Send announcement to all online users"
msgstr "Odoslať zoznam všetkým online používateľom"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
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"
@@ -107,622 +95,565 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Konfigurácia"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Databáza"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Spustiť moduly"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Zastaviť moduly"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Zálohovať"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Obnoviť"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Uložiť do textového súboru"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Import súboru"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Import adresára"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Reštartovať službu"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Vypnúť službu"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Pridať používateľa"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Vymazať užívateľa"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Ukončiť reláciu užívateľa"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Zobraziť heslo užívateľa"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Zmeniť heslo užívateľa"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Zobraziť čas posledného prihlásenia"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Zobraziť štatistiku užívateľa"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Zobraziť počet registrovaných užívateľov"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Zobraziť počet pripojených užívateľov"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Zoznamy prístupových oprávnení (ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Prístupové pravidlá"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Správa užívateľov"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Online užívatelia"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Všetci užívatelia"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Odchádzajúce s2s spojenia"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Bežiace uzly"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Zastavené uzly"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Moduly"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Správa zálohovania"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importovať užívateľov z jabberd14 spool súborov"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Pre ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Od ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Konfigurácia databázových tabuliek "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Vyberte typ úložiska pre tabuľky"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Len kópia disku"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Kópia RAM a disku"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Kópia RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Vzdialená kópia"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Zastaviť moduly na "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Vyberte moduly, ktoré majú byť zastavené"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Spustiť moduly na "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Vložte zoznam modulov {Modul, [Parametre]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Zoznam modulov, ktoré majú byť spustené"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Záloha do súboru na "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Zadajte cestu k súboru so zálohou"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Cesta k súboru"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Obnoviť zálohu zo súboru na "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Uložiť zálohu do textového súboru na "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Zadajte cestu k textovému súboru"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importovať užívateľa zo súboru na "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Zadajte cestu k spool súboru jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importovať užívateľov z adresára na "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Zadajte cestu k jabberd14 spool adresáru"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Cesta k adresáru"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Časový posun"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Konfigurácia zoznamu prístupových oprávnení (ACL)"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Zoznamy prístupových oprávnení (ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Konfigurácia prístupu"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Prístupové pravidlá"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Heslo"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Overenie hesla"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Počet registrovaných užívateľov"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Počet online užívateľov"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Nikdy"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Online"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Posledné prihlásenie"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Počet kontaktov v zozname"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP adresa"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Zdroje"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administrácia "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Operácia aplikovaná na užívateľa"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Editovať vlastnosti"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Odstrániť užívateľa"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Prístup bol zamietnutý nastavením služby"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Transport"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC modul"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Registrácia do mod_irc na "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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"
+"Vložte meno používateľa a kódovanie, ktoré chcete používať pri pripojení na "
+"IRC server"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRC prezývka"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"Ak chcete zadať iné kódovania pre IRC servery, vyplnte zoznam s hodnotami vo "
+"formáte '{\"irc server\",\"encoding\"}'. Predvolené kódovanie pre túto "
+"službu je \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Príklad: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Príklad: [{\"irc.freenode.net\",\"utf-8\"}, {\"irc.freenode.net\", \"iso8859-"
+"2\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Parametre spojenia"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Kódovania"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Pripojit IRC kanál"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC kanál (bez počiatočnej #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC server"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Propojiť IRC kanál sem."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "Nastavania IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRC prezývka"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Heslo ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Kódovanie pre server ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Server ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Vytváranie miestnosti nie je povolené"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Diskusná miestnosť neexistuje"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Diskusné miestnosti"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr "Na registráciu prezývky potrebujete klienta podporujúceho z x:data"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registrácia prezývky na "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Zadajte prezývku, ktorú chcete registrovať"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Prezývka"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Prezývka je už zaregistrovaná inou osobou"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Zadaná prezývka je už registrovaná"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modul"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Nastavenie diskusnej miestnosti bolo zmenené"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "vstúpil(a) do miestnosti"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "odišiel(a) z miestnosti"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "bol(a) zablokovaný(á)"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "bol(a) vyhodený(á) z miestnosti"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "bol vyhodený(á) kvôli zmene priradenia"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "bol vyhodený(á) kvôli reštartu systému"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "sa premenoval(a) na"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr "zmenil(a) tému na: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Pondelok"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Utorok"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Streda"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Štvrtok"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Piatok"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Sobota"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Nedeľa"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Január"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Február"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Marec"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Apríl"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Máj"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Jún"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Júl"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "August"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "September"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Október"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "November"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "December"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Nastavenia miestnosti"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Ľudí v miestnosti"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Názov miestnosti"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Bol prekročený prenosový limit"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Nesprávny typ správy"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -730,489 +661,476 @@ msgstr ""
"Účastník bol vyhodený z miestnosti, pretože poslal chybovú správu inému "
"účastníkovi"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Príjemca sa nenachádza v konferenčnej miestnosti"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Nieje povolené posielať súkromné správy"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "súkromná, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr "Len moderátori a zúčastnený majú povolené meniť tému tejto miestnosti"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Len moderátori majú povolené meniť tému miestnosti"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr "Prezývka je už používaná iným členom"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Prezývka je registrovaná inou osobou"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Boli ste vylúčený z tejto miestnosti"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Pre vstup do miestnosti je potrebné byť členom"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Táto miestnosť nie je anonymná"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Pre vstup do miestnosti je potrebné heslo"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Nepodarilo sa vygenerovat captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Nesprávne heslo"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Sú potrebné práva administrátora"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Sú potrebné práva moderátora"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s je neplatné"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Prezývka ~s v miestnosti neexistuje"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Neplatné priradenie: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Neplatná rola: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Sú vyžadované práva vlastníka"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Konfigurácia miestnosti ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Konfigurácia pre "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Popis miestnosti"
+msgstr "Popis:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Nastaviť miestnosť ako trvalú"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Nastaviť miestnosť ako verejne prehľadávateľnú"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Nastaviť zoznam zúčastnených ako verejný"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Chrániť miestnosť heslom"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Počet účastníkov"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Bez limitu"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Zobrazovať skutočné Jabber ID"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "moderátorom"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "všetkým"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Nastaviť miestnosť len pre členov"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Nastaviť miestnosť ako moderovanú"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Užívatelia sú implicitne členmi"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
-msgstr "Povoliť užívateľom meniť tému"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
+msgstr "Povoliť užívateľom zmeniť tému tejto miestnosti"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Povoliť užívateľom odosielať súkromné správy"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
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:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Povoliť používateľom posielanie pozvánok"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Návštevníci môžu meniť prezývky"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Chrániť miestnosť systémom captcha"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Zapnúť zaznamenávanie histórie"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Počet zúčastnených"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s Vás pozýva do miestnosti ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "heslo je"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s Offline správy"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Odoslané"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Čas"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Od"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Pre"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paket"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Zmazať vybrané"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Offline správy"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Odstrániť všetky offline správy"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams modul"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe modul"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Žiadosť odberateľa PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Zvolte, či chcete povoliť toto odoberanie"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID uzlu"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Adresa odberateľa"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Dovoliť tomuto Jabber ID odoberať PubSub uzol?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Doručiť náklad s upozornením na udalosť"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Doručiť oznamy o udalosti"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
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:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Upozorniť prihlásených používateľov na zmazanie uzlu"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Uložiť položky natrvalo do úložiska"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Prístupný názov pre uzol"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
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:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Povoliť prihlasovanie"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Uveďte model prístupu"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Skupiny kontaktov, ktoré môžu odoberať"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Špecifikovať model publikovania"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Maximálny náklad v bajtoch"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Kedy odoslať posledne publikovanú položku"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
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:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Kolekcie asociované s uzlom"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "Nieje dovolené vytvárať účty tak rýchlo po sebe"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
+msgstr "Nieje možné vytvárať účty tak rýchlo po sebe"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Nič"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Prihlásenie"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Čakajúce"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Skupiny"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Overiť"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Odstrániť"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Zoznam kontaktov "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Zlý formát"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Pridať Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Zoznam kontaktov"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Skupiny pre zdieľaný zoznam kontaktov"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Pridať nový"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Meno:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Popis:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Členovia:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Zobrazené skupiny:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Skupina "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Odoslať"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
-msgstr "Dátum narodenia"
+msgstr "Dátum narodenia: "
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
-msgstr "Mesto"
+msgstr "Mesto: "
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
-msgstr "Krajina"
+msgstr "Krajina: "
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "E-mail"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
-msgstr "Priezvisko"
+msgstr "Priezvisko: "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1220,400 +1138,356 @@ msgstr ""
"Pre vyhľadanie Jabber používateľa vyplňte formulár (pridajte znak * na "
"koniec, pre vyhľadanie podreťazca)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Celé meno: "
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Prostredné meno: "
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Meno"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Meno organizácie: "
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Organizačná jednotka: "
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Hľadať užívateľov v "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
-msgstr "Užívateľ"
+msgstr "Užívateľ: "
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "Na vyhľadávanie potrebujete klienta podporujúceho x:data"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Hľadať užívateľov vo vCard"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard modul"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Hľadať výsledky pre "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Neautorizovaný"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administrácia"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Raw"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Virtuálne servery"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s konfigurácia prístupového pravidla"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "ejabberd virtuálne servery"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Používatelia"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Posledná aktivita používateľa"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Čas:"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Posledný mesiac"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Posledný rok"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Všetky aktivity"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Zobraziť bežnú tabuľku"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Zobraziť kompletnú tabuľku"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Štatistiky"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Nebol nájdený"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Uzol nenájdený"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Server"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Registrovaní používatelia"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Offline správy"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Posledná aktivita"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Registrovaní používatelia:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Online používatelia:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Odchádzajúce s2s spojenia:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Odchádzajúce s2s servery:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Zmeniť heslo"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Používateľ "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Pripojené zdroje:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Heslo:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Žiadne dáta"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Uzly"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Štatistiky"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Používatelia"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Posledná aktivita"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Raw)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Raw"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s konfigurácia prístupového pravidla"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "ejabberd virtuálne servery"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Posledná aktivita používateľa"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Čas:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Posledný mesiac"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Posledný rok"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Všetky aktivity"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Zobraziť bežnú tabuľku"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Zobraziť kompletnú tabuľku"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Uzol nenájdený"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Server"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Registrovaní používatelia"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Offline správy"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Registrovaní používatelia:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Online používatelia:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Odchádzajúce s2s spojenia:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Odchádzajúce s2s servery:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Zmeniť heslo"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Používateľ "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Pripojené zdroje:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Heslo:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Žiadne dáta"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Uzol "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Otvorené portov"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Aktualizovať"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Reštart"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
-msgstr "Zastaviť"
+msgstr "Stop"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Chyba RPC volania"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Databázové tabuľky na "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Typ úložiska"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Prvky"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Veľkosť"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Pamäť"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Chyba"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
-msgstr "Záloha "
+msgstr "Záloha na "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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 "
+"Podotýkame, že tieto nastavenia budú zálohované do zabudovanej Mnesia "
+"databázy. Ak používate ODBC modul, musíte zálohovať vašu SQL databázu "
"separátne."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Uložiť binárnu zálohu:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Okamžite obnoviť binárnu zálohu:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Uložiť zálohu do textového súboru:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Okamžite obnoviť zálohu z textového súboru:"
-#: web/ejabberd_web_admin.erl:1999
-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:2006
-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:2013
-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:2021
-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:2028
-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:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Otvorené porty na "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Moduly na "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Štatistiky ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Uptime:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Čas procesoru"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transakcie potvrdená"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transakcie zrušená"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transakcie reštartovaná"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transakcie zaznamenaná"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Aktualizovať "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Aktualizovať plán"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Modifikované moduly"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Aktualizované moduly"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Aktualizované skripty"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Nízkoúrovňový aktualizačný skript"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Kontrola skriptu"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protokol"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modul"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Nastavenia"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Zmazať"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Štart"
-#~ msgid "Encodings"
-#~ msgstr "Kódovania"
-
-#~ msgid "(Raw)"
-#~ msgstr "(Raw)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "Virtuálne servery"
-
-#~ 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"
diff --git a/src/msgs/sv.msg b/src/msgs/sv.msg
index f39549cf3..4f1d05d1b 100644
--- a/src/msgs/sv.msg
+++ b/src/msgs/sv.msg
@@ -14,8 +14,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Tillåt denna JID att prenumerera på denna pubsub node"}.
+{"Allow users to change 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"}.
@@ -43,10 +43,9 @@
{"City","Stad"}.
{"Commands","Kommandon"}.
{"Conference room does not exist","Rummet finns inte"}.
+{"Configuration for ","Konfiguration för "}.
{"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"}.
@@ -74,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard-modul"}.
{"ejabberd virtual hosts","Virtuella ejabberd-servrar"}.
{"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"}.
+{"Encodings","Textkodningar"}.
{"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"}.
@@ -85,13 +83,9 @@
{"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"}.
+{"Enter username and encodings 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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Exempel: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"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"}.
@@ -114,13 +108,10 @@
{"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."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Om du vill specifiera textkodning för IRC-servrar, fyll i listan med värden i formatet '{\"irc server\", \"encoding\"}'. Som standard används \"~s\"."}.
{"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"}.
@@ -128,24 +119,16 @@
{"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"}.
+{"Jabber ID ~s is invalid","Otillåtet JID ~s"}.
{"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"}.
@@ -168,14 +151,13 @@
{"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"}.
+{"Membership 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"}.
@@ -183,6 +165,8 @@
{"Name:","Namn:"}.
{"Name","Namn"}.
{"Never","Aldrig"}.
+{"Nickname is already in use by another occupant","Smeknamnet används redan"}.
+{"Nickname is registered by another person","Smeknamnet är reserverat"}.
{"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"}.
@@ -195,7 +179,6 @@
{"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"}.
@@ -211,7 +194,8 @@
{"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 moderators and participants are allowed to change subject in this room","Endast moderatorer och deltagare har tillåtelse att ändra ämnet i det här rummet"}.
+{"Only moderators are allowed to change subject in this room","Endast moderatorer får ä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"}.
@@ -223,9 +207,9 @@
{"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 required to enter this room","Lösenord erfordras"}.
{"Password Verification","Lösenordsverifikation"}.
{"Path to Dir","Sökväg till katalog"}.
{"Path to File","Sökväg till fil"}.
@@ -233,24 +217,23 @@
{"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"}.
+{"Present real Jabber IDs to","Nuvarande äkta JIDs 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)"}.
{"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 "}.
+{"Remark 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"}.
{"Remote copy","Sparas inte lokalt"}.
{"Remove","Ta bort"}.
{"Remove User","Ta bort användare"}.
@@ -265,7 +248,6 @@
{"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"}.
@@ -283,7 +265,6 @@
{"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"}.
@@ -291,6 +272,8 @@
{"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"}.
+{"Size","Storlek"}.
+{"Specified nickname is already registered","Detta smeknamnet är redan registrerat"}.
{"Specify the access model","Specificera accessmodellen"}.
{"Specify the publisher model","Ange publiceringsmodell"}.
{"~s's Offline Messages Queue","~s's offline meddelandekö"}.
@@ -312,8 +295,6 @@
{"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"}.
@@ -330,8 +311,7 @@
{"Transactions Logged:","Transaktioner loggade "}.
{"Transactions Restarted:","Transaktioner omstartade"}.
{"Tuesday","Tisdag"}.
-{"Unable to generate a captcha","Kunde inte generera ett captcha"}.
-{"Unauthorized","Ej auktoriserad"}.
+{"Updated modules","Uppdaterade moduler"}.
{"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"}.
@@ -344,10 +324,11 @@
{"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 are not allowed to register accounts so fast","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"}.
@@ -360,4 +341,3 @@
{"You need an x:data capable client to register nickname","Du behöver en klient som stödjer x:data för att registrera smeknamn"}.
{"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"}.
diff --git a/src/msgs/sv.po b/src/msgs/sv.po
index 880f924fe..bee475848 100644
--- a/src/msgs/sv.po
+++ b/src/msgs/sv.po
@@ -1,41 +1,27 @@
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
-"Last-Translator: Gustaf Alströmer\n"
+"Last-Translator: Thore Alstromer\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:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Du måste använda STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Ingen resurs angiven"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Ersatt av ny anslutning"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Skriv in sökväg till textfil"
-
-#: ejabberd_captcha.erl:97
-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:235
-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"
@@ -52,11 +38,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Verkligen ta bort dagens meddelanden?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Ämne"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Meddelande kropp"
@@ -80,7 +66,7 @@ msgstr "Sänd meddelanden till alla användare på alla värdar"
msgid "Send announcement to all online users"
msgstr "Sänd meddelanden till alla inloggade användare"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Sänd meddelanden till alla inloggade användare på alla värdar"
@@ -110,624 +96,567 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Konfiguration"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Databas"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Starta moduler"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Stanna moduler"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Säkerhetskopiera"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Återställ"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Dumpa till textfil"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Importera fil"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Importera katalog"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Starta om servicen"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Stäng ner servicen"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Lägg till användare"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Ta bort användare"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Avsluta användarsession"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Hämta användarlösenord"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Andra användarlösenord"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Hämta användarens senast inloggade tid"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Hämta användarstatistik"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Hämta antal registrerade användare"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Hämta antal inloggade användare"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "ACL"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Åtkomstregler"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Användarmanagement"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Anslutna användare"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Alla användare"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Utgaende s2s anslutning"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Körande noder"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Stannade noder"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Moduler"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Hantera säkerhetskopior"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importera användare från jabberd14 Spool filer"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Till ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Från ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Databastabellers konfiguration"
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Välj lagringstyp för tabeller"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Endast diskkopia"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "RAM- och diskkopia"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "RAM-kopia"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Sparas inte lokalt"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Stoppa moduler på "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Välj vilka moduler som skall stoppas"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Starta moduler på "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Skriv in en lista av {Module, [Options]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Lista av moduler som skall startas"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Säkerhetskopiera till fil på "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Skriv in sökväg till fil för säkerhetskopia"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Sökväg till fil"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Återställ säkerhetskopia från fil på "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Dumpa säkerhetskopia till textfil på "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Skriv in sökväg till textfil"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Importera användare från fil på "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Skriv in sökväg till spoolfil från jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Importera användare från katalog på "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Skriv in sökväg till spoolkatalog från jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Sökväg till katalog"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Tidsförsening"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Konfiguera ACL"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "ACL"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Åtkomstkonfiguration"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Åtkomstregler"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Lösenord"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Lösenordsverifikation"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Antal registrerade användare"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Antal inloggade användare"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Aldrig"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Ansluten"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Senaste login"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Roster storlek"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP adresser"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Resurser"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Administration av "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Handling mot användare"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Redigera egenskaper"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Ta bort användare"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Åtkomst nekad enligt lokal policy"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC transport"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC-modul"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "mod_irc-registrering för "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRC-användarnamn"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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."
+"i formatet '{\"irc server\", \"encoding\"}'. Som standard används \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Exempel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Exempel: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Uppkopplingsparametrar"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Textkodningar"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Lägg till IRC kanal"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC kanal (skriv inte första #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC-användarnamn"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Lägg till IRC kanal här."
-
-#: mod_irc/mod_irc.erl:761
-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:846
-msgid "IRC settings"
-msgstr "IRC Inställningar"
-
-#: mod_irc/mod_irc.erl:851
-#, 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:857
-msgid "IRC username"
-msgstr "IRC-användarnamn"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Lösenord ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Port ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Encoding för server ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Server ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "Endast administratörer får skicka tjänstmeddelanden"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Skapandet av rum är förbjudet enligt lokal policy"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Rummet finns inte"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Chattrum"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr "Du behöver en klient som stödjer x:data för att registrera smeknamn"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Registrera smeknamn på "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Skriv in smeknamnet du vill registrera"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Smeknamn"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Smeknamnet är reserverat"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Detta smeknamnet är redan registrerat"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modul"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Chattrum konfiguration modifierad"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "joinar rummet"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "lämnar rummet"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "har blivit bannad"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "har blivit kickad"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
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:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "är känd som"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " har satt ämnet till: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Måndag"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Tisdag"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Onsdag"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Torsdag"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Fredag"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Lördag"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Söndag"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Januari"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Februari"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Mars"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "April"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Maj"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Juni"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Juli"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Augusti"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "September"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Oktober"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "November"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "December"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Rumkonfiguration"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Antal besökare"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Rumstitel"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Trafikgränsen har överstigits"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Felaktig medelandetyp"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -735,496 +664,477 @@ 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:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Mottagaren finns inte i rummet"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
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:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privat, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change 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:806
-#, fuzzy
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Endast moderatorer får ändra ämnet i det här rummet"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-#, fuzzy
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr "Smeknamnet används redan"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Smeknamnet är reserverat"
+
+#: mod_muc/mod_muc_room.erl:1473
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:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership 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:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Detta rum är inte anonymt"
-#: mod_muc/mod_muc_room.erl:1559
-#, fuzzy
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Lösenord erfordras"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Kunde inte generera ett captcha"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Fel lösenord"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Administrationsprivilegier krävs"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Moderatorprivilegier krävs"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Otillåtet Jabber ID ~s"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
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:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Ogiltlig rang: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Ogiltlig roll: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Ägarprivilegier krävs"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Konfiguration för ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Konfiguration för "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
#, fuzzy
msgid "Room description"
msgstr "Beskrivning:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Gör rummet permanent"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Gör rummet publikt sökbart"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Gör deltagarlistan publik"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Gör losenorden i rummet publika"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Maximalt antal av användare"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Ingen gräns"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Nuvarande äkta Jabber IDs till"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "endast moderatorer"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "Vemsomhelst"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Gör om rummet till endast medlemmar"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Gör rummet modererat"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Gör om användare till deltagare"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Tillåt användare att byta ämne"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Tillåt användare att skicka privata meddelanden"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
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:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Tillåt användare att skicka inbjudningar"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Tillåt gäster att kunna ändra smeknamn"
-#: mod_muc/mod_muc_room.erl:2917
-#, fuzzy
-msgid "Make room captcha protected"
-msgstr "Gör losenorden i rummet publika"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Möjliggör login"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Antal besökare"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s bjöd in dig till rummet ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "Lösenordet är"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "Din kontaktkö for offlinekontakter ar full"
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s's offline meddelandekö"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Skicka in"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Tid"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Från"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Till"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paket"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Tabort valda"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Offline meddelanden:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-#, fuzzy
-msgid "Remove All Offline Messages"
-msgstr "Offline meddelanden"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestrem modul"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Publikprenumeration"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd publikprenumerations modul"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Pubsub prenumerationsforfrågan"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
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:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Node ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Prenumerationsadress"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Skicka innehåll tillsammans med notifikationer"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Skicka eventnotifikation"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Meddela prenumeranter när nodens konfiguration ändras"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Meddela prenumeranter när noden tas bort"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Spara dataposter permanent"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Ett vänligt namn for noden"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Högsta antal dataposter som sparas"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Tillåta prenumerationer?"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Specificera accessmodellen"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Rostergrupper tillåts att prenumerera"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Ange publiceringsmodell"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Högsta innehållsstorlek i bytes"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "När att skicka senast publicerade ämne"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Skicka notifikationer bara till uppkopplade användare"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr ""
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Det är inte tillåtet för användare att skapa konton så fort"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Inga"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Prenumeration"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Ännu inte godkända"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Grupper"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Validera"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Ta bort"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Kontaktlista för "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Dåligt format"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Lägg till Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Kontaktlista"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Delade Rostergrupper"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Lägg till ny"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Namn:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Beskrivning:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Medlemmar:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Visade grupper:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Grupp "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Skicka"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Födelsedag"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Stad"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Land"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Email"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Efternamn"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1232,379 +1142,354 @@ 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Fullständigt namn"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Mellannamn"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Namn"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Organisationsnamn"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Organisationsenhet"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Sök efter användare på "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Användarnamn"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "vCard användare sök"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard-modul"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Sökresultat för"
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Ej auktoriserad"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Administration"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Ra"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Virtuella servrar"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Åtkomstregelkonfiguration för ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Virtuella ejabberd-servrar"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Användare"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Användarens senaste aktivitet"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Period: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Senaste månaden"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Senaste året"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "All aktivitet"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Visa normal tabell"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Visa kumulativ tabell"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Statistik"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Noden finns inte"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Noden finns inte"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Server"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Registrerade användare"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Offline meddelanden"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Senast aktivitet"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Registrerade användare"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Inloggade användare"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Utgående s2s anslutning"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Utgående s2s server"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Ändra lösenord"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Användare "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Anslutna resurser:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Lösenord:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Ingen data"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Noder"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Statistik"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Användare"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Senast aktivitet"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Ra)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Ra"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Åtkomstregelkonfiguration för ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Virtuella ejabberd-servrar"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Användarens senaste aktivitet"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Period: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Senaste månaden"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Senaste året"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "All aktivitet"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Visa normal tabell"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Visa kumulativ tabell"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Noden finns inte"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Server"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Registrerade användare"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Offline meddelanden"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Registrerade användare"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Inloggade användare"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Utgående s2s anslutning"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Utgående s2s server"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Ändra lösenord"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Användare "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Anslutna resurser:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Lösenord:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Ingen data"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nod "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Lyssnarport"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Uppdatera"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Omstart"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Stoppa"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "RPC Uppringningserror"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Databas tabell pa"
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Lagringstyp"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elements"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Storlek"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Minne"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Fel"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Backup av"
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Lagra den binära backupen"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "återställ den binära backupen omedelbart"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Lagra textbackup"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "återställ textbackup omedelbart"
-#: web/ejabberd_web_admin.erl:1999
-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:2006
-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:2013
-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:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Importera användare från jabberd14 Spool filer"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Importera användare från jabberd14 Spool directory:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Lyssnande portar på "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Moduler på"
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Statistik på ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Tid upp"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "CPU tid"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transaktioner kommittade"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transaktioner borttagna"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transaktioner omstartade"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transaktioner loggade "
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Uppdatera"
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Uppdateringsplan"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr "Uppdaterade moduler"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Uppdatera skript"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Uppdaterade laglevel skript"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Skript kollat"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Port"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protocol"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modul"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Parametrar"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Ta bort"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Starta"
+
+#~ msgid "You must fill in field \"nick\" in the form"
+#~ msgstr "Du måste fylla i fältet \"nick\" i formuläret"
diff --git a/src/msgs/th.msg b/src/msgs/th.msg
index f492ac8e1..667e52afa 100644
--- a/src/msgs/th.msg
+++ b/src/msgs/th.msg
@@ -13,7 +13,8 @@
{"Administration of ","การดูแล "}.
{"Administrator privileges required","ต้องมีสิทธิพิเศษของผู้ดูแลระบบ"}.
{"All activity","กิจกรรมทั้งหมด"}.
-{"Allow this Jabber ID to subscribe to this pubsub node?","อนุญาตให้ Jabber ID นี้เข้าร่วมเป็นสมาชิกของโหนด pubsub หรือไม่"}.
+{"Allow this Jabber ID to subscribe to this pubsub node?","อนุญาตให้ JID นี้เข้าร่วมเป็นสมาชิกของโหนด pubsub หรือไม่"}.
+{"Allow users to change subject","อนุญาตให้ผู้ใช้เปลี่ยนหัวข้อได้"}.
{"Allow users to query other users","อนุญาตให้ผู้ใช้ถามคำถามกับผู้ใช้คนอื่นๆ ได้"}.
{"Allow users to send invites","อนุญาตให้ผู้ใช้ส่งคำเชิญถึงกันได้"}.
{"Allow users to send private messages","อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"}.
@@ -40,6 +41,7 @@
{"Commands","คำสั่ง"}.
{"Conference room does not exist","ไม่มีห้องประชุม"}.
{"Configuration","การกำหนดค่า"}.
+{"Configuration for ","การกำหนดค่าสำหรับ "}.
{"Connected Resources:","ทรัพยากรที่เชื่อมต่อ:"}.
{"Country","ประเทศ"}.
{"CPU Time:","เวลาการทำงานของ CPU:"}.
@@ -69,6 +71,7 @@
{"ejabberd virtual hosts","โฮสต์เสมือน ejabberd"}.
{"Email","อีเมล"}.
{"Enable logging","เปิดใช้งานการบันทึก"}.
+{"Encodings","การเข้ารหัส"}.
{"End User Session","สิ้นสุดเซสชันของผู้ใช้"}.
{"Enter list of {Module, [Options]}","ป้อนรายการของ {โมดูล, [ตัวเลือก]}"}.
{"Enter nickname you want to register","ป้อนชื่อเล่นที่คุณต้องการลงทะเบียน"}.
@@ -76,7 +79,9 @@
{"Enter path to jabberd14 spool dir","ป้อนพาธไปยัง jabberd14 spool dir"}.
{"Enter path to jabberd14 spool file","ป้อนพาธไปยังไฟล์เก็บพักข้อมูล jabberd14"}.
{"Enter path to text file","ป้อนพาธของไฟล์ข้อความ"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","ป้อนชื่อผู้ใช้และการเข้ารหัสที่คุณต้องการใช้สำหรับเชื่อมต่อกับเซิร์ฟเวอร์ IRC"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","ตัวอย่าง: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","นามสกุล"}.
{"February","กุมภาพันธ์"}.
{"Fill in fields to search for any matching Jabber User","กรอกข้อมูลลงในฟิลด์เพื่อค้นหาผู้ใช้ Jabber ที่ตรงกัน"}.
@@ -96,6 +101,7 @@
{"has been kicked","ถูกไล่ออก"}.
{" has set the subject to: "," ตั้งหัวข้อว่า: "}.
{"Host","โฮสต์"}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","ถ้าคุณต้องการระบุการเข้ารหัสที่ต่างกันสำหรับเซิร์ฟเวอร์ IRC ให้กรอกค่าโดยใช้รูปแบบ '{\"irc server\", \"encoding\"}' ลงในรายการ การบริการนี้ใช้การเข้ารหัสในรูปแบบ \"~s\" โดยค่าดีฟอลต์ "}.
{"Import Directory","อิมพอร์ตไดเร็กทอรี"}.
{"Import File","อิมพอร์ตไฟล์"}.
{"Import User from File at ","อิมพอร์ตผู้ใช้จากไฟล์ที่"}.
@@ -112,8 +118,8 @@
{"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","มกราคม"}.
+{"Jabber ID ~s is invalid","JID ~s ไม่ถูกต้อง"}.
{"joins the room","เข้าห้องสนทนานี้"}.
{"July","กรกฎาคม"}.
{"June","มิถุนายน"}.
@@ -137,6 +143,7 @@
{"Max payload size in bytes","ขนาดสูงสุดของส่วนของข้อมูล (payload) มีหน่วยเป็นไบต์"}.
{"May","พฤษภาคม"}.
{"Members:","สมาชิก:"}.
+{"Membership required to enter this room","ต้องเป็นสมาชิกจึงจะสามารถเข้าห้องนี้ได้"}.
{"Memory","หน่วยความจำ"}.
{"Message body","เนื้อหาของข้อความ"}.
{"Middle Name","ชื่อกลาง"}.
@@ -150,6 +157,8 @@
{"Name","ชื่อ"}.
{"Never","ไม่เคย"}.
{"Nickname","ชื่อเล่น"}.
+{"Nickname is already in use by another occupant","ชื่อเล่นถูกใช้งานอยู่โดยผู้ครอบครองห้อง"}.
+{"Nickname is registered by another person","ชื่อเล่นถูกลงทะเบียนใช้งานโดยบุคคลอื่น"}.
{"Nickname Registration at ","การลงทะเบียนชื่อเล่นที่ "}.
{"Nickname ~s does not exist in the room","ไม่มีชื่อเล่น ~s อยู่ในห้องนี้"}.
{"No body provided for announce message","ไม่ได้ป้อนเนื้อหาสำหรับข้อความที่ประกาศ"}.
@@ -176,6 +185,8 @@
{"Online Users:","ผู้ใช้ออนไลน์:"}.
{"Online Users","ผู้ใช้ออนไลน์"}.
{"Only deliver notifications to available users","ส่งการแจ้งเตือนถึงผู้ใช้ที่สามารถติดต่อได้เท่านั้น"}.
+{"Only moderators and participants are allowed to change subject in this room","ผู้ดูแลการสนทนาและผู้เข้าร่วมเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนหัวข้อในห้องนี้"}.
+{"Only moderators are allowed to change 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","ผู้ดูแลด้านการบริการเท่านั้นที่ได้รับอนุญาตให้ส่งข้อความการบริการ"}.
@@ -189,6 +200,7 @@
{"Packet","แพ็กเก็ต"}.
{"Password:","รหัสผ่าน:"}.
{"Password","รหัสผ่าน"}.
+{"Password required to enter this room","ต้องใส่รหัสผ่านเพื่อเข้าห้องนี้"}.
{"Password Verification","การตรวจสอบรหัสผ่าน"}.
{"Path to Dir","พาธไปยัง Dir"}.
{"Path to File","พาธของไฟล์ข้อมูล"}.
@@ -198,19 +210,21 @@
{"Ping","Ping"}.
{"Pong","Pong"}.
{"Port","พอร์ท"}.
-{"Present real Jabber IDs to","แสดง Jabber IDs ที่ถูกต้องแก่"}.
+{"Present real Jabber IDs to","แสดง JIDs ที่ถูกต้องแก่"}.
{"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)","(ข้อมูลดิบ)"}.
{"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 สำหรับ"}.
+{"Remark 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.","โปรดทราบว่าตัวเลือกเหล่านี้จะสำรองข้อมูลในฐานข้อมูล builtin Mnesia เท่านั้น หากคุณใช้โมดูล ODBC คุณต้องสำรองข้อมูลของฐานข้อมูล SQL แยกต่างหากด้วย"}.
{"Remote copy","คัดลอกระยะไกล"}.
{"Remove","ลบ"}.
{"Remove User","ลบผู้ใช้"}.
@@ -248,6 +262,8 @@
{"Show Ordinary Table","แสดงตารางทั่วไป"}.
{"Shut Down Service","ปิดการบริการ"}.
{"~s invites you to the room ~s","~s เชิญคุณเข้าร่วมสนทนาในห้อง ~s"}.
+{"Size","ขนาด"}.
+{"Specified nickname is already registered","ชื่อเล่นที่ระบุได้รับการลงได้ทะเบียนแล้ว"}.
{"Specify the access model","ระบุโมเดลการเข้าถึง"}.
{"Specify the publisher model","ระบุโมเดลผู้เผยแพร่"}.
{"~s's Offline Messages Queue","~s's ลำดับข้อความออฟไลน์"}.
@@ -284,6 +300,7 @@
{"Tuesday","วันอังคาร"}.
{"Update ","อัพเดต "}.
{"Update","อัพเดต"}.
+{"Updated modules","โมดูลที่อัพเดต"}.
{"Update message of the day (don't send)","อัพเดตข้อความของวัน (ไม่ต้องส่ง)"}.
{"Update message of the day on all hosts (don't send)","อัพเดตข้อความของวันบนโฮสต์ทั้งหมด (ไม่ต้องส่ง) "}.
{"Update plan","แผนการอัพเดต"}.
@@ -297,6 +314,7 @@
{"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","เวลาที่ส่งรายการที่เผยแพร่ครั้งล่าสุด"}.
diff --git a/src/msgs/th.po b/src/msgs/th.po
index 23af2501d..c53a2c708 100644
--- a/src/msgs/th.po
+++ b/src/msgs/th.po
@@ -7,31 +7,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Thai (ภาษาไทย)\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "ต้องใช้ STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "ไม่ได้ระบุข้อมูล"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "แทนที่ด้วยการเชื่อมต่อใหม่"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-#, fuzzy
-msgid "Enter the text you see"
-msgstr "ป้อนพาธของไฟล์ข้อความ"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-
-#: ejabberd_captcha.erl:235
-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 "คำสั่ง"
@@ -48,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "แน่ใจว่าต้องการลบข้อความของวันหรือไม่"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "หัวเรื่อง"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "เนื้อหาของข้อความ"
@@ -76,7 +63,7 @@ msgstr "ส่งประกาศถึงผู้ใช้ทั้งหม
msgid "Send announcement to all online users"
msgstr "ส่งประกาศถึงผู้ใช้ออนไลน์ทั้งหมด"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "ส่งประกาศถึงผู้ใช้ออนไลน์ทั้งหมดบนโฮสต์ทั้งหมด"
@@ -105,1127 +92,1041 @@ msgid "Delete message of the day on all hosts"
msgstr "ลบข้อความของวันบนโฮสต์ทั้งหมด"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "การกำหนดค่า"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "ฐานข้อมูล"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "เริ่มโมดูล"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "หยุดโมดูล"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "การสำรองข้อมูล "
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "การคืนค่า"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "ถ่ายโอนข้อมูลไปยังไฟล์ข้อความ"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "อิมพอร์ตไฟล์"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "อิมพอร์ตไดเร็กทอรี"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "เริ่มต้นการบริการใหม่อีกครั้ง"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "ปิดการบริการ"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "เพิ่มผู้ใช้"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "ลบผู้ใช้"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "สิ้นสุดเซสชันของผู้ใช้"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "ขอรับรหัสผ่านของผู้ใช้"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "เปลี่ยนรหัสผ่านของผู้ใช้"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "แสดงเวลาเข้าสู่ระบบครั้งล่าสุดของผู้ใช้"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "แสดงสถิติของผู้ใช้"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "แสดงจำนวนผู้ใช้ที่ลงทะเบียน"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "แสดงจำนวนผู้ใช้ออนไลน์"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "รายการควบคุมการเข้าถึง"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "กฎการเข้าถึง"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "การจัดการผู้ใช้"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "ผู้ใช้ออนไลน์"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "ผู้ใช้ทั้งหมด"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "การเชื่อมต่อ s2s ขาออก"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "โหนดที่ทำงาน"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "โหนดที่หยุด"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "โมดูล"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "การจัดการข้อมูลสำรอง"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "อิมพอร์ตผู้ใช้จากไฟล์เก็บพักข้อมูล jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "ถึง ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "จาก ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "การกำหนดค่าตารางฐานข้อมูลที่"
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "เลือกชนิดการจัดเก็บของตาราง"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "คัดลอกเฉพาะดิสก์"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "คัดลอก RAM และดิสก์"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "คัดลอก RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "คัดลอกระยะไกล"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "หยุดโมดูลที่"
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "เลือกโมดูลเพื่อหยุดการทำงาน"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "เริ่มโมดูลที่"
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "ป้อนรายการของ {โมดูล, [ตัวเลือก]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "รายการของโมดูลที่จะเริ่มการทำงาน"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "สำรองไฟล์ข้อมูลที่"
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "ป้อนพาธเพื่อสำรองไฟล์ข้อมูล"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "พาธของไฟล์ข้อมูล"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "คืนค่าการสำรองข้อมูลจากไฟล์ที่"
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "ถ่ายโอนการสำรองข้อมูลไปยังไฟล์ข้อความที่"
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "ป้อนพาธของไฟล์ข้อความ"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "อิมพอร์ตผู้ใช้จากไฟล์ที่"
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "ป้อนพาธไปยังไฟล์เก็บพักข้อมูล jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "อิมพอร์ตผู้ใช้จาก Dir ที่"
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "ป้อนพาธไปยัง jabberd14 spool dir"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "พาธไปยัง Dir"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "การหน่วงเวลา"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "การกำหนดค่ารายการควบคุมการเข้าถึง"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "รายการควบคุมการเข้าถึง"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "การกำหนดค่าการเข้าถึง"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "กฎการเข้าถึง"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "รหัสผ่าน"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "การตรวจสอบรหัสผ่าน"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "จำนวนผู้ใช้ที่ลงทะเบียน"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "จำนวนผู้ใช้ออนไลน์"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "ไม่เคย"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "ออนไลน์"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "การเข้าสู่ระบบครั้งล่าสุด"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "ขนาดของบัญชีรายชื่อ"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "ที่อยู่ IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "ทรัพยากร"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "การดูแล "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "การดำเนินการกับผู้ใช้"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "แก้ไขคุณสมบัติ"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "ลบผู้ใช้"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "การเข้าถึงถูกปฏิเสธโดยนโยบายการบริการ"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "การส่ง IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC module"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อกำหนดการตั้งค่า mod_irc"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "การลงทะเบียนใน mod_irc สำหรับ"
-#: mod_irc/mod_irc.erl:569
-#, fuzzy
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr "ป้อนชื่อผู้ใช้และการเข้ารหัสที่คุณต้องการใช้สำหรับเชื่อมต่อกับเซิร์ฟเวอร์ IRC"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "ชื่อผู้ใช้ IRC"
-#: mod_irc/mod_irc.erl:584
-#, fuzzy
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
"ถ้าคุณต้องการระบุการเข้ารหัสที่ต่างกันสำหรับเซิร์ฟเวอร์ IRC ให้กรอกค่าโดยใช้รูปแบบ '{\"irc "
"server\", \"encoding\"}' ลงในรายการ การบริการนี้ใช้การเข้ารหัสในรูปแบบ \"~s\" "
"โดยค่าดีฟอลต์ "
-#: mod_irc/mod_irc.erl:596
-#, fuzzy
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
"ตัวอย่าง: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr ""
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "การเข้ารหัส"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:720
-#, fuzzy
-msgid "IRC server"
-msgstr "ชื่อผู้ใช้ IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr ""
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:851
-#, 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:857
-#, fuzzy
-msgid "IRC username"
-msgstr "ชื่อผู้ใช้ IRC"
-
-#: mod_irc/mod_irc.erl:906
-#, fuzzy
-msgid "Password ~b"
-msgstr "รหัสผ่าน"
-
-#: mod_irc/mod_irc.erl:911
-#, fuzzy
-msgid "Port ~b"
-msgstr "พอร์ท"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr ""
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "ผู้ดูแลด้านการบริการเท่านั้นที่ได้รับอนุญาตให้ส่งข้อความการบริการ"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "การสร้างห้องสนทนาถูกปฏิเสธโดยนโยบายการบริการ"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "ไม่มีห้องประชุม"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "ห้องสนทนา"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อลงทะเบียนชื่อเล่น"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "การลงทะเบียนชื่อเล่นที่ "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "ป้อนชื่อเล่นที่คุณต้องการลงทะเบียน"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "ชื่อเล่น"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-#, fuzzy
-msgid "That nickname is registered by another person"
-msgstr "ชื่อเล่นถูกลงทะเบียนใช้งานโดยบุคคลอื่น"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "ชื่อเล่นที่ระบุได้รับการลงได้ทะเบียนแล้ว"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "คุณต้องกรอกฟิลด์ \"Nickname\" ในแบบฟอร์ม"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC module"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "มีการปรับเปลี่ยนการกำหนดค่าของห้องสนทนา"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "เข้าห้องสนทนานี้"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "ออกจากห้อง"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "ถูกสั่งห้าม"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "ถูกไล่ออก"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr ""
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr ""
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "ซึ่งรู้จักกันในชื่อ"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " ตั้งหัวข้อว่า: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "วันจันทร์"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "วันอังคาร"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "วันพุธ"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "วันพฤหัสบดี"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "วันศุกร์"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "วันเสาร์"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "วันอาทิตย์"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "มกราคม"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "กุมภาพันธ์"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "มีนาคม"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "เมษายน"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "พฤษภาคม"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "มิถุนายน"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "กรกฎาคม"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "สิงหาคม"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "กันยายน"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "ตุลาคม"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "พฤศจิกายน"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "ธันวาคม"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "การกำหนดค่าห้องสนทนา"
-#: mod_muc/mod_muc_log.erl:749
-#, fuzzy
-msgid "Room Occupants"
-msgstr "จำนวนผู้ครอบครองห้อง"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "ชื่อห้อง"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "อัตราของปริมาณการเข้าใช้เกินขีดจำกัด"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยังห้องประชุม"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "ประเภทข้อความไม่เหมาะสม"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยัง \"กลุ่มสนทนา\""
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "ผู้รับไม่ได้อยู่ในห้องประชุม"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
msgstr "ผู้ครอบครองห้องเท่านั้นที่ได้รับอนุญาตให้ส่งข้อความไปยังห้องประชุม"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
#, fuzzy
msgid "It is not allowed to send private messages"
msgstr "ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยังห้องประชุม"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "ผู้ครอบครองห้องเท่านั้นที่ได้รับอนุญาตให้ส่งกระทู้ถามไปยังห้องประชุม"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr "ห้องนี้ไม่อนุญาตให้ส่งกระทู้ถามถึงสมาชิกในห้องประชุม"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "ส่วนตัว, "
-#: mod_muc/mod_muc_room.erl:801
-#, fuzzy
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr "ผู้ดูแลการสนทนาและผู้เข้าร่วมเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนหัวข้อในห้องนี้"
-#: mod_muc/mod_muc_room.erl:806
-#, fuzzy
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "ผู้ดูแลการสนทนาเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนหัวข้อในห้องนี้"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "ผู้เยี่ยมเยือนไม่ได้รับอนุญาตให้ส่งข้อความถึงผู้ครอบครองห้องทั้งหมด"
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
#, fuzzy
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "ผู้ดูแลการสนทนาเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนหัวข้อในห้องนี้"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-#, fuzzy
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr "ชื่อเล่นถูกใช้งานอยู่โดยผู้ครอบครองห้อง"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "ชื่อเล่นถูกลงทะเบียนใช้งานโดยบุคคลอื่น"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "คุณถูกสั่งห้ามไมให้เข้าห้องนี้"
-#: mod_muc/mod_muc_room.erl:1497
-#, fuzzy
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "ต้องเป็นสมาชิกจึงจะสามารถเข้าห้องนี้ได้"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "ห้องนี้ไม่ปิดบังชื่อ"
-#: mod_muc/mod_muc_room.erl:1559
-#, fuzzy
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "ต้องใส่รหัสผ่านเพื่อเข้าห้องนี้"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr ""
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "รหัสผ่านไม่ถูกต้อง"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "ต้องมีสิทธิพิเศษของผู้ดูแลระบบ"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "ต้องมีสิทธิพิเศษของผู้ดูแลการสนทนา"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s ไม่ถูกต้อง"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "ไม่มีชื่อเล่น ~s อยู่ในห้องนี้"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "การเข้าร่วมที่ไม่ถูกต้อง: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "บทบาทไม่ถูกต้อง: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "ต้องมีสิทธิพิเศษของเจ้าของ"
-#: mod_muc/mod_muc_room.erl:2820
-#, fuzzy
-msgid "Configuration of room ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
msgstr "การกำหนดค่าสำหรับ "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
#, fuzzy
msgid "Room description"
msgstr "รายละเอียด:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "สร้างเป็นห้องถาวร"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "สร้างเป็นห้องที่บุคคลทั่วไปสามารถค้นหาได้"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "สร้างรายการผู้เข้าร่วมสำหรับใช้งานโดยบุคคลทั่วไป"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "สร้างห้องที่มีการป้องกันด้วยรหัสผ่าน"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "จำนวนผู้ครอบครองห้องสูงสุด"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "ไม่จำกัด"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "แสดง Jabber IDs ที่ถูกต้องแก่"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "สำหรับผู้ดูแลการสนทนาเท่านั้น"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "ทุกคน"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "สร้างห้องสำหรับสมาชิกเท่านั้น"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
#, fuzzy
msgid "Make room moderated"
msgstr "สร้างเป็นห้องถาวร"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "ผู้ใช้เริ่มต้นเป็นผู้เข้าร่วม"
-#: mod_muc/mod_muc_room.erl:2896
-#, fuzzy
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "อนุญาตให้ผู้ใช้เปลี่ยนหัวข้อได้"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "อนุญาตให้ผู้ใช้ถามคำถามกับผู้ใช้คนอื่นๆ ได้"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "อนุญาตให้ผู้ใช้ส่งคำเชิญถึงกันได้"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
#, fuzzy
msgid "Allow visitors to send status text in presence updates"
msgstr "อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
#, fuzzy
msgid "Allow visitors to change nickname"
msgstr "อนุญาตให้ผู้ใช้เปลี่ยนหัวข้อได้"
-#: mod_muc/mod_muc_room.erl:2917
-#, fuzzy
-msgid "Make room captcha protected"
-msgstr "สร้างห้องที่มีการป้องกันด้วยรหัสผ่าน"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "เปิดใช้งานการบันทึก"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อกำหนดค่าห้องสนทนา "
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "จำนวนผู้ครอบครองห้อง"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s เชิญคุณเข้าร่วมสนทนาในห้อง ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "รหัสผ่านคือ"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "ลำดับข้อความออฟไลน์ของผู้ที่ติดต่อของคุณเต็มแล้ว ข้อความถูกลบทิ้งแล้ว"
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s's ลำดับข้อความออฟไลน์"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "ส่งแล้ว"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "เวลา"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "จาก"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "ถึง"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "แพ็กเก็ต"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "ลบข้อความที่เลือก"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "ข้อความออฟไลน์:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-#, fuzzy
-msgid "Remove All Offline Messages"
-msgstr "ข้อความออฟไลน์"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "เผยแพร่-สมัครเข้าใช้งาน"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe module"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "คำร้องขอของผู้สมัครเข้าใช้งาน PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "เลือกว่าจะอนุมัติการสมัครเข้าใช้งานของเอนทิตี้นี้หรือไม่"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID โหนด"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "ที่อยู่ของผู้สมัคร"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "อนุญาตให้ Jabber ID นี้เข้าร่วมเป็นสมาชิกของโหนด pubsub หรือไม่"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "ส่งส่วนของข้อมูล (payload) พร้อมกับการแจ้งเตือนเหตุการณ์"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "ส่งการแจ้งเตือนเหตุการณ์"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "แจ้งเตือนผู้สมัครสมาชิกเมื่อการกำหนดค่าโหนดเปลี่ยนแปลง"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "แจ้งเตือนผู้สมัครสมาชิกเมื่อโหนดถูกลบ"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr "แจ้งเตือนผู้สมัครสมาชิกเมื่อรายการถูกลบออกจากโหนด"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "ยืนยันรายการที่จะจัดเก็บ"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "จำนวนสูงสุดของรายการที่ยืนยัน"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "อนุญาตให้เข้าร่วมเป็นสมาชิกหรือไม่"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "ระบุโมเดลการเข้าถึง"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "ระบุโมเดลผู้เผยแพร่"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "ขนาดสูงสุดของส่วนของข้อมูล (payload) มีหน่วยเป็นไบต์"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "เวลาที่ส่งรายการที่เผยแพร่ครั้งล่าสุด"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "ส่งการแจ้งเตือนถึงผู้ใช้ที่สามารถติดต่อได้เท่านั้น"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr ""
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr "เลือกชื่อผู้ใช้และรหัสผ่านเพื่อลงทะเบียนกับเซิร์ฟเวอร์นี้"
-#: mod_register.erl:243
+#: mod_register.erl:232
#, fuzzy
-msgid "Users are not allowed to register accounts so quickly"
+msgid "Users are not allowed to register accounts so fast"
msgstr "ผู้เยี่ยมเยือนไม่ได้รับอนุญาตให้ส่งข้อความถึงผู้ครอบครองห้องทั้งหมด"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "ไม่มี"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "การสมัครสมาชิก"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "ค้างอยู่"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "กลุ่ม"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "ตรวจสอบ"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "ลบ"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "บัญชีรายชื่อของ "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "รูปแบบที่ไม่ถูกต้อง"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "เพิ่ม Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "บัญชีรายชื่อ"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "กลุ่มบัญชีรายชื่อที่ใช้งานร่วมกัน"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "เพิ่มผู้ใช้ใหม่"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "ชื่อ:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "รายละเอียด:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "สมาชิก:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "กลุ่มที่แสดง:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "กลุ่ม"
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "ส่ง"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "วันเกิด"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "เมือง"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "ประเทศ"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "อีเมล"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "นามสกุล"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1233,403 +1134,355 @@ msgstr ""
"กรอกข้อมูลในแบบฟอร์มเพื่อค้นหาผู้ใช้ Jabber ที่ตรงกัน (ใส่เครื่องหมาย * "
"ที่ท้ายสุดของฟิลด์เพื่อจับคู่กับสตริงย่อย)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "ชื่อเต็ม"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "ชื่อกลาง"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "ชื่อ"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "ชื่อองค์กร"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "หน่วยขององค์กร"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "ค้นหาผู้ใช้ใน "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "ผู้ใช้"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อค้นหา"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "ค้นหาผู้ใช้ vCard "
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard module"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "ผลการค้นหาสำหรับ "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
msgstr "กรอกข้อมูลลงในฟิลด์เพื่อค้นหาผู้ใช้ Jabber ที่ตรงกัน"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
#, fuzzy
msgid "ejabberd Web Admin"
msgstr "เว็บอินเทอร์เฟซของ ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "การดูแล"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "ข้อมูลดิบ"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "โฮสต์เสมือน"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s การกำหนดค่ากฎการเข้าถึง"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "โฮสต์เสมือน ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "ผู้ใช้"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "กิจกรรมล่าสุดของผู้ใช้"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "ระยะเวลา:"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "เดือนที่แล้ว"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "ปีที่แล้ว"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "กิจกรรมทั้งหมด"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "แสดงตารางทั่วไป"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "แสดงตารางรวม"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "สถิติ"
-
-#: web/ejabberd_web_admin.erl:1097
-#, fuzzy
-msgid "Not Found"
-msgstr "ไม่พบโหนด"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "ไม่พบโหนด"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "โฮสต์"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "ผู้ใช้ที่ลงทะเบียน"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "ข้อความออฟไลน์"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "กิจกรรมล่าสุด"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "ผู้ใช้ที่ลงทะเบียน:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "ผู้ใช้ออนไลน์:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "การเชื่อมต่อ s2s ขาออก:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "เซิร์ฟเวอร์ s2s ขาออก:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "เปลี่ยนรหัสผ่าน"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "ผู้ใช้"
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "ทรัพยากรที่เชื่อมต่อ:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "รหัสผ่าน:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "ไม่มีข้อมูล"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "โหนด"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "สถิติ"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "ผู้ใช้"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "กิจกรรมล่าสุด"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(ข้อมูลดิบ)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "ข้อมูลดิบ"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s การกำหนดค่ากฎการเข้าถึง"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "โฮสต์เสมือน ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "กิจกรรมล่าสุดของผู้ใช้"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "ระยะเวลา:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "เดือนที่แล้ว"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "ปีที่แล้ว"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "กิจกรรมทั้งหมด"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "แสดงตารางทั่วไป"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "แสดงตารางรวม"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "ไม่พบโหนด"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "โฮสต์"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "ผู้ใช้ที่ลงทะเบียน"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "ข้อความออฟไลน์"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "ผู้ใช้ที่ลงทะเบียน:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "ผู้ใช้ออนไลน์:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "การเชื่อมต่อ s2s ขาออก:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "เซิร์ฟเวอร์ s2s ขาออก:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "เปลี่ยนรหัสผ่าน"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "ผู้ใช้"
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "ทรัพยากรที่เชื่อมต่อ:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "รหัสผ่าน:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "ไม่มีข้อมูล"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "โหนด "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "พอร์ทฟัง"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "อัพเดต"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "เริ่มต้นใหม่"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "หยุด"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "ข้อผิดพลาดจากการเรียกใช้ RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "ตารางฐานข้อมูลที่"
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "ชนิดที่เก็บข้อมูล"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr ""
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "ขนาด"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "หน่วยความจำ"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "การสำรองข้อมูล"
-#: web/ejabberd_web_admin.erl:1958
-#, fuzzy
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "จัดเก็บข้อมูลสำรองแบบไบนารี:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "ตกลง"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "คืนค่าข้อมูลสำรองแบบไบนารีโดยทันที:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"คืนค่าข้อมูลสำรองแบบไบนารีหลังจากที่ ejabberd ถัดไปเริ่มการทำงานใหม่ (ใช้หน่วยความจำน้อยลง):"
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "จัดเก็บข้อมูลสำรองที่เป็นข้อความธรรมดา:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "คืนค่าข้อมูลสำรองที่เป็นข้อความธรรมดาโดยทันที:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2021
-#, fuzzy
-msgid "Import user data from jabberd14 spool file:"
-msgstr "อิมพอร์ตผู้ใช้จากไฟล์เก็บพักข้อมูล jabberd14"
-
-#: web/ejabberd_web_admin.erl:2028
-#, fuzzy
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "อิมพอร์ตผู้ใช้จากไฟล์เก็บพักข้อมูล jabberd14"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "พอร์ทฟังที่"
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "โมดูลที่ "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "สถิติของ ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "เวลาการทำงานต่อเนื่อง:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "เวลาการทำงานของ CPU:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "ทรานแซกชันที่ได้รับมอบหมาย:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "ทรานแซกชันที่ถูกยกเลิก:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "ทรานแซกชันที่เริ่มทำงานใหม่อีกครั้ง:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "ทรานแซกชันที่บันทึก:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "อัพเดต "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "แผนการอัพเดต"
-#: web/ejabberd_web_admin.erl:2177
-#, fuzzy
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr "โมดูลที่อัพเดต"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "อัพเดตสคริปต์"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "อัพเดตสคริปต์ระดับต่ำ"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "ตรวจสอบคริปต์"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "พอร์ท"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2350
-#, fuzzy
-msgid "Protocol"
-msgstr "พอร์ท"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "โมดูล"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "ตัวเลือก"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "ลบ"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "เริ่ม"
-#~ msgid "Encodings"
-#~ msgstr "การเข้ารหัส"
-
-#~ msgid "(Raw)"
-#~ msgstr "(ข้อมูลดิบ)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "โฮสต์เสมือน"
-
-#~ msgid "Specified nickname is already registered"
-#~ msgstr "ชื่อเล่นที่ระบุได้รับการลงได้ทะเบียนแล้ว"
-
-#~ msgid "Size"
-#~ msgstr "ขนาด"
-
#~ msgid "Roster groups that may subscribe (if access model is roster)"
#~ msgstr "กลุ่มบัญชีรายชื่อที่อาจจะสมัครเป็นสมาชิก (ถ้าโมเดลการเข้าถึงคือบัญชีรายชื่อ)"
diff --git a/src/msgs/tr.msg b/src/msgs/tr.msg
index 9a68f5eec..19ab8b577 100644
--- a/src/msgs/tr.msg
+++ b/src/msgs/tr.msg
@@ -14,8 +14,8 @@
{"Administrator privileges required","Yönetim yetkileri gerekli"}.
{"A friendly name for the node","Düğüm için dostane bir isim"}.
{"All activity","Tüm aktivite"}.
-{"Allow this Jabber ID to subscribe to this pubsub node?","Bu Jabber ID bu pubsub düğümüne üye olmasına izin verilsin mi?"}.
-{"Allow users to change the subject","Kullanıcıların konu değiştirmesine izin ver"}.
+{"Allow this Jabber ID to subscribe to this pubsub node?","Bu JID bu pubsub düğümüne üye olmasına izin verilsin mi?"}.
+{"Allow users to change subject","Kullanıcıların konu değiştirmesine izin ver"}.
{"Allow users to query other users","Kullanıcıların diğer kullanıcıları sorgulamalarına izin ver"}.
{"Allow users to send invites","Kullanıcıların davetiye göndermelerine izin ver"}.
{"Allow users to send private messages","Kullanıcıların özel mesaj göndermelerine izin ver"}.
@@ -24,7 +24,6 @@
{"All Users","Tüm Kullanıcılar"}.
{"Announcements","Duyurular"}.
{"anyone","herkes"}.
-{"A password is required to enter this room","Bu odaya girmek için parola gerekiyor"}.
{"April","Nisan"}.
{"August","Ağustos"}.
{"Backup Management","Yedek Yönetimi"}.
@@ -45,9 +44,8 @@
{"Commands","Komutlar"}.
{"Conference room does not exist","Konferans odası bulunamadı"}.
{"Configuration","Ayarlar"}.
-{"Configuration of room ~s","~s odasının ayarları"}.
+{"Configuration for ","Ayarlar : "}.
{"Connected Resources:","Bağlı Kaynaklar:"}.
-{"Connections parameters","Bağlantı parametreleri"}.
{"Country","Ülke"}.
{"CPU Time:","İşlemci Zamanı:"}.
{"Database Tables at ","Veritabanı Tabloları : "}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard modülü"}.
{"ejabberd virtual hosts","ejabberd sanal sunucuları"}.
{"ejabberd Web Admin","ejabberd Web Yöneticisi"}.
-{"Elements","Elementler"}.
{"Email","E-posta"}.
{"Enable logging","Kayıt tutma özelliğini aç"}.
-{"Encoding for server ~b","Sunucu için kodlama ~b"}.
+{"Encodings","Kodlamalar"}.
{"End User Session","Kullanıcı Oturumunu Kapat"}.
{"Enter list of {Module, [Options]}","{Module, [Options]} listesi giriniz"}.
{"Enter nickname you want to register","Kaydettirmek istediğiniz takma ismi giriniz"}.
@@ -86,14 +83,9 @@
{"Enter path to jabberd14 spool dir","jabberd14 spool dosyası için yol giriniz"}.
{"Enter path to jabberd14 spool file","jabberd14 spool dosyası için yol giriniz"}.
{"Enter path to text file","Metin dosyasının yolunu giriniz"}.
-{"Enter the text you see","Gördüğünüz metni giriniz"}.
-{"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 sunuculara bağlanmak için kullanmak istediğiniz kullanıcı isimleri ve kodlamaları giriniz. 'İleri' tuşuna basınca karşınıza dolduracak daha fazla alan çıkacak. 'Tamamla' tuşuna basarak ayarları kaydedin."}.
-{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","IRC sunuculara bağlanmak için kullanmak istediğiniz kullanıcı ismi, kodlamalar, kapılar (portlar) ve parolaları giriniz"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","IRC sunuculara bağlanmak için kullanmak istediğiniz kullanıcı isimleri ve kodlamaları giriniz"}.
{"Erlang Jabber Server","Erlang Jabber Sunucusu"}.
-{"Error","Hata"}.
-{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Örnek: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"gizli\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}], {\"irc.sometestserver.net\", \"utf-8\"}]"}.
-{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Sunucudaki tüm kullanıcıların verisini PIEFXIS dosyalarına (XEP-0227) dışa aktar:"}.
-{"Export data of users in a host to PIEFXIS files (XEP-0227):","Bir sunucudaki kullanıcıların verisini PIEFXIS dosyalarına (XEP-0227) dışa aktar:"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Örnek: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Soyisim"}.
{"February","Şubat"}.
{"Fill in fields to search for any matching Jabber User","Eşleşen jabber kullanıcılarını aramak için alanları doldurunuz"}.
@@ -116,13 +108,10 @@
{"has been kicked","odadan atıldı"}.
{" has set the subject to: "," konuyu değiştirdi: "}.
{"Host","Sunucu"}.
-{"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 sunucuları için farklı kapılar (portlar), parolalar, kodlamalar belirtmek istiyorsanız, '{\"irc sunucusu\", \"kodlama\",\"kapı\",\"parola\"}' biçeminde değerlerle bu listeyi doldurunuz. Öntanımlı olarak bu servis \"~s\" kodlamasını, ~p \"kapısını\", \"boş\" parolasını kullanıyor."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","IRC sunucuları için farklı kodlamalar belirtmek istiyorsanız, '{\"irc sunucusu\", \"kodlama\"}' biçeminde değerlerle bu listeyi doldurunuz. Öntanımlı olarak bu servis \"~s\" kodlamasını kullanıyor."}.
{"Import Directory","Dizini İçe Aktar"}.
{"Import File","Dosyayı İçe Aktar"}.
-{"Import user data from jabberd14 spool file:","Jabberd 1.4 Spool Dosyalarından Kullanıcıları İçe Aktar:"}.
{"Import User from File at ","Dosyadan Kullanıcıları İçe Aktar : "}.
-{"Import users data from a PIEFXIS file (XEP-0227):","Kullanıcıları bir PIEFXIS dosyasından (XEP-0227) içe aktar:"}.
-{"Import users data from jabberd14 spool directory:","Jabberd 1.4 Spool Dizininden Kullanıcıları İçe Aktar:"}.
{"Import Users from Dir at ","Dizinden Kullanıcıları İçe Aktar : "}.
{"Import Users From jabberd14 Spool Files","Jabberd 1.4 Spool Dosyalarından Kullanıcıları İçeri Aktar"}.
{"Improper message type","Uygunsuz mesaj tipi"}.
@@ -130,24 +119,16 @@
{"Invalid affiliation: ~s","Geçersiz ilişki: ~s"}.
{"Invalid role: ~s","Geçersiz rol: ~s"}.
{"IP addresses","IP adresleri"}.
-{"IP","IP"}.
-{"IRC channel (don't put the first #)","IRC kanalı (ilk # işaretini koymayın)"}.
-{"IRC server","IRC sunucusu"}.
-{"IRC settings","IRC ayarları"}.
{"IRC Transport","IRC Nakli (Transport)"}.
-{"IRC username","IRC kullanıcı ismi"}.
{"IRC Username","IRC Kullanıcı İsmi"}.
{"is now known as","isim değiştirdi :"}.
{"It is not allowed to send private messages of type \"groupchat\"","\"groupchat\" tipinde özel mesajlar gönderilmesine izin verilmiyor"}.
{"It is not allowed to send private messages","Özel mesaj gönderilmesine izin verilmiyor"}.
{"It is not allowed to send private messages to the conference","Konferansa özel mesajlar gönderilmesine izin verilmiyor"}.
{"Jabber ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s geçersiz"}.
{"January","Ocak"}.
-{"Join IRC channel","IRC kanalına katıl"}.
+{"Jabber ID ~s is invalid","JID ~s geçersiz"}.
{"joins the room","odaya katıldı"}.
-{"Join the IRC channel here.","Buradaki IRC kanalına katıl."}.
-{"Join the IRC channel in this Jabber ID: ~s","IRC kanalına bu Jabber ID'si ile katıl: ~s"}.
{"July","Temmuz"}.
{"June","Haziran"}.
{"Last Activity","Son Aktivite"}.
@@ -160,7 +141,6 @@
{"List of modules to start","Başlatılacak modüllerin listesi"}.
{"Low level update script","Düşük seviye güncelleme betiği"}.
{"Make participants list public","Katılımcı listesini herkese açık hale getir"}.
-{"Make room captcha protected","Odayı insan doğrulaması (captcha) korumalı hale getir"}.
{"Make room members-only","Odayı sadece üyelere açık hale getir"}.
{"Make room moderated","Odayı moderasyonlu hale getir"}.
{"Make room password protected","Odayı parola korumalı hale getir"}.
@@ -171,14 +151,13 @@
{"Max # of items to persist","Kalıcı hale getirilecek en fazla öğe sayısı"}.
{"Max payload size in bytes","En fazla yük (payload) boyutu (bayt olarak)"}.
{"May","Mayıs"}.
-{"Membership is required to enter this room","Bu odaya girmek için üyelik gerekiyor"}.
+{"Membership required to enter this room","Bu odaya girmek için üyelik gerekiyor"}.
{"Members:","Üyeler:"}.
{"Memory","Bellek"}.
{"Message body","Mesajın gövdesi"}.
{"Middle Name","Ortanca İsim"}.
{"Moderator privileges required","Moderatör yetkileri gerekli"}.
{"moderators only","sadece moderatörler"}.
-{"Modified modules","Değişen modüller"}.
{"Module","Modül"}.
{"Modules at ","Modüller : "}.
{"Modules","Modüller"}.
@@ -186,6 +165,8 @@
{"Name:","İsim:"}.
{"Name","İsim"}.
{"Never","Asla"}.
+{"Nickname is already in use by another occupant","Takma isim odanın başka bir sakini tarafından halihazırda kullanımda"}.
+{"Nickname is registered by another person","Takma isim başka biri tarafından kaydettirilmiş"}.
{"Nickname Registration at ","Takma İsim Kaydı : "}.
{"Nickname ~s does not exist in the room","~s takma ismi odada yok"}.
{"Nickname","Takma isim"}.
@@ -198,7 +179,6 @@
{"No limit","Sınırsız"}.
{"None","Hiçbiri"}.
{"No resource provided","Hiç kaynak sağlanmadı"}.
-{"Not Found","Bulunamadı"}.
{"Notify subscribers when items are removed from the node","Düğümden öğeler kaldırıldığında üyeleri uyar"}.
{"Notify subscribers when the node configuration changes","Düğüm ayarları değiştiğinde üyeleri uyar"}.
{"Notify subscribers when the node is deleted","Bir düğüm silindiğinde üyeleri uyar"}.
@@ -214,8 +194,8 @@
{"Online Users:","Bağlı Kullanıcılar:"}.
{"Online Users","Bağlı Kullanıcılar"}.
{"Only deliver notifications to available users","Uyarıları sadece durumu uygun kullanıcılara ulaştır"}.
-{"Only moderators and participants are allowed to change the subject in this room","Sadece moderatörlerin ve katılımcıların bu odanın konusunu değiştirmesine izin veriliyor"}.
-{"Only moderators are allowed to change the subject in this room","Sadece moderatörlerin bu odanın konusunu değiştirmesine izin veriliyor"}.
+{"Only moderators and participants are allowed to change subject in this room","Sadece moderatörlerin ve katılımcıların bu odanın konusunu değiştirmesine izin veriliyor"}.
+{"Only moderators are allowed to change subject in this room","Sadece moderatörlerin bu odanın konusunu değiştirmesine izin veriliyor"}.
{"Only occupants are allowed to send messages to the conference","Sadece oda sakinlerinin konferansa mesaj göndermesine izin veriliyor"}.
{"Only occupants are allowed to send queries to the conference","Sadece oda sakinlerinin konferansa sorgu göndermesine izin veriliyor"}.
{"Only service administrators are allowed to send service messages","Sadece servis yöneticileri servis mesajı gönderebilirler"}.
@@ -227,9 +207,9 @@
{"Outgoing s2s Servers:","Giden s2s Sunucuları"}.
{"Owner privileges required","Sahip yetkileri gerekli"}.
{"Packet","Paket"}.
-{"Password ~b","Parola ~b"}.
{"Password:","Parola:"}.
{"Password","Parola"}.
+{"Password required to enter this room","Bu odaya girmek için parola gerekiyor"}.
{"Password Verification","Parola Doğrulaması"}.
{"Path to Dir","Dizinin Yolu"}.
{"Path to File","Dosyanın Yolu"}.
@@ -237,26 +217,24 @@
{"Period: ","Periyot:"}.
{"Persist items to storage","Öğeleri depoda kalıcı hale getir"}.
{"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.","Bu seçeneklerin sadece gömülü Mnesia veritabanını yedekleyeceğine dikkat edin. Eğer ODBC modülünü kullanıyorsanız, SQL veritabanınızı da ayrıca yedeklemeniz gerekiyor."}.
{"Pong","Pong"}.
-{"Port ~b","Kapı (Port) ~b"}.
{"Port","Kapı (Port)"}.
-{"Present real Jabber IDs to","Gerçek Jabber ID'lerini göster :"}.
+{"Present real Jabber IDs to","Gerçek JID'lerini göster :"}.
{"private, ","özel"}.
-{"Protocol","Protokol"}.
{"Publish-Subscribe","Yayınla-Üye Ol"}.
{"PubSub subscriber request","PubSub üye isteği"}.
{"Queries to the conference members are not allowed in this room","Bu odada konferans üyelerine sorgu yapılmasına izin verilmiyor"}.
{"RAM and disc copy","RAM ve disk kopyala"}.
{"RAM copy","RAM kopyala"}.
+{"(Raw)","(Ham)"}.
{"Raw","Ham"}.
{"Really delete message of the day?","Günün mesajını silmek istediğinize emin misiniz?"}.
{"Recipient is not in the conference room","Alıcı konferans odasında değil"}.
{"Registered Users:","Kayıtlı Kullanıcılar:"}.
{"Registered Users","Kayıtlı Kullanıcılar"}.
{"Registration in mod_irc for ","mod_irc'ye kayıt : "}.
+{"Remark 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.","Bu seçeneklerin sadece gömülü Mnesia veritabanını yedekleyeceğine dikkat edin. Eğer ODBC modülünü kullanıyorsanız, SQL veritabanınızı da ayrıca yedeklemeniz gerekiyor."}.
{"Remote copy","Uzak kopyala"}.
-{"Remove All Offline Messages","Tüm Çevirim-dışı Mesajları Kaldır"}.
{"Remove","Kaldır"}.
{"Remove User","Kullanıcıyı Kaldır"}.
{"Replaced by new connection","Eski bağlantı yenisi ile değiştirildi"}.
@@ -270,8 +248,6 @@
{"Restore","Yedekten Geri Al"}.
{"Room Configuration","Oda Ayarları"}.
{"Room creation is denied by service policy","Odanın oluşturulması servis politikası gereği reddedildi"}.
-{"Room description","Oda tanımı"}.
-{"Room Occupants","Oda Sakini Sayısı"}.
{"Room title","Oda başlığı"}.
{"Roster groups allowed to subscribe","Üye olunmasına izin verilen kontak listesi grupları"}.
{"Roster","Kontak Listesi"}.
@@ -289,7 +265,6 @@
{"Send announcement to all users","Duyuruyu tüm kullanıcılara yolla"}.
{"Send announcement to all users on all hosts","Tüm sunuculardaki tüm kullanıcılara duyuru yolla"}.
{"September","Eylül"}.
-{"Server ~b","Sunucu ~b"}.
{"Set message of the day and send to online users","Günün mesajını belirle"}.
{"Set message of the day on all hosts and send to online users","Tüm sunucularda günün mesajını belirle ve bağlı tüm kullanıcılara gönder"}.
{"Shared Roster Groups","Paylaşımlı Kontak Listesi Grupları"}.
@@ -297,6 +272,8 @@
{"Show Ordinary Table","Sıradan Tabloyu Göster"}.
{"Shut Down Service","Servisi Kapat"}.
{"~s invites you to the room ~s","~s sizi ~s odasına davet ediyor"}.
+{"Size","Boyut"}.
+{"Specified nickname is already registered","Belirtilen takma isim daha önce bir başkası tarafından kaydettirilmiş"}.
{"Specify the access model","Erişim modelini belirtiniz"}.
{"Specify the publisher model","Yayıncı modelini belirtiniz"}.
{"~s's Offline Messages Queue","~s Kullanıcısının Mesaj Kuyruğu"}.
@@ -318,10 +295,6 @@
{"Subscriber Address","Üye Olanın Adresi"}.
{"Subscription","Üyelik"}.
{"Sunday","Pazar"}.
-{"That nickname is already in use by another occupant","Takma isim odanın başka bir sakini tarafından halihazırda kullanımda"}.
-{"That nickname is registered by another person","O takma isim başka biri tarafından kaydettirilmiş"}.
-{"The captcha is valid.","İnsan doğrulaması (captcha) geçerli."}.
-{"The collections with which a node is affiliated","Bir düğüm ile bağlantılı koleksiyonlar"}.
{"the password is","parola :"}.
{"This participant is kicked from the room because he sent an error message","Bu katılımcı bir hata mesajı gönderdiği için odadan atıldı"}.
{"This participant is kicked from the room because he sent an error message to another participant","Bu katılımcı başka bir katılımcıya bir hata mesajı gönderdiği için odadan atıldı"}.
@@ -338,8 +311,7 @@
{"Transactions Logged:","Kaydı Tutulan Hareketler (Transactions):"}.
{"Transactions Restarted:","Tekrar Başlatılan Hareketler (Transactions):"}.
{"Tuesday","Salı"}.
-{"Unable to generate a captcha","İnsan doğrulaması (captcha) oluşturulamadı"}.
-{"Unauthorized","Yetkisiz"}.
+{"Updated modules","Güncellenen modüller"}.
{"Update ","Güncelle "}.
{"Update","GÜncelle"}.
{"Update message of the day (don't send)","Günün mesajını güncelle (gönderme)"}.
@@ -351,11 +323,12 @@
{"User ","Kullanıcı "}.
{"User","Kullanıcı"}.
{"User Management","Kullanıcı Yönetimi"}.
-{"Users are not allowed to register accounts so quickly","Kullanıcıların bu kadar hızlı hesap açmalarına izin verilmiyor"}.
+{"Users are not allowed to register accounts so fast","Kullanıcıların bu kadar hızlı hesap açmalarına izin verilmiyor"}.
{"Users","Kullanıcılar"}.
{"Users Last Activity","Kullanıcıların Son Aktiviteleri"}.
{"Validate","Geçerli"}.
{"vCard User Search","vCard Kullanıcı Araması"}.
+{"Virtual Hosts","Sanal Sunucular"}.
{"Visitors are not allowed to change their nicknames in this room","Bu odada ziyaretçilerin takma isimlerini değiştirmesine izin verilmiyor"}.
{"Visitors are not allowed to send messages to all occupants","Ziyaretçilerin odadaki tüm sakinlere mesaj göndermesine izin verilmiyor"}.
{"Wednesday","Çarşamba"}.
@@ -368,4 +341,3 @@
{"You need an x:data capable client to register nickname","Takma isminizi kaydettirmek için x:data becerisine sahip bir istemciye gereksinimiz var"}.
{"You need an x:data capable client to search","Arama yapabilmek için x:data becerisine sahip bir istemciye gereksinimiz var"}.
{"Your contact offline message queue is full. The message has been discarded.","Çevirim-dışı mesaj kuyruğunuz dolu. Mesajını dikkate alınmadı."}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","~s kullanıcısına mesajlarınız engelleniyor. Durumu düzeltmek için ~s adresini ziyaret ediniz."}.
diff --git a/src/msgs/tr.po b/src/msgs/tr.po
index 51d036a6a..49b9821c2 100644
--- a/src/msgs/tr.po
+++ b/src/msgs/tr.po
@@ -1,43 +1,24 @@
-# translation of ejabberd.tr.po to Turkish
-# Doruk Fisek , 2009.
msgid ""
msgstr ""
-"Project-Id-Version: ejabberd.tr\n"
-"PO-Revision-Date: 2009-08-12 22:55+0300\n"
-"Last-Translator: Doruk Fisek \n"
-"Language-Team: Turkish \n"
+"Project-Id-Version: 2.1.0-alpha\n"
+"Last-Translator: Doruk Fisek \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Turkish (türkçe)\n"
-"X-Generator: KBabel 1.11.4\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "STARTTLS kullanımı gereklidir"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Hiç kaynak sağlanmadı"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Eski bağlantı yenisi ile değiştirildi"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Gördüğünüz metni giriniz"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-"~s kullanıcısına mesajlarınız engelleniyor. Durumu düzeltmek için ~s "
-"adresini ziyaret ediniz."
-
-#: ejabberd_captcha.erl:235
-msgid "The captcha is valid."
-msgstr "İnsan doğrulaması (captcha) geçerli."
-
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Komutlar"
@@ -54,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Günün mesajını silmek istediğinize emin misiniz?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Konu"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Mesajın gövdesi"
@@ -82,7 +63,7 @@ msgstr "Tüm sunuculardaki tüm kullanıcılara duyuru yolla"
msgid "Send announcement to all online users"
msgstr "Duyuruyu tüm bağlı kullanıcılara yolla"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Duyuruyu tüm sunuculardaki tüm bağlı kullanıcılara yolla"
@@ -112,626 +93,569 @@ msgid "Delete message of the day on all hosts"
msgstr "Tüm sunuculardaki günün mesajını sil"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Ayarlar"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Veritabanı"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Modülleri Başlat"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Modülleri Durdur"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Yedekle"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Yedekten Geri Al"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Metin Dosyasına Döküm Al"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Dosyayı İçe Aktar"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Dizini İçe Aktar"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Servisi Tekrar Başlat"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Servisi Kapat"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Kullanıcı Ekle"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Kullanıcıyı Sil"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Kullanıcı Oturumunu Kapat"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Kullanıcı Parolasını Al"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Kullanıcı Parolasını Değiştir"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Kullanıcı Son Giriş Zamanınlarını Al"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Kullanıcı İstatistiklerini Al"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Kayıtlı Kullanıcı Sayısını Al"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Bağlı Kullanıcı Sayısını Al"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Erişim Kontrol Listeleri (ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Erişim Kuralları"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Kullanıcı Yönetimi"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Bağlı Kullanıcılar"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Tüm Kullanıcılar"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Giden s2s Bağlantıları"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Çalışan Düğümler"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Durdurulmuş Düğümler"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Modüller"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Yedek Yönetimi"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Jabberd 1.4 Spool Dosyalarından Kullanıcıları İçeri Aktar"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Kime ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Kimden ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Veritabanı Tablo Ayarları : "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Tabloların veri depolama tipini seçiniz"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Sadece disk kopyala"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "RAM ve disk kopyala"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "RAM kopyala"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Uzak kopyala"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Modülleri Durdur : "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Durdurulacak modülleri seçiniz"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Modülleri Başlat : "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "{Module, [Options]} listesi giriniz"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Başlatılacak modüllerin listesi"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Dosyaya Yedekle : "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Yedek dosyasının yolunu giriniz"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Dosyanın Yolu"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Dosyadaki Yedekten Geri Al : "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Metin Dosyasına Döküm Alarak Yedekle : "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Metin dosyasının yolunu giriniz"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Dosyadan Kullanıcıları İçe Aktar : "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "jabberd14 spool dosyası için yol giriniz"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Dizinden Kullanıcıları İçe Aktar : "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "jabberd14 spool dosyası için yol giriniz"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Dizinin Yolu"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Zaman gecikmesi"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Erişim Kontrol Listelerinin Ayarlanması (ACL)"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Erişim kontrol listeleri (ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Erişim Ayarları"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Erişim kuralları"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Parola"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Parola Doğrulaması"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Kayıtlı kullanıcı sayısı"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Bağlı kullanıcı sayısı"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Asla"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Bağlı"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Son giriş"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "İsim listesi boyutu"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP adresleri"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Kaynaklar"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Yönetim : "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Kullanıcıya uygulanacak eylem"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Özellikleri Düzenle"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Kullanıcıyı Kaldır"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Servis politikası gereği erişim engellendi"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Nakli (Transport)"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC modülü"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"mod_irc ayarlarını düzenlemek için x:data becerisine sahip bir istemciye "
"gereksinimiz var"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "mod_irc'ye kayıt : "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-"IRC sunuculara bağlanmak için kullanmak istediğiniz kullanıcı ismi, "
-"kodlamalar, kapılar (portlar) ve parolaları giriniz"
+"IRC sunuculara bağlanmak için kullanmak istediğiniz kullanıcı isimleri ve "
+"kodlamaları giriniz"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "IRC Kullanıcı İsmi"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"IRC sunucuları için farklı kapılar (portlar), parolalar, kodlamalar "
-"belirtmek istiyorsanız, '{\"irc sunucusu\", \"kodlama\",\"kapı\",\"parola"
-"\"}' biçeminde değerlerle bu listeyi doldurunuz. Öntanımlı olarak bu servis "
-"\"~s\" kodlamasını, ~p \"kapısını\", \"boş\" parolasını kullanıyor."
+"IRC sunucuları için farklı kodlamalar belirtmek istiyorsanız, '{\"irc "
+"sunucusu\", \"kodlama\"}' biçeminde değerlerle bu listeyi doldurunuz. "
+"Öntanımlı olarak bu servis \"~s\" kodlamasını kullanıyor."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Örnek: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"gizli\"}, {\"vendetta.fef.net"
-"\", \"iso8859-1\", 7000}], {\"irc.sometestserver.net\", \"utf-8\"}]"
+"Örnek: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Bağlantı parametreleri"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Kodlamalar"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "IRC kanalına katıl"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC kanalı (ilk # işaretini koymayın)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC sunucusu"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Buradaki IRC kanalına katıl."
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "IRC kanalına bu Jabber ID'si ile katıl: ~s"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "IRC ayarları"
-
-#: mod_irc/mod_irc.erl:851
-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 sunuculara bağlanmak için kullanmak istediğiniz kullanıcı isimleri ve "
-"kodlamaları giriniz. 'İleri' tuşuna basınca karşınıza dolduracak daha fazla "
-"alan çıkacak. 'Tamamla' tuşuna basarak ayarları kaydedin."
-
-#: mod_irc/mod_irc.erl:857
-msgid "IRC username"
-msgstr "IRC kullanıcı ismi"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Parola ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Kapı (Port) ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Sunucu için kodlama ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Sunucu ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "Sadece servis yöneticileri servis mesajı gönderebilirler"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Odanın oluşturulması servis politikası gereği reddedildi"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Konferans odası bulunamadı"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Sohbet Odaları"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
msgstr ""
"Takma isminizi kaydettirmek için x:data becerisine sahip bir istemciye "
"gereksinimiz var"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Takma İsim Kaydı : "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Kaydettirmek istediğiniz takma ismi giriniz"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Takma isim"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "O takma isim başka biri tarafından kaydettirilmiş"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Belirtilen takma isim daha önce bir başkası tarafından kaydettirilmiş"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Formda \"Takma isim\" alanını doldurmanız gerekiyor"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modülü"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Sohbet odası ayarı değiştirildi"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "odaya katıldı"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "odadan ayrıldı"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "odaya girmesi yasaklandı"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "odadan atıldı"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "ilişki değişikliğinden dolayı atıldı"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr "oda üyelere-özel hale getirildiğinden dolayı atıldı"
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "sistem kapandığından dolayı atıldı"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "isim değiştirdi :"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " konuyu değiştirdi: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Pazartesi"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Salı"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Çarşamba"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Perşembe"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Cuma"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Cumartesi"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Pazar"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Ocak"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Şubat"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Mart"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Nisan"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Mayıs"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Haziran"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Temmuz"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Ağustos"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Eylül"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Ekim"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Kasım"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Aralık"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Oda Ayarları"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Oda Sakini Sayısı"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Oda başlığı"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Trafik oran sınırı aşıldı"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr "Bu katılımcı bir hata mesajı gönderdiği için odadan atıldı"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "Konferansa özel mesajlar gönderilmesine izin verilmiyor"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Uygunsuz mesaj tipi"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -739,493 +663,480 @@ msgstr ""
"Bu katılımcı başka bir katılımcıya bir hata mesajı gönderdiği için odadan "
"atıldı"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "\"groupchat\" tipinde özel mesajlar gönderilmesine izin verilmiyor"
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Alıcı konferans odasında değil"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Sadece oda sakinlerinin konferansa mesaj göndermesine izin veriliyor"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Özel mesaj gönderilmesine izin verilmiyor"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Sadece oda sakinlerinin konferansa sorgu göndermesine izin veriliyor"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr "Bu odada konferans üyelerine sorgu yapılmasına izin verilmiyor"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "özel"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr ""
"Sadece moderatörlerin ve katılımcıların bu odanın konusunu değiştirmesine "
"izin veriliyor"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Sadece moderatörlerin bu odanın konusunu değiştirmesine izin veriliyor"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
msgid "Visitors are not allowed to send messages to all occupants"
msgstr ""
"Ziyaretçilerin odadaki tüm sakinlere mesaj göndermesine izin verilmiyor"
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr "Bu katılımcı bir hata varlığı (presence) gönderdiği için odadan atıldı"
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr ""
"Bu odada ziyaretçilerin takma isimlerini değiştirmesine izin verilmiyor"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
msgstr "Takma isim odanın başka bir sakini tarafından halihazırda kullanımda"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Takma isim başka biri tarafından kaydettirilmiş"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Bu odaya girmeniz yasaklandı"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "Bu odaya girmek için üyelik gerekiyor"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Bu oda anonim değil"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "Bu odaya girmek için parola gerekiyor"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "İnsan doğrulaması (captcha) oluşturulamadı"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Yanlış parola"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Yönetim yetkileri gerekli"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Moderatör yetkileri gerekli"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s geçersiz"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "~s takma ismi odada yok"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Geçersiz ilişki: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Geçersiz rol: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Sahip yetkileri gerekli"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "~s odasının ayarları"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Ayarlar : "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Oda tanımı"
+msgstr "Tanım:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Odayı kalıcı hale getir"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Odayı herkes tarafından aranabilir hale getir"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Katılımcı listesini herkese açık hale getir"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Odayı parola korumalı hale getir"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Odada En Fazla Bulunabilecek Kişi Sayısı"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Sınırsız"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Gerçek Jabber ID'lerini göster :"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "sadece moderatörler"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "herkes"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Odayı sadece üyelere açık hale getir"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Odayı moderasyonlu hale getir"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Kullanıcılar öntanımlı olarak katılımcı olsun"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Kullanıcıların konu değiştirmesine izin ver"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Kullanıcıların özel mesaj göndermelerine izin ver"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Kullanıcıların diğer kullanıcıları sorgulamalarına izin ver"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Kullanıcıların davetiye göndermelerine izin ver"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Ziyaretçilerin varlık (presence) güncellemelerinde durum metni "
"göndermelerine izin ver"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Ziyaretçilerin takma isim değiştirmelerine izin ver"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Odayı insan doğrulaması (captcha) korumalı hale getir"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Kayıt tutma özelliğini aç"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
msgstr ""
"Odayı ayarlamak için x:data becerisine sahip bir istemciye gereksinimiz var"
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Oda sakini sayısı"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s sizi ~s odasına davet ediyor"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "parola :"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "Çevirim-dışı mesaj kuyruğunuz dolu. Mesajını dikkate alınmadı."
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s Kullanıcısının Mesaj Kuyruğu"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Gönderilenler"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Zaman"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Kimden"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Kime"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paket"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Seçilenleri Sil"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Çevirim-dışı Mesajlar:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Tüm Çevirim-dışı Mesajları Kaldır"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams modülü"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Yayınla-Üye Ol"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe modülü"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "PubSub üye isteği"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Bu varlığın üyeliğini onaylayıp onaylamamayı seçiniz."
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "Düğüm ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Üye Olanın Adresi"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Bu Jabber ID bu pubsub düğümüne üye olmasına izin verilsin mi?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Yükleri (payload) olay uyarıları ile beraber gönder"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Olay uyarıları gönderilsin"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Düğüm ayarları değiştiğinde üyeleri uyar"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Bir düğüm silindiğinde üyeleri uyar"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr "Düğümden öğeler kaldırıldığında üyeleri uyar"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Öğeleri depoda kalıcı hale getir"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Düğüm için dostane bir isim"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Kalıcı hale getirilecek en fazla öğe sayısı"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Üyeliklere izin verilsin mi"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Erişim modelini belirtiniz"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Üye olunmasına izin verilen kontak listesi grupları"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Yayıncı modelini belirtiniz"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "En fazla yük (payload) boyutu (bayt olarak)"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Son yayınlanan öğe ne zaman gönderilsin"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Uyarıları sadece durumu uygun kullanıcılara ulaştır"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Bir düğüm ile bağlantılı koleksiyonlar"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr "Bu sunucuya kayıt olmak için bir kullanıcı ismi ve parola seçiniz"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Kullanıcıların bu kadar hızlı hesap açmalarına izin verilmiyor"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Hiçbiri"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Üyelik"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Sıra Bekleyen"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Gruplar"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Geçerli"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Kaldır"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Kontak Listesi : "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Kötü biçem"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Jabber ID'si Ekle"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Kontak Listesi"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Paylaşımlı Kontak Listesi Grupları"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Yeni Ekle"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "İsim:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Tanım:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Üyeler:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Gösterilen Gruplar:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Group "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Gönder"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Sunucusu"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Doğumgünü"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "İl"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Ülke"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "E-posta"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Soyisim"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1233,385 +1144,354 @@ msgstr ""
"Eşleşen jabber kullanıcılarını aramak için formu doldurunuz (Alt dizgi "
"eşlemek için alanın sonuna * ekleyin)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Tam İsim"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Ortanca İsim"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "İsim"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Kurum İsmi"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Kurumun İlgili Birimi"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Kullanıcılarda arama yap : "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Kullanıcı"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr ""
"Arama yapabilmek için x:data becerisine sahip bir istemciye gereksinimiz var"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "vCard Kullanıcı Araması"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard modülü"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Arama sonuçları : "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Eşleşen jabber kullanıcılarını aramak için alanları doldurunuz"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Yetkisiz"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Yöneticisi"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Yönetim"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Ham"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Sanal Sunucular"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s erişim kuralları ayarları"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "ejabberd sanal sunucuları"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Kullanıcılar"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Kullanıcıların Son Aktiviteleri"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Periyot:"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Geçen ay"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Geçen yıl"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Tüm aktivite"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Sıradan Tabloyu Göster"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Önemli Tabloyu Göster"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "İstatistikler"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "Bulunamadı"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Düğüm bulunamadı"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Sunucu"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Kayıtlı Kullanıcılar"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Çevirim-dışı Mesajlar"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Son Aktivite"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Kayıtlı Kullanıcılar:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Bağlı Kullanıcılar:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Giden s2s Bağlantıları:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Giden s2s Sunucuları"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Parola Değiştir"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Kullanıcı "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Bağlı Kaynaklar:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Parola:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Veri Yok"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Düğümler"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "İstatistikler"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Kullanıcılar"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Son Aktivite"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Ham)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Ham"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s erişim kuralları ayarları"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "ejabberd sanal sunucuları"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Kullanıcıların Son Aktiviteleri"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Periyot:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Geçen ay"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Geçen yıl"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Tüm aktivite"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Sıradan Tabloyu Göster"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Önemli Tabloyu Göster"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Düğüm bulunamadı"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Sunucu"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Kayıtlı Kullanıcılar"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Çevirim-dışı Mesajlar"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Kayıtlı Kullanıcılar:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Bağlı Kullanıcılar:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Giden s2s Bağlantıları:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Giden s2s Sunucuları"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Parola Değiştir"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Kullanıcı "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Bağlı Kaynaklar:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Parola:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Veri Yok"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Düğüm "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Dinlenen Kapılar (Portlar)"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "GÜncelle"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Tekrar Başlat"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Durdur"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "RPC Çağrı Hatası"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Veritabanı Tabloları : "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Depolama Tipi"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Elementler"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Boyut"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Bellek"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Hata"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Yedek : "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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 ""
"Bu seçeneklerin sadece gömülü Mnesia veritabanını yedekleyeceğine dikkat "
"edin. Eğer ODBC modülünü kullanıyorsanız, SQL veritabanınızı da ayrıca "
"yedeklemeniz gerekiyor."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "İkili yedeği sakla:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "Tamam"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Hemen ikili yedekten geri al:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"ejabberd'nin bir sonraki tekrar başlatılışında ikili yedekten geri al (daha "
"az bellek gerektirir)"
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Düz metin yedeği sakla:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Hemen düz metin yedekten geri al"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Kullanıcıları bir PIEFXIS dosyasından (XEP-0227) içe aktar:"
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Sunucudaki tüm kullanıcıların verisini PIEFXIS dosyalarına (XEP-0227) dışa "
-"aktar:"
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-"Bir sunucudaki kullanıcıların verisini PIEFXIS dosyalarına (XEP-0227) dışa "
-"aktar:"
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Jabberd 1.4 Spool Dosyalarından Kullanıcıları İçe Aktar:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Jabberd 1.4 Spool Dizininden Kullanıcıları İçe Aktar:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Dinlenen Kapılar (Portlar) : "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Modüller : "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "~p istatistikleri"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Hizmet Süresi:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "İşlemci Zamanı:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Tamamlanan Hareketler (Transactions Committed):"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "İptal Edilen Hareketler (Transactions):"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Tekrar Başlatılan Hareketler (Transactions):"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Kaydı Tutulan Hareketler (Transactions):"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Güncelle "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Planı güncelle"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Değişen modüller"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Güncellenen modüller"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Betiği Güncelle"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Düşük seviye güncelleme betiği"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Betik kontrolü"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Kapı (Port)"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Protokol"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Modül"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Seçenekler"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Sil"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Başlat"
diff --git a/src/msgs/uk.msg b/src/msgs/uk.msg
index c4d95e947..e37b1d163 100644
--- a/src/msgs/uk.msg
+++ b/src/msgs/uk.msg
@@ -14,17 +14,16 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Чи дозволити цьому JID абонувати новини наданого вузла"}.
+{"Allow users to change 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","Сповіщення"}.
+{"Announcements","Оголошення"}.
{"anyone","всім учасникам"}.
-{"A password is required to enter this room","Щоб зайти в цю конференцію, необхідно ввести пароль"}.
{"April","квітня"}.
{"August","серпня"}.
{"Backup Management","Керування резервним копіюванням"}.
@@ -44,10 +43,9 @@
{"City","Місто"}.
{"Commands","Команди"}.
{"Conference room does not exist","Конференція не існує"}.
-{"Configuration of room ~s","Конфігурація кімнати ~s"}.
+{"Configuration for ","Конфігурація "}.
{"Configuration","Конфігурація"}.
{"Connected Resources:","Підключені ресурси:"}.
-{"Connections parameters","Параметри з'єднання"}.
{"Country","Країна"}.
{"CPU Time:","Процесорний час:"}.
{"Database Tables at ","Таблиці бази даних на "}.
@@ -63,7 +61,7 @@
{"Deliver event notifications","Доставляти сповіщення про події"}.
{"Deliver payloads with event notifications","Доставляти разом з повідомленнями про публікації самі публікації"}.
{"Description:","Опис:"}.
-{"Disc only copy","Тільки диск"}.
+{"Disc only copy","тільки диск"}.
{"Displayed Groups:","Видимі групи:"}.
{"Dump Backup to Text File at ","Копіювання в текстовий файл на "}.
{"Dump to Text File","Копіювання в текстовий файл"}.
@@ -75,10 +73,9 @@
{"ejabberd vCard module","ejabberd vCard модуль"}.
{"ejabberd virtual hosts","віртуальні хости ejabberd"}.
{"ejabberd Web Admin","Веб-інтерфейс Адміністрування ejabberd"}.
-{"Elements","Елементи"}.
{"Email","Електронна пошта"}.
{"Enable logging","Включити журнал роботи"}.
-{"Encoding for server ~b","Кодування для сервера ~b"}.
+{"Encodings","Кодування"}.
{"End User Session","Закінчити Сеанс Користувача"}.
{"Enter list of {Module, [Options]}","Введіть перелік такого виду {Module, [Options]}"}.
{"Enter nickname you want to register","Введіть псевдонім, який ви хочете зареєструвати"}.
@@ -86,14 +83,9 @@
{"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-серверів"}.
+{"Enter username and encodings 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Приклад: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","Прізвище"}.
{"February","лютого"}.
{"Fill in fields to search for any matching Jabber User","Заповніть поля для пошуку користувача Jabber"}.
@@ -116,13 +108,10 @@
{"has been kicked","вигнали з кімнати"}.
{" has set the subject to: "," встановив(ла) тему: "}.
{"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.","Щоб вказати різні порти, паролі та кодування для різних серверів IRC, заповніть список значеннями в форматі '{\"irc server\", \"encoding\", port, \"password\"}'. За замовчуванням ця служба використовує \"~s\" кодування, порт ~p, пустий пароль."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","Щоб вказати різні кодування для різних серверів IRC, заповніть список значеннями в форматі '{\"irc server\", \"encoding\"}'. За замовчуванням ця служба використовує кодування \"~s\"."}.
{"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","Неправильний тип повідомлення"}.
@@ -130,24 +119,16 @@
{"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 ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s недопустимий"}.
{"January","січня"}.
-{"Join IRC channel","Приєднатися до каналу IRC"}.
+{"Jabber ID ~s is invalid","JID ~s недопустимий"}.
{"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","Останнє підключення"}.
@@ -160,7 +141,6 @@
{"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","Зробити кімнату захищеною паролем"}.
@@ -171,14 +151,13 @@
{"Max # of items to persist","Максимальне число збережених публікацій"}.
{"Max payload size in bytes","Максимальний розмір корисного навантаження в байтах"}.
{"May","травня"}.
-{"Membership is required to enter this room","В цю конференціию можуть входити тільки її члени"}.
+{"Membership required to enter this room","В цю конференціию можуть входити тільки її члени"}.
{"Members:","Члени:"}.
{"Memory","Пам'ять"}.
{"Message body","Тіло повідомлення"}.
{"Middle Name","По-батькові"}.
{"Moderator privileges required","Необхідні права модератора"}.
{"moderators only","тільки модераторам"}.
-{"Modified modules","Змінені модулі"}.
{"Modules at ","Модулі на "}.
{"Modules","Модулі"}.
{"Module","Модуль"}.
@@ -186,6 +165,8 @@
{"Name:","Назва:"}.
{"Name","Назва"}.
{"Never","Ніколи"}.
+{"Nickname is already in use by another occupant","Псевдонім зайнятий кимось з присутніх"}.
+{"Nickname is registered by another person","Псевдонім зареєстрований кимось іншим"}.
{"Nickname Registration at ","Реєстрація псевдоніма на "}.
{"Nickname ~s does not exist in the room","Псевдонім ~s в кімнаті відсутній"}.
{"Nickname","Псевдонім"}.
@@ -198,14 +179,13 @@
{"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","Кількість зареєстрованих користувачів"}.
+{"Number of online users","Кількість Підключених Користувачів"}.
+{"Number of registered users","Кількість Зареєстрованих Користувачів"}.
{"October","грудня"}.
{"Offline Messages:","Офлайнові повідомлення:"}.
{"Offline Messages","Офлайнові повідомлення"}.
@@ -214,8 +194,8 @@
{"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 and participants are allowed to change subject in this room","Тільки модератори та учасники можуть змінювати тему в цій кімнаті"}.
+{"Only moderators are allowed to change 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","Тільки адміністратор сервісу може надсилати службові повідомлення"}.
@@ -227,7 +207,7 @@
{"Outgoing s2s Servers:","Вихідні s2s-сервери:"}.
{"Owner privileges required","Необхідні права власника"}.
{"Packet","Пакет"}.
-{"Password ~b","Пароль ~b"}.
+{"Password required to enter this room","Щоб зайти в цю конференцію, необхідний пароль"}.
{"Password Verification","Перевірка Пароля"}.
{"Password:","Пароль:"}.
{"Password","Пароль"}.
@@ -237,26 +217,24 @@
{"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 учасників видимими"}.
+{"Present real Jabber IDs to","Зробити реальні JID учасників видимими"}.
{"private, ","приватна, "}.
-{"Protocol","Протокол"}.
{"Publish-Subscribe","Опублікувати-Абонувати"}.
{"PubSub subscriber request","Запит на абонування PubSub"}.
{"Queries to the conference members are not allowed in this room","Запити до користувачів в цій конференції зоборонені"}.
{"RAM and disc copy","ОЗП та диск"}.
{"RAM copy","ОЗП"}.
{"Raw","необроблений формат"}.
-{"Really delete message of the day?","Насправді видалити повідомлення дня?"}.
+{"(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 для "}.
+{"Remark 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), то його резервне копіювання потрібно робити окремо."}.
{"Remote copy","не зберігаеться локально"}.
-{"Remove All Offline Messages","Видалити всі офлайнові повідомлення"}.
{"Remove User","Видалити користувача"}.
{"Remove","Видалити"}.
{"Replaced by new connection","Замінено новим з'єднанням"}.
@@ -270,8 +248,6 @@
{"Restore","Відновлення з резервної копії"}.
{"Room Configuration","Конфігурація кімнати"}.
{"Room creation is denied by service policy","Створювати конференцію заборонено політикою служби"}.
-{"Room description","Опис кімнати"}.
-{"Room Occupants","Учасники кімнати"}.
{"Room title","Назва кімнати"}.
{"Roster groups allowed to subscribe","Дозволені для абонування групи ростера"}.
{"Roster of ","Ростер користувача "}.
@@ -284,19 +260,20 @@
{"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 online users on all hosts","Надіслати оголошення всім підключеним користувачам на всіх віртуальних серверах"}.
+{"Send announcement to all online users","Надіслати оголошення всім підключеним користувачам"}.
{"Send announcement to all users on all hosts","Надіслати сповіщення до усіх користувачів на усіх хостах"}.
-{"Send announcement to all users","Надіслати сповіщення всім користувачам"}.
+{"Send announcement to all users","Надіслати оголошення всім користувачам"}.
{"September","вересня"}.
-{"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","Вимкнути Сервіс"}.
+{"Shut Down Service","Відключити Сервіс"}.
{"~s invites you to the room ~s","~s запрошує вас до кімнати ~s"}.
+{"Size","Розмір"}.
+{"Specified nickname is already registered","Вказаний псевдонім вже зареєстрований"}.
{"Specify the access model","Визначити модель доступу"}.
{"Specify the publisher model","Умови публікації"}.
{"~s's Offline Messages Queue","Черга офлайнових повідомлень ~s"}.
@@ -318,10 +295,6 @@
{"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 collections with which a node is affiliated","Колекція, до якої входить вузел"}.
{"the password is","пароль:"}.
{"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","Цього учасника було відключено від кімнати через те, що він надіслав помилкове повідомлення"}.
@@ -338,8 +311,7 @@
{"Transactions Logged:","Транзакції запротокольовані:"}.
{"Transactions Restarted:","Транзакції перезапущені:"}.
{"Tuesday","Вівторок"}.
-{"Unable to generate a captcha","Не має можливості сгенерувати капчу"}.
-{"Unauthorized","Не авторізован"}.
+{"Updated modules","Поновлені модулі"}.
{"Update message of the day (don't send)","Поновити повідомлення дня (не надсилати)"}.
{"Update message of the day on all hosts (don't send)","Оновити повідомлення дня на всіх хостах (не надсилати)"}.
{"Update plan","План поновлення"}.
@@ -349,13 +321,14 @@
{"Uptime:","Час роботи:"}.
{"Use of STARTTLS required","Ви мусите використовувати STARTTLS"}.
{"User Management","Управління Користувачами"}.
-{"Users are not allowed to register accounts so quickly","Користувачам не дозволено так часто реєструвати облікові записи"}.
+{"Users are not allowed to register accounts so fast","Користувачам не дозволено так часто реєструвати облікові записи"}.
{"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","Середа"}.
@@ -363,9 +336,8 @@
{"Whether to allow subscriptions","Дозволити передплату"}.
{"You have been banned from this room","Вам заборонено входити в цю конференцію"}.
{"You must fill in field \"Nickname\" in the form","Вам необхідно заповнити поле \"Псевдонім\" у формі"}.
-{"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 register 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 register nickname","Для реєстрації псевдоніму необхідний 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.","Черга повідомлень, що не були доставлені, переповнена. Повідомлення не було збережено."}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ваші повідомлення до ~s блокуються. Для розблокування відвідайте ~s"}.
diff --git a/src/msgs/uk.po b/src/msgs/uk.po
index 760849d60..d43a85438 100644
--- a/src/msgs/uk.po
+++ b/src/msgs/uk.po
@@ -9,30 +9,18 @@ msgstr ""
"X-Additional-Translator: Stoune\n"
"X-Additional-Translator: Sergei Golovan\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Ви мусите використовувати STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Не вказаний ресурс"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Замінено новим з'єднанням"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "Введіть текст, що ви бачите"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr "Ваші повідомлення до ~s блокуються. Для розблокування відвідайте ~s"
-
-#: ejabberd_captcha.erl:235
-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 "Команди"
@@ -47,13 +35,13 @@ msgstr "Понг"
#: mod_announce.erl:505
msgid "Really delete message of the day?"
-msgstr "Насправді видалити повідомлення дня?"
+msgstr "Дійсно видалити повідомлення дня"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Тема"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Тіло повідомлення"
@@ -63,11 +51,11 @@ msgstr "Тіло оголошення має бути непустим"
#: mod_announce.erl:633
msgid "Announcements"
-msgstr "Сповіщення"
+msgstr "Оголошення"
#: mod_announce.erl:635
msgid "Send announcement to all users"
-msgstr "Надіслати сповіщення всім користувачам"
+msgstr "Надіслати оголошення всім користувачам"
#: mod_announce.erl:637
msgid "Send announcement to all users on all hosts"
@@ -75,12 +63,12 @@ msgstr "Надіслати сповіщення до усіх користува
#: mod_announce.erl:639
msgid "Send announcement to all online users"
-msgstr "Надіслати сповіщення всім підключеним користувачам"
+msgstr "Надіслати оголошення всім підключеним користувачам"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr ""
-"Надіслати сповіщення всім підключеним користувачам на всіх віртуальних "
+"Надіслати оголошення всім підключеним користувачам на всіх віртуальних "
"серверах"
#: mod_announce.erl:643
@@ -110,627 +98,567 @@ msgid "Delete message of the day on all hosts"
msgstr "Видалити повідомлення дня на усіх хостах"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Конфігурація"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "База даних"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Запуск модулів"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Зупинка модулів"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Резервне копіювання"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Відновлення з резервної копії"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Копіювання в текстовий файл"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Імпорт з файла"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Імпорт з директорії"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Перезапустити Сервіс"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
-msgstr "Вимкнути Сервіс"
+msgstr "Відключити Сервіс"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Додати користувача"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Видалити Користувача"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Закінчити Сеанс Користувача"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Отримати Пароль Користувача"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Змінити Пароль Користувача"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "Отримати Час Останнього Підключення Користувача"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Отримати Статистику по Користувачу"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Отримати Кількість Зареєстрованих Користувачів"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Отримати Кількість Підключених Користувачів"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Списки керування доступом"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Правила доступу"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Управління Користувачами"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Підключені користувачі"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Всі користувачі"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Вихідні s2s-з'єднання"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Працюючі вузли"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Зупинені вузли"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Модулі"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Керування резервним копіюванням"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Імпорт користувачів зі спулу jabberd14"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "До ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Від ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Конфігурація таблиць бази даних на "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Оберіть тип збереження таблиць"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
-msgstr "Тільки диск"
+msgstr "тільки диск"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "ОЗП та диск"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "ОЗП"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "не зберігаеться локально"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Зупинка модулів на "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Виберіть модулі, які необхідно зупинити"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Запуск модулів на "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Введіть перелік такого виду {Module, [Options]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Список завантажуваних модулів"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Резервне копіювання в файл на "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Введіть шлях до резервного файла"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Шлях до файла"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Відновлення з резервної копії на "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Копіювання в текстовий файл на "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Введіть шлях до текстового файла"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Імпортування користувача з файла на "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Введіть шлях до файла зі спула jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Імпортування користувача з директорії на "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Введіть шлях до директорії спула jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "шлях до директорії"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Час затримки"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Конфігурація списків керування доступом"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Списки керування доступом"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Конфігурація доступа"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Правила доступу"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Пароль"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Перевірка Пароля"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
-msgstr "Кількість зареєстрованих користувачів"
+msgstr "Кількість Зареєстрованих Користувачів"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
-msgstr "Кількість підключених користувачів"
+msgstr "Кількість Підключених Користувачів"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Ніколи"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Підключений"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Останнє підключення"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Кількість контактів"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "IP адреси"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Ресурси"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Адміністрування "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Дія над користувачем"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Змінити параметри"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Видалити користувача"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "Доступ заборонений політикою служби"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "IRC Транспорт"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC модуль"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
msgid "You need an x:data capable client to configure mod_irc settings"
-msgstr ""
-"Для налагодження параметрів mod_irc необхідно використовувати клієнт, що має "
-"підтримку x:data"
+msgstr "Для налагодження параметрів mod_irc необхідний x:data-придатний клієнт"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Реєстрація в mod_irc для "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings you wish to use for connecting to IRC servers"
msgstr ""
-"Введіть ім'я користувача, кодування, порти та паролі, що будуть "
-"використовуватися при підключенні до IRC-серверів"
+"Введіть ім'я користувача та кодування, які будуть використовуватися при "
+"підключенні до IRC-серверів"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Ім'я користувача IRC"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"Щоб вказати різні порти, паролі та кодування для різних серверів IRC, "
-"заповніть список значеннями в форматі '{\"irc server\", \"encoding\", port, "
-"\"password\"}'. За замовчуванням ця служба використовує \"~s\" кодування, "
-"порт ~p, пустий пароль."
+"Щоб вказати різні кодування для різних серверів IRC, заповніть список "
+"значеннями в форматі '{\"irc server\", \"encoding\"}'. За замовчуванням ця "
+"служба використовує кодування \"~s\"."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"Приклад: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta."
-"fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Приклад: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "Параметри з'єднання"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Кодування"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "Приєднатися до каналу IRC"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "Канал IRC (не використовуйте спереду #)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC-сервер"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "Приєднатися до каналу IRC"
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "Приєднатися до каналу IRC з Jabber ID: ~s"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "Парметри IRC"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "Ім'я користувача IRC"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "Пароль ~b"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "Порт ~b"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "Кодування для сервера ~b"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "Сервер ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "Тільки адміністратор сервісу може надсилати службові повідомлення"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "Створювати конференцію заборонено політикою служби"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Конференція не існує"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Кімнати"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
-msgstr ""
-"Для реєстрації псевдоніму необхідно використовувати клієнт з ідтримкою x:data"
+msgstr "Для реєстрації псевдоніму необхідний x:data-придатний клієнт"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Реєстрація псевдоніма на "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Введіть псевдонім, який ви хочете зареєструвати"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Псевдонім"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "Псевдонім зареєстровано кимось іншим"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "Вказаний псевдонім вже зареєстрований"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Вам необхідно заповнити поле \"Псевдонім\" у формі"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "ejabberd MUC модуль"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "Конфігурація кімнати змінилась"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "увійшов(ла) в кімнату"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "вийшов(ла) з кімнати"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "заборонили вхід в кімнату"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "вигнали з кімнати"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "вигнано з кімнати як наслідок зміни ранга"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr "вигнано з кімнати тому, що воня стала тільки для учасників"
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "вигнано з кімнати як наслідок зупинки системи"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "змінив(ла) им'я на"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " встановив(ла) тему: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Понеділок"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Вівторок"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Середа"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Четвер"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "П'ятниця"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Субота"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Неділя"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "січня"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "лютого"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "березня"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "квітня"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "травня"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "червня"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "липня"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "серпня"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "вересня"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "грудня"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "листопада"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "грудня"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Конфігурація кімнати"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "Учасники кімнати"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Назва кімнати"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Швидкість передачі інформації було перевищено"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Цього учасника було відключено від кімнати через те, що він надіслав "
"помилкове повідомлення"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "Не дозволяється надсилати приватні повідомлення в конференцію"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Неправильний тип повідомлення"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -738,493 +666,478 @@ msgstr ""
"Цього учасника було відключено від кімнати через те, що він надіслав "
"помилкове повідомлення іншому учаснику"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Не дозволяється надсилати приватні повідомлення типу \"groupchat\""
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "Адресата немає в конференції"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Тільки присутнім дозволяється надсилати повідомленняя в конференцію"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "Приватні повідомлення не дозволені"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Тільки присутнім дозволяється відправляти запити в конференцію"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr "Запити до користувачів в цій конференції зоборонені"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "приватна, "
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change subject in this room"
msgstr "Тільки модератори та учасники можуть змінювати тему в цій кімнаті"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Тільки модератори можуть змінювати тему в цій кімнаті"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Відвідувачам не дозволяється надсилати повідомлення всім присутнім"
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Цього учасника було відключено від кімнати через те, що він надіслав "
"помилковий статус присутності"
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Відвідувачам не дозволяється змінювати псевдонім в цій кімнаті"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
-msgstr "Псевдонім зайнято кимось з присутніх"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "Псевдонім зайнятий кимось з присутніх"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Псевдонім зареєстрований кимось іншим"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Вам заборонено входити в цю конференцію"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "В цю конференціию можуть входити тільки її члени"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Ця кімната не анонімна"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
-msgstr "Щоб зайти в цю конференцію, необхідно ввести пароль"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
+msgstr "Щоб зайти в цю конференцію, необхідний пароль"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "Не має можливості сгенерувати капчу"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Неправильний пароль"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Необхідні права адміністратора"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "Необхідні права модератора"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s недопустимий"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "Псевдонім ~s в кімнаті відсутній"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Недопустимий ранг: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Недопустима роль: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "Необхідні права власника"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "Конфігурація кімнати ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "Конфігурація "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "Опис кімнати"
+msgstr "Опис:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Зробити кімнату постійною"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Зробити кімнату видимою всім"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Зробити список учасників видимим всім"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Зробити кімнату захищеною паролем"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Максимальна кількість учасників"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Без обмежень"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Зробити реальні Jabber ID учасників видимими"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "тільки модераторам"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "всім учасникам"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Кімната тільки для зареєтрованых учасників"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Зробити кімнату модерованою"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Зробити користувачів учасниками за замовчуванням"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Дозволити користувачам змінювати тему"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Дозволити приватні повідомлення"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Дозволити iq-запити до користувачів"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Дозволити користувачам надсилати запрошення"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Дозволити відвідувачам відсилати текст статусу в оновленнях присутності"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Дозволити відвідувачам змінювати псевдонім"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "Зробити кімнату захищеною капчею"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Включити журнал роботи"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
-msgstr ""
-"Для конфігурування кімнати потрібно використовувати клієнт з підтримкою x:"
-"data"
+msgstr "Для конфігурування кімнати необхідний x:data-придатний кліент"
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Кількість присутніх"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s запрошує вас до кімнати ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "пароль:"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Черга повідомлень, що не були доставлені, переповнена. Повідомлення не було "
"збережено."
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "Черга офлайнових повідомлень ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Відправлено"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Час"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Від кого"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Кому"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Пакет"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Видалити виділені"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Офлайнові повідомлення:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "Видалити всі офлайнові повідомлення"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams модуль"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Опублікувати-Абонувати"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Модуль ejabberd Публікації-Абонування"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Запит на абонування PubSub"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "Вирішіть, чи задовольнити запит цього об'єкту на підписку"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID вузла"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Адреса абонента"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Чи дозволити цьому Jabber ID абонувати новини наданого вузла"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Доставляти разом з повідомленнями про публікації самі публікації"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Доставляти сповіщення про події"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "Повідомляти абонентів про зміни в конфігурації збірника"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Повідомляти абонентів про видалення збірника"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr "Повідомляти абонентів про видалення публікацій із збірника"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Зберегати публікації до сховища"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "Псевдонім для вузла"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Максимальне число збережених публікацій"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Дозволити передплату"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Визначити модель доступу"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Дозволені для абонування групи ростера"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Умови публікації"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Максимальний розмір корисного навантаження в байтах"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Коли надсилати останній опублікований елемент"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Доставляти повідомленнями тільки доступним користувачам"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "Колекція, до якої входить вузел"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr "Виберіть назву користувача та пароль для реєстрації на цьому сервері"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Користувачам не дозволено так часто реєструвати облікові записи"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Немає"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Підписка"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Очікування"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Групи"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Затвердити"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Видалити"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Ростер користувача "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Неправильний формат"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Додати Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Ростер"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Спільні групи контактів"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Додати"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Назва:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Опис:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Члени:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Видимі групи:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Група "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Відправити"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "День народження"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Місто"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Країна"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Електронна пошта"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Прізвище"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1232,381 +1145,354 @@ msgstr ""
"Заповніть поля для пошуку користувача Jabber (Додайте * в кінець поля для "
"пошуку підрядка)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Повне ім'я"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "По-батькові"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Назва"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Назва організації"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Відділ організації"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Пошук користувачів в "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Користувач"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
msgstr "Для пошуку необхідний x:data-придатний клієнт"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Пошук користувачів по vCard"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard модуль"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Результати пошуку в "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Заповніть поля для пошуку користувача Jabber"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "Не авторізован"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Веб-інтерфейс Адміністрування ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Адміністрування"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "необроблений формат"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Віртуальні хости"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Конфігурація правила доступу ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "віртуальні хости ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Користувачі"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Статистика останнього підключення користувачів"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Період"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "За останній місяць"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "За останній рік"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Вся статистика"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Показати звичайну таблицю"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Показати інтегральну таблицю"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Статистика"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "не знайдено"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Вузол не знайдено"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Хост"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Зареєстровані користувачі"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Офлайнові повідомлення"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Останнє підключення"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Зареєстровані користувачі:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Підключені користувачі:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Вихідні s2s-з'єднання:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Вихідні s2s-сервери:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Змінити пароль"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Користувач "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Підключені ресурси:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Пароль:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Немає даних"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Вузли"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Статистика"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Користувачі"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Останнє підключення"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Необроблений формат)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "необроблений формат"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Конфігурація правила доступу ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "віртуальні хости ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Статистика останнього підключення користувачів"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Період"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "За останній місяць"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "За останній рік"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Вся статистика"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Показати звичайну таблицю"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Показати інтегральну таблицю"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Вузол не знайдено"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Хост"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Зареєстровані користувачі"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Офлайнові повідомлення"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Зареєстровані користувачі:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Підключені користувачі:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Вихідні s2s-з'єднання:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Вихідні s2s-сервери:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Змінити пароль"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Користувач "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Підключені ресурси:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Пароль:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Немає даних"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Вузол "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Відкриті порти"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Обновити"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Перезапустити"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Зупинити"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Помилка виклику RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Таблиці бази даних на "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Тип таблиці"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "Елементи"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Розмір"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Пам'ять"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "Помилка"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Резервне копіювання "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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), то його резервне копіювання потрібно "
-"робити окремо."
+"Зауважте, що тут відбувається резервне копіювання тільки вбудованної бази "
+"даних Mnesia. Якщо Ви також використовуєте інше сховище для даних (наприклад "
+"за допомогою модуля ODBC), то його резервне копіювання потрібно робити "
+"окремо."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Зберегти бінарну резервну копію:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "Продовжити"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Відновити з бінарної резервної копії негайно:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Відновити з бінарної резервної копії при наступному запуску (потребує менше "
"пам'яті):"
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Зберегти текстову резервну копію:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Відновити з текстової резервної копії негайно:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "Імпорт даних користовучів з файлу PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr "Експорт даних всіх користувачів сервера до файлу PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr "Експорт даних користувачів домена до файлу PIEFXIS (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Імпорт користувачів з файла спула jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Імпорт користувачів з діректорії спула jabberd14:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Відкриті порти на "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Модулі на "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "статистика вузла ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Час роботи:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Процесорний час:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Транзакції завершені:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Транзакції відмінені:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Транзакції перезапущені:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Транзакції запротокольовані:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Поновлення "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "План поновлення"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "Змінені модулі"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "Поновлені модулі"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Сценарій поновлення"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Низькорівневий сценарій поновлення"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Перевірка сценарію"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Порт"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "Протокол"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Модуль"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Параметри"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Видалити"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Запустити"
diff --git a/src/msgs/vi.msg b/src/msgs/vi.msg
index 561c3b9a5..01b3d99b4 100644
--- a/src/msgs/vi.msg
+++ b/src/msgs/vi.msg
@@ -13,7 +13,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","Cho phép JID đăng ký nút môđun xuất bản đăng ký này không?"}.
+{"Allow users to change subject","Cho phép người sử dụng thay đổi chủ đề"}.
{"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"}.
@@ -40,6 +41,7 @@
{"Commands","Lệnh"}.
{"Conference room does not exist","Phòng họp không tồn tại"}.
{"Configuration","Cấu hình"}.
+{"Configuration for ","Cấu hình cho "}.
{"Connected Resources:","Tài Nguyên Được Kết Nối:"}.
{"Country","Quốc gia"}.
{"CPU Time:","Thời Gian CPU:"}.
@@ -69,6 +71,7 @@
{"ejabberd virtual hosts","Máy chủ ảo ejabberd"}.
{"Email","Email"}.
{"Enable logging","Cho phép ghi nhật ký"}.
+{"Encodings","Mã hóa"}.
{"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ý"}.
@@ -76,7 +79,9 @@
{"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"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","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"}.
{"Erlang Jabber Server","Erlang Jabber Server Bản quyền"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Ví dụ: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]"}.
{"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"}.
@@ -96,6 +101,7 @@
{"has been kicked","đã bị đẩy ra khỏi"}.
{" has set the subject to: "," đã đặt chủ đề thành: "}.
{"Host","Máy chủ"}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","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\"."}.
{"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"}.
@@ -112,8 +118,8 @@
{"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"}.
+{"Jabber ID ~s is invalid","JID ~s không hợp lệ"}.
{"joins the room","tham gia phòng này"}.
{"July","Tháng Bảy"}.
{"June","Tháng Sáu"}.
@@ -136,6 +142,7 @@
{"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"}.
+{"Membership required to enter this room","Yêu cầu tư cách thành viên khi tham gia vào phòng này"}.
{"Members:","Thành viên:"}.
{"Memory","Bộ Nhớ"}.
{"Message body","Thân thư"}.
@@ -150,6 +157,8 @@
{"Name","Tên"}.
{"Never","Không bao giờ"}.
{"Nickname","Bí danh"}.
+{"Nickname is already in use by another occupant","Bí danh đang do một người tham dự khác sử dụng"}.
+{"Nickname is registered by another person","Một người khác đã đăng ký bí danh này rồi"}.
{"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"}.
@@ -176,6 +185,8 @@
{"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 moderators and participants are allowed to change subject in this room","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"}.
+{"Only moderators are allowed to change subject in this room","Chỉ có những người điều phối được phép thay đổi chủ đề trong phòng này"}.
{"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ụ"}.
@@ -189,6 +200,7 @@
{"Packet","Gói thông tin"}.
{"Password:","Mật Khẩu:"}.
{"Password","Mật Khẩu"}.
+{"Password required to enter this room","Yêu cầu nhập mật khẩu để vào phòng này"}.
{"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"}.
@@ -198,19 +210,21 @@
{"Ping","Ping"}.
{"Pong","Pong"}.
{"Port","Cổng"}.
-{"Present real Jabber IDs to","Jabber ID thực tế hiện hành đến"}.
+{"Present real Jabber IDs to","JID 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ô)"}.
{"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 "}.
+{"Remark 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.","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."}.
{"Remote copy","Sao chép từ xa"}.
{"Remove","Gỡ bỏ"}.
{"Remove User","Gỡ Bỏ Người Sử Dụng"}.
@@ -248,6 +262,8 @@
{"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"}.
+{"Size","Kích thước"}.
+{"Specified nickname is already registered","Bí danh xác định đã đăng ký rồi"}.
{"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"}.
@@ -284,6 +300,7 @@
{"Tuesday","Thứ Ba"}.
{"Update ","Cập Nhật "}.
{"Update","Cập Nhật"}.
+{"Updated modules","Môđun 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"}.
@@ -297,6 +314,7 @@
{"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"}.
diff --git a/src/msgs/vi.po b/src/msgs/vi.po
index 1c52e28cb..963841636 100644
--- a/src/msgs/vi.po
+++ b/src/msgs/vi.po
@@ -7,31 +7,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Vietnamese (tiếng việt)\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "Yêu cầu sử dụng STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Không có nguồn lực cung cấp"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Được thay thế bởi kết nối mới"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-#, fuzzy
-msgid "Enter the text you see"
-msgstr "Nhập đường dẫn đến tập tin văn bản"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-
-#: ejabberd_captcha.erl:235
-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"
@@ -48,11 +35,11 @@ msgstr "Pong"
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:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Tiêu đề"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Thân thư"
@@ -76,7 +63,7 @@ msgstr "Gửi thông báo đến tất cả người sử dụng trên tất c
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:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
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ủ"
@@ -108,1142 +95,1054 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Cấu hình"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Cơ sở dữ liệu"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Môđun Khởi Động"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Môđun Dừng"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Sao lưu dự phòng"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Khôi phục"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
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:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Nhập Tập Tin"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Nhập Thư Mục"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Khởi Động Lại Dịch Vụ"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Tắt Dịch Vụ"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Thêm Người Sử Dụng"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Xóa Người Sử Dụng"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
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:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Nhận Mật Khẩu Người Sử Dụng"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Thay Đổi Mật Khẩu Người Sử Dụng"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
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:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
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:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Nhận Số Người Sử Dụng Đã Đăng Ký"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
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:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Danh Sách Kiểm Soát Truy Cập"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Quy Tắc Truy Cập"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Quản Lý Người Sử Dụng"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Người Sử Dụng Trực Tuyến"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Tất Cả Người Sử Dụng"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Kết Nối Bên Ngoài s2s"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nút Hoạt Động"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nút Dừng"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Môđun"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Quản lý Sao Lưu Dự Phòng"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
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:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Gửi đến ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Nhận từ ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Cấu Hình Bảng Cơ Sở Dữ Liệu tại"
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Chọn loại bảng lưu trữ"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Chỉ sao chép vào đĩa"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Sao chép vào RAM và đĩa"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Sao chép vào RAM"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Sao chép từ xa"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Môđun Dừng tại"
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Chọn môđun để dừng"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Môđun Khởi Động tại "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Nhập danh sách {Môđun, [Các Tùy Chọn]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Danh sách các môđun khởi động"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Sao lưu dự phòng ra Tập Tin tại"
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
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:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Đường dẫn đến Tập Tin"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Phục hồi Sao Lưu từ Tập Tin tại "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
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:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Nhập đường dẫn đến tập tin văn bản"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Nhập Người Sử Dụng từ Tập Tin tại"
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Nhập đường dẫn đến tập tin spool jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Nhập Người Sử Dụng từ Thư Mục tại"
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Nhập đường dẫn đến thư mục spool jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Đường Dẫn đến Thư Mục"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Thời gian trì hoãn"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Cấu Hình Danh Sách Kiểm Soát Truy Cập"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Danh sách kiểm soát truy cập"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Cấu Hình Truy Cập"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Quy tắc Truy Cập"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Mật Khẩu"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Kiểm Tra Mật Khẩu"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Số người sử dụng đã đăng ký"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Số người sử dụng trực tuyến"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Không bao giờ"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Trực tuyến"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Đăng nhập lần cuối"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Kích thước bảng phân công"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Địa chỉ IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Nguồn tài nguyên"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Quản trị về "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Hành động đối với người sử dụng"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Chỉnh Sửa Thuộc Tính"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Gỡ Bỏ Người Sử Dụng"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
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:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Truyền tải IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Môdun ejabberd IRC Bản quyền"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Đăng ký trong mod_irc cho "
-#: mod_irc/mod_irc.erl:569
-#, fuzzy
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "Tên truy cập IRC"
-#: mod_irc/mod_irc.erl:584
-#, fuzzy
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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:596
-#, fuzzy
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
"Ví dụ: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
"\"}]"
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr ""
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Mã hóa"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:720
-#, fuzzy
-msgid "IRC server"
-msgstr "Tên truy cập IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr ""
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:851
-#, 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:857
-#, fuzzy
-msgid "IRC username"
-msgstr "Tên truy cập IRC"
-
-#: mod_irc/mod_irc.erl:906
-#, fuzzy
-msgid "Password ~b"
-msgstr "Mật Khẩu"
-
-#: mod_irc/mod_irc.erl:911
-#, fuzzy
-msgid "Port ~b"
-msgstr "Cổng"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr ""
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
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:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Phòng họp không tồn tại"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Phòng trò chuyện"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register 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:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Đăng Ký Bí Danh tại"
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Nhập bí danh bạn muốn đăng ký"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Bí danh"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-#, 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:611
+msgid "Specified nickname is already registered"
+msgstr "Bí danh xác định đã đăng ký rồi"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Môdun ejabberd MUC Bản quyền"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
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:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "tham gia phòng này"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "rời khỏi phòng này"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "đã bị cấm"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "đã bị đẩy ra khỏi"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr ""
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr ""
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "bây giờ được biết như"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " đã đặt chủ đề thành: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "Thứ Hai"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "Thứ Ba"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "Thứ Tư"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "Thứ Năm"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "Thứ Sáu"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "Thứ Bảy"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "Chủ Nhật"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "Tháng Một"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "Tháng Hai"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "Tháng Ba"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "Tháng Tư"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "Tháng Năm"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "Tháng Sáu"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "Tháng Bảy"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "Tháng Tám"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "Tháng Chín"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "Tháng Mười"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "Tháng Mười Một"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "Tháng Mười Hai"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Cấu Hình Phòng"
-#: mod_muc/mod_muc_log.erl:749
-#, fuzzy
-msgid "Room Occupants"
-msgstr "Số người tham dự"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Tên phòng"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
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:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Loại thư không phù hợp"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
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:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
#, 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:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "riêng,"
-#: mod_muc/mod_muc_room.erl:801
-#, fuzzy
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change 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:806
-#, fuzzy
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change 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:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
#, 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:915 mod_muc/mod_muc_room.erl:1505
-#, fuzzy
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "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:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "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_room.erl:1473
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:1497
-#, fuzzy
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership 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:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Phòng này không nặc danh"
-#: mod_muc/mod_muc_room.erl:1559
-#, fuzzy
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password 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:1581
-msgid "Unable to generate a captcha"
-msgstr ""
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Mật khẩu sai"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "Yêu cầu đặc quyền của nhà quản trị"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
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:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s không hợp lệ"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
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:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Tư cách không hợp lệ: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Vai trò không hợp lệ: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
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:2820
-#, fuzzy
-msgid "Configuration of room ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
msgstr "Cấu hình cho "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
#, fuzzy
msgid "Room description"
msgstr "Miêu tả:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Tạo phòng bền vững"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
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:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Tạo danh sách người tham dự công khai"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
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:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Số Lượng Người Tham Dự Tối Đa"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Không giới hạn"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Jabber ID thực tế hiện hành đến"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "nhà điều phối duy nhất"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "bất kỳ ai"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
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:2890
+#: mod_muc/mod_muc_room.erl:2748
#, fuzzy
msgid "Make room moderated"
msgstr "Tạo phòng bền vững"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
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:2896
-#, fuzzy
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Cho phép người sử dụng thay đổi chủ đề"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
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:2902
+#: mod_muc/mod_muc_room.erl:2760
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:2905
+#: mod_muc/mod_muc_room.erl:2763
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:2908
+#: mod_muc/mod_muc_room.erl:2766
#, 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:2911
+#: mod_muc/mod_muc_room.erl:2769
#, 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:2917
-#, 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:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Cho phép ghi nhật ký"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Số người tham dự"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
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:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "mật khẩu là"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "~s's Danh Sách Chờ Thư Ngoại Tuyến"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Đã gửi"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Thời Gian"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Từ"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Đến"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Gói thông tin"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Tùy chọn Xóa được Chọn"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Thư Ngoại Tuyến:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-#, fuzzy
-msgid "Remove All Offline Messages"
-msgstr "Thư Ngoại Tuyến"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Môdun SOCKS5 Bytestreams Bản quyền"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Xuất Bản-Đăng Ký"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Môdun ejabberd Xuất Bản-Đăng Ký Bản quyền"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
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:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
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:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID Nút"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Địa Chỉ Người Đăng Ký"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
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:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Đưa ra các thông báo sự kiện"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
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:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
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:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Những mục cần để lưu trữ"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Số mục tối đa để lưu trữ"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Xác định nên cho phép đăng ký không"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Xác định mô hình truy cập"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr ""
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Xác định mô hình nhà xuất bản"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Kích thước dung lượng byte tối đa"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
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:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
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:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr ""
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
+#: mod_register.erl:232
#, fuzzy
-msgid "Users are not allowed to register accounts so quickly"
+msgid "Users are not allowed to register accounts so fast"
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:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Không có"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Đăng ký"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Chờ"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Nhóm"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Xác nhận hợp lệ"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Gỡ bỏ"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Bảng phân công của "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Định dạng hỏng"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Thêm Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Bảng phân công"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Nhóm Phân Công Chia Sẻ"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Thêm Mới"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Tên:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Miêu tả:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Thành viên:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Nhóm được hiển thị:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Nhóm "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Gửi"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server Bản quyền"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Ngày sinh"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Thành phố"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Quốc gia"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Email"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "Họ"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1251,409 +1150,361 @@ 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "Tên Đầy Đủ"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "Họ Đệm"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "Tên"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "Tên Tổ Chức"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Bộ Phận"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Tìm kiếm người sử dụng trong"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Người sử dụng"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Tìm Kiếm Người Sử Dụng vCard"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Môdun ejabberd vCard Bản quyền"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Kết Quả Tìm Kiếm cho "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
#, fuzzy
msgid "ejabberd Web Admin"
msgstr "Giao diện Web ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Quản trị"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Thô"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Máy Chủ Ảo"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s cấu hình quy tắc truy cập"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Máy chủ ảo ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Người sử dụng"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Hoạt Động Cuối Cùng Của Người Sử Dụng"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Giai đoạn: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Tháng trước"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Năm trước"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Tất cả hoạt động"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Hiển Thị Bảng Thường"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Hiển Thị Bảng Đầy Đủ"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Số liệu thống kê"
-
-#: web/ejabberd_web_admin.erl:1097
-#, fuzzy
-msgid "Not Found"
-msgstr "Nút không tìm thấy"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Nút không tìm thấy"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Máy chủ"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Người Sử Dụng Đã Đăng Ký"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Thư Ngoại Tuyến"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Hoạt Động Cuối Cùng"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Người Sử Dụng Đã Đăng Ký:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Người Sử Dụng Trực Tuyến:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Kết Nối Bên Ngoài s2s:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Máy chủ Bên Ngoài s2s:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Thay Đổi Mật Khẩu"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Người sử dụng "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Tài Nguyên Được Kết Nối:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Mật Khẩu:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Không Dữ Liệu"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nút"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Số liệu thống kê"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Người sử dụng"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Hoạt Động Cuối Cùng"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Thô)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Thô"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s cấu hình quy tắc truy cập"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Máy chủ ảo ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Hoạt Động Cuối Cùng Của Người Sử Dụng"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Giai đoạn: "
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Tháng trước"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Năm trước"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Tất cả hoạt động"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Hiển Thị Bảng Thường"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Hiển Thị Bảng Đầy Đủ"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Nút không tìm thấy"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Máy chủ"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Người Sử Dụng Đã Đăng Ký"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Thư Ngoại Tuyến"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Người Sử Dụng Đã Đăng Ký:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Người Sử Dụng Trực Tuyến:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Kết Nối Bên Ngoài s2s:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Máy chủ Bên Ngoài s2s:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Thay Đổi Mật Khẩu"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Người sử dụng "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Tài Nguyên Được Kết Nối:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Mật Khẩu:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Không Dữ Liệu"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nút "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Cổng Kết Nối"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Cập Nhật"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Khởi động lại"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Dừng"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Lỗi Gọi RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Bảng Cơ Sở Dữ Liệu tại"
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Loại Lưu Trữ"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr ""
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Kích thước"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Bộ Nhớ"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Sao lưu dự phòng về"
-#: web/ejabberd_web_admin.erl:1958
-#, fuzzy
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Lưu dữ liệu sao lưu dạng nhị phân:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
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:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
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:1992
+#: web/ejabberd_web_admin.erl:1793
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:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2021
-#, 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:2028
-#, 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:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Cổng Liên Lạc tại"
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Môđun tại "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Thống kê về ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Thời gian tải lên:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Thời Gian CPU:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Giao Dịch Được Cam Kết:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Giao Dịch Hủy Bỏ:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Giao Dịch Khởi Động Lại:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Giao Dịch Được Ghi Nhận:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Cập Nhật "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Kế hoạch cập nhật"
-#: web/ejabberd_web_admin.erl:2177
-#, fuzzy
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr "Môđun cập nhật"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Cập nhận lệnh"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Lệnh cập nhật mức độ thấp"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Lệnh kiểm tra"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Cổng"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2350
-#, fuzzy
-msgid "Protocol"
-msgstr "Cổng"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Môđun"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Tùy chọn"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Xóa"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Khởi động"
-#~ msgid "Encodings"
-#~ msgstr "Mã hóa"
-
-#~ msgid "(Raw)"
-#~ msgstr "(Thô)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "Máy Chủ Ảo"
-
-#~ 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)"
diff --git a/src/msgs/wa.msg b/src/msgs/wa.msg
index 3ba9711cd..5b5c8f9cd 100644
--- a/src/msgs/wa.msg
+++ b/src/msgs/wa.msg
@@ -14,7 +14,8 @@
{"Administrator privileges required","I fåt des priviledjes di manaedjeu"}.
{"A friendly name for the node","On no uzeu-ahessåve pol nuk"}.
{"All activity","Dispoy todi"}.
-{"Allow this Jabber ID to subscribe to this pubsub node?","Permete ki ci Jabber ID ci si poye abouner a ç' nuk eplaidaedje-abounmint ci?"}.
+{"Allow this Jabber ID to subscribe to this pubsub node?","Permete ki ci JID ci si poye abouner a ç' nuk eplaidaedje-abounmint ci?"}.
+{"Allow users to change subject","Les uzeus polèt candjî l' tite"}.
{"Allow users to query other users","Les uzeus polèt cweri ls ôtes uzeus"}.
{"Allow users to send invites","Les uzeus polèt evoyî priyaedjes"}.
{"Allow users to send private messages","Les uzeus polèt evoyî des messaedjes privés"}.
@@ -43,6 +44,7 @@
{"Commands","Comandes"}.
{"Conference room does not exist","Li såle di conferince n' egzistêye nén"}.
{"Configuration","Apontiaedjes"}.
+{"Configuration for ","Apontiaedje po "}.
{"Connected Resources:","Raloyî avou les rsoûces:"}.
{"Country","Payis"}.
{"CPU Time:","Tins CPU:"}.
@@ -73,6 +75,7 @@
{"ejabberd Web Admin","Manaedjeu waibe ejabberd"}.
{"Email","Emile"}.
{"Enable logging","Mete en alaedje li djournå"}.
+{"Encodings","Ecôdaedjes"}.
{"End User Session","Fini l' session d' l' uzeu"}.
{"Enter list of {Module, [Options]}","Dinez ene djivêye del cogne {Module, [Tchuzes]}"}.
{"Enter nickname you want to register","Dinez l' metou no ki vos vloz edjîstrer"}.
@@ -80,7 +83,9 @@
{"Enter path to jabberd14 spool dir","Dinez l' tchimin viè l' ridant di spool jabberd14"}.
{"Enter path to jabberd14 spool file","Dinez l' tchimin viè l' fitchî di spool jabberd14"}.
{"Enter path to text file","Dinez l' tchimin viè l' fitchî tecse"}.
+{"Enter username and encodings you wish to use for connecting to IRC servers","Dinez les nos d' uzeu et ls ecôdaedjes ki vos vloz eployî po vs raloyî åzès sierveus IRC"}.
{"Erlang Jabber Server","Sierveu Jabber Erlang"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","Egzimpe: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"Family Name","No d' famile"}.
{"February","fevrî"}.
{"Fill in fields to search for any matching Jabber User","Rimplixhoz les tchamps po cweri èn uzeu Jabber"}.
@@ -103,6 +108,7 @@
{"has been kicked because the room has been changed to members-only","a stî pité evoye cåze ki l' såle a stî ristrindowe åzès mimbes seulmint"}.
{" has set the subject to: "," a candjî l' tite a: "}.
{"Host","Sierveu"}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","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»."}.
{"Import Directory","Sititchî d' on ridant"}.
{"Import File","Sititchî d' on fitchî"}.
{"Import User from File at ","Sititchî uzeu d' on fitchî so "}.
@@ -120,8 +126,8 @@
{"It is not allowed to send private messages of type \"groupchat\"","C' est nén possibe d' evoyî des messaedjes privés del sôre «groupchat»"}.
{"It is not allowed to send private messages to the conference","On n' pout nén evoyî des messaedjes privés dins cisse conferince ci"}.
{"Jabber ID","ID Jabber"}.
-{"Jabber ID ~s is invalid","Li Jabber ID ~s n' est nén valide"}.
{"January","djanvî"}.
+{"Jabber ID ~s is invalid","Li JID ~s n' est nén valide"}.
{"joins the room","arive sol såle"}.
{"July","djulete"}.
{"June","djun"}.
@@ -145,6 +151,7 @@
{"Max # of items to persist","Nombe macsimoms di cayets permanints"}.
{"Max payload size in bytes","Contnou macsimom en octets"}.
{"May","may"}.
+{"Membership required to enter this room","I fåt esse mimbe po poleur intrer dins cisse såle ci"}.
{"Members:","Mimbes:"}.
{"Memory","Memwere"}.
{"Message body","Coir do messaedje"}.
@@ -158,6 +165,8 @@
{"Name","No"}.
{"Name:","Pitit no:"}.
{"Never","Måy"}.
+{"Nickname is already in use by another occupant","Li metou no est ddja eployî pa ene ôte sakî sol såle"}.
+{"Nickname is registered by another person","Li metou no est ddja edjîstré pa ene ôte sakî"}.
{"Nickname","Metou no"}.
{"Nickname Registration at ","Edjîstraedje di metou no amon "}.
{"Nickname ~s does not exist in the room","Li metou no ~s n' egzistêye nén dins l' såle"}.
@@ -185,6 +194,8 @@
{"Online Users:","Uzeus raloyîs:"}.
{"Online Users","Uzeus raloyîs"}.
{"Only deliver notifications to available users","Seulmint evoyî des notifiaedje åzès uzeus disponibes"}.
+{"Only moderators and participants are allowed to change subject in this room","Seulmint les moderateus et les pårticipants polèt candjî l' sudjet dins cisse såle ci"}.
+{"Only moderators are allowed to change subject in this room","Seulmint les moderateus polèt candjî l' sudjet dins cisse såle ci"}.
{"Only occupants are allowed to send messages to the conference","Seulmint les prezints polèt evoyî des messaedjes al conferince"}.
{"Only occupants are allowed to send queries to the conference","Seulmint les prezints polèt evoyî des cweraedjes sol conferince"}.
{"Only service administrators are allowed to send service messages","Seulmint les manaedjeus d' siervices polèt evoyî des messaedjes di siervice"}.
@@ -196,6 +207,7 @@
{"Outgoing s2s Servers:","Sierveus s2s e rexhowe:"}.
{"Owner privileges required","I fåt des priviledjes di prôpietaire"}.
{"Packet","Paket"}.
+{"Password required to enter this room","I fåt dner on scret po poleur intrer dins cisse såle ci"}.
{"Password:","Sicret:"}.
{"Password","Sicret"}.
{"Password Verification","Acertinaedje do scret"}.
@@ -207,19 +219,21 @@
{"Ping","Ping"}.
{"Pong","Pong"}.
{"Port","Pôrt"}.
-{"Present real Jabber IDs to","Mostrer les vraiys Jabber IDs a"}.
+{"Present real Jabber IDs to","Mostrer les vraiys JIDs a"}.
{"private, ","privé, "}.
{"Publish-Subscribe","Eplaidaedje-abounmint"}.
{"PubSub subscriber request","Dimande d' eplaidaedje-abounmint d' èn abouné"}.
{"Queries to the conference members are not allowed in this room","Les cweraedjes des mimbes del conferince ni sont nén permetous dins cisse såle ci"}.
{"RAM and disc copy","Copeye e memwere (RAM) et sol deure plake"}.
{"RAM copy","Copeye e memwere (RAM)"}.
+{"(Raw)","(Dinêyes brutes)"}.
{"Raw","Dinêyes brutes"}.
{"Really delete message of the day?","Voloz vs vormint disfacer l' messaedje do djoû?"}.
{"Recipient is not in the conference room","Li riçuveu n' est nén dins l' såle di conferince"}.
{"Registered Users:","Uzeus edjistrés:"}.
{"Registered Users","Uzeus edjistrés"}.
{"Registration in mod_irc for ","Edjîstraedje dins mod_irc po "}.
+{"Remark 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.","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."}.
{"Remote copy","Copeye å lon"}.
{"Remove","Oister"}.
{"Remove User","Disfacer l' uzeu"}.
@@ -258,6 +272,8 @@
{"Show Ordinary Table","Mostrer crexhince"}.
{"Shut Down Service","Arester siervice"}.
{"~s invites you to the room ~s","~s vos preye sol såle ~s"}.
+{"Size","Grandeu"}.
+{"Specified nickname is already registered","Li no metou dné est ddja edjîstré"}.
{"Specify the access model","Sipecifyî l' modele d' accès"}.
{"Specify the publisher model","Dinez l' modele d' eplaideu"}.
{"~s's Offline Messages Queue","messaedjes ki ratindèt el cawêye po ~s"}.
@@ -295,6 +311,7 @@
{"Transactions Logged:","Transaccions wårdêyes e djournå:"}.
{"Transactions Restarted:","Transaccions renondêyes:"}.
{"Tuesday","mårdi"}.
+{"Updated modules","Modules metous a djoû"}.
{"Update message of the day (don't send)","Mete a djoû l' messaedje do djoû (nén l' evoyî)"}.
{"Update message of the day on all hosts (don't send)","Mete a djoû l' messaedje do djoû so tos les lodjoes (nén l' evoyî)"}.
{"Update ","Metaedje a djoû "}.
@@ -304,12 +321,14 @@
{"Uptime:","Tins dispoy l' enondaedje:"}.
{"Use of STARTTLS required","L' eployaedje di STARTTL est oblidjî"}.
{"User Management","Manaedjaedje des uzeus"}.
+{"Users are not allowed to register accounts so fast","Les noveas uzeus n' si polèt nén edjîstrer si raddimint"}.
{"Users Last Activity","Dierinne activité des uzeus"}.
{"Users","Uzeus"}.
{"User ","Uzeu "}.
{"User","Uzeu"}.
{"Validate","Valider"}.
{"vCard User Search","Calpin des uzeus"}.
+{"Virtual Hosts","Forveyous sierveus"}.
{"Visitors are not allowed to change their nicknames in this room","Les viziteus èn polèt nén candjî leus metous no po ç' såle ci"}.
{"Visitors are not allowed to send messages to all occupants","Les viziteus n' polèt nén evoyî des messaedjes a tos les prezints"}.
{"Wednesday","mierkidi"}.
diff --git a/src/msgs/wa.po b/src/msgs/wa.po
index 66426714a..024844d1e 100644
--- a/src/msgs/wa.po
+++ b/src/msgs/wa.po
@@ -7,31 +7,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Walon (Walloon)\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
msgstr "L' eployaedje di STARTTL est oblidjî"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "Nole rissoûce di dnêye"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "Replaecî pa on novea raloyaedje"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-#, fuzzy
-msgid "Enter the text you see"
-msgstr "Dinez l' tchimin viè l' fitchî tecse"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr ""
-
-#: ejabberd_captcha.erl:235
-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"
@@ -48,11 +35,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "Voloz vs vormint disfacer l' messaedje do djoû?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "Sudjet"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "Coir do messaedje"
@@ -76,7 +63,7 @@ msgstr "Evoyî l' anonce a tos les uzeus so tos les lodjoes"
msgid "Send announcement to all online users"
msgstr "Evoyî l' anonce a tos les uzeus raloyîs"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
msgstr "Evoyî l' anonce a tos les uzeus raloyîs so tos les lodjoes"
@@ -106,637 +93,572 @@ 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:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "Apontiaedjes"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "Båze di dnêyes"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "Enonder des modules"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "Arester des modules"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "Copeye di såvrité"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "Rapexhî"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "Schaper en on fitchî tecse"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "Sititchî d' on fitchî"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "Sititchî d' on ridant"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "Renonder siervice"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "Arester siervice"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "Radjouter èn uzeu"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "Disfacer èn uzeu"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "Fini l' session d' l' uzeu"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "Riçure sicret d' l' uzeu"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "Candjî l' sicret d' l' uzeu"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
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:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "Riçure les statistikes di l' uzeu"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "Riçure li nombe d' uzeus edjîstrés"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "Riçure li nombe d' uzeus raloyîs"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "Droets (ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "Rîles d' accès"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "Manaedjaedje des uzeus"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "Uzeus raloyîs"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "Tos les uzeus"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
msgstr "Raloyaedjes s2s e rexhowe"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
msgstr "Nuks en alaedje"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "Nuks essoctés"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "Modules"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "Manaedjaedje des copeyes di såvrité"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
msgstr "Sititchî des uzeus Jabberd 1.4"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "Viè ~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "Dispoy ~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "Apontiaedje des tåves del båze di dnêyes so "
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "Tchoezi l' sôre di wårdaedje po les tåves"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "Copeye seulmint sol deure plake"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "Copeye e memwere (RAM) et sol deure plake"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "Copeye e memwere (RAM)"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "Copeye å lon"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "Arester les modules so "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "Tchoezixhoz les modules a-z arester"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "Renonder les modules so "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "Dinez ene djivêye del cogne {Module, [Tchuzes]}"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "Djivêye di modules a-z enonder"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "Fé ene copeye di såvrité dins on fitchî so "
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "Dinez l' tchimin viè l' fitchî copeye di såvrité"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "Tchimin viè l' fitchî"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "Rapexhî dispoy li fitchî copeye di såvrité so "
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "Copeye di såvritè viè on fitchî tecse so "
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "Dinez l' tchimin viè l' fitchî tecse"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "Sititchî uzeu d' on fitchî so "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
msgstr "Dinez l' tchimin viè l' fitchî di spool jabberd14"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "Sitichî des uzeus d' on ridant so "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
msgstr "Dinez l' tchimin viè l' ridant di spool jabberd14"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "Tchimin viè l' ridant"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "Tårdjaedje"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "Apontiaedje des droets (ACL)"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "Droets (ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "Apontiaedje des accès"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "Rîles d' accès"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "ID Jabber"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "Sicret"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "Acertinaedje do scret"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "Nombe d' uzeus edjîstrés"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "Nombe d' uzeus raloyîs"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "Måy"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "Raloyî"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "Dierin elodjaedje"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "Grandeu del djivêye des soçons"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
msgstr "Adresses IP"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "Rissoûces"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "Manaedjaedje di "
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "Accion so l' uzeu"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "Candjî les prôpietés"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "Disfacer l' uzeu"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "L' accès a stî rfuzé pal politike do siervice"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
msgstr "Transpoirt IRC"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "Module IRC po ejabberd"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
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:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
msgstr "Edjîstraedje dins mod_irc po "
-#: mod_irc/mod_irc.erl:569
-#, fuzzy
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
+"Enter username and encodings 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:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
msgstr "No d' uzeu IRC"
-#: mod_irc/mod_irc.erl:584
-#, fuzzy
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
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:596
-#, fuzzy
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
"Egzimpe: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr ""
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "Ecôdaedjes"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:720
-#, fuzzy
-msgid "IRC server"
-msgstr "No d' uzeu IRC"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr ""
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:851
-#, 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:857
-#, fuzzy
-msgid "IRC username"
-msgstr "No d' uzeu IRC"
-
-#: mod_irc/mod_irc.erl:906
-#, fuzzy
-msgid "Password ~b"
-msgstr "Sicret"
-
-#: mod_irc/mod_irc.erl:911
-#, fuzzy
-msgid "Port ~b"
-msgstr "Pôrt"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr ""
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr ""
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
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:481
+#: mod_muc/mod_muc.erl:446
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:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "Li såle di conferince n' egzistêye nén"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "Såles di berdelaedje"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register 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:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "Edjîstraedje di metou no amon "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "Dinez l' metou no ki vos vloz edjîstrer"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "Metou no"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-#, 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:611
+msgid "Specified nickname is already registered"
+msgstr "Li no metou dné est ddja edjîstré"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
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:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
msgstr "Module MUC (såles di berdelaedje) po ejabberd"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "L' apontiaedje del såle di berdelaedje a candjî"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "arive sol såle"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "cwite li såle"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "a stî bani"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "a stî pité evoye"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
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:405
+#: mod_muc/mod_muc_log.erl:365
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:408
+#: mod_muc/mod_muc_log.erl:368
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:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "est asteure kinoxhou come"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
msgstr " a candjî l' tite a: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "londi"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "mårdi"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "mierkidi"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "djudi"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "vénrdi"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "semdi"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "dimegne"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "djanvî"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "fevrî"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "måss"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "avri"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "may"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "djun"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "djulete"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "awousse"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "setimbe"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "octôbe"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "nôvimbe"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "decimbe"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "Apontiaedje del såle"
-#: mod_muc/mod_muc_log.erl:749
-#, fuzzy
-msgid "Room Occupants"
-msgstr "Nombe di prezints"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "Tite del såle"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "Li limite pol volume di trafik a stî passêye"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
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:248
+#: mod_muc/mod_muc_room.erl:312
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:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
msgstr "Sôre di messaedje nén valide"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
@@ -744,509 +666,485 @@ 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:416
+#: mod_muc/mod_muc_room.erl:487
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:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
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:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
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:457
+#: mod_muc/mod_muc_room.erl:528
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:503
+#: mod_muc/mod_muc_room.erl:574
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:515
+#: mod_muc/mod_muc_room.erl:586
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:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
msgstr "privé, "
-#: mod_muc/mod_muc_room.erl:801
-#, fuzzy
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
+"Only moderators and participants are allowed to change 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:806
-#, fuzzy
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "Seulmint les moderateus polèt candjî l' sudjet dins cisse såle ci"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
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:884
+#: mod_muc/mod_muc_room.erl:931
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:902
+#: mod_muc/mod_muc_room.erl:949
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:915 mod_muc/mod_muc_room.erl:1505
-#, fuzzy
-msgid "That nickname is already in use by another occupant"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "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:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "Li metou no est ddja edjîstré pa ene ôte sakî"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "Vos avoz stî bani di cisse såle ci"
-#: mod_muc/mod_muc_room.erl:1497
-#, fuzzy
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership 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:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "Cisse såle ci n' est nén anonime"
-#: mod_muc/mod_muc_room.erl:1559
-#, fuzzy
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password 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:1581
-msgid "Unable to generate a captcha"
-msgstr ""
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "Sicret nén corek"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "I fåt des priviledjes di manaedjeu"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
msgstr "I fåt des priviledjes di moderateu"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Li Jabber ID ~s n' est nén valide"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
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:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "Afiyaedje nén valide: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "Role nén valide: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "I fåt des priviledjes di prôpietaire"
-#: mod_muc/mod_muc_room.erl:2820
-#, fuzzy
-msgid "Configuration of room ~s"
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
msgstr "Apontiaedje po "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
#, fuzzy
msgid "Room description"
msgstr "Discrijhaedje:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
msgstr "Rinde li såle permaninte"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "Rinde li såle di berdelaedje cweråve publicmint"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "Rinde publike li djivêye des pårticipants"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
msgstr "Rinde li såle di berdelaedje protedjeye pa scret"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
msgstr "Nombe macsimom di prezints"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "Pont d' limite"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
msgstr "Mostrer les vraiys Jabber IDs a"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
msgstr "les moderateus seulmint"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "tot l' minme kî"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "Rinde li såle di berdelaedje ristrindowe ås mimbes seulmint"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
msgstr "Rinde li såle di berdelaedje moderêye"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
msgstr "Les uzeus sont des pårticipants come prémetowe dujhance"
-#: mod_muc/mod_muc_room.erl:2896
-#, fuzzy
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "Les uzeus polèt candjî l' tite"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "Les uzeus polèt evoyî des messaedjes privés"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "Les uzeus polèt cweri ls ôtes uzeus"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "Les uzeus polèt evoyî priyaedjes"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
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:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "Permete ki les viziteus candjexhe leus metous nos"
-#: mod_muc/mod_muc_room.erl:2917
-#, fuzzy
-msgid "Make room captcha protected"
-msgstr "Rinde li såle di berdelaedje protedjeye pa scret"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "Mete en alaedje li djournå"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
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:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
msgstr "Nombe di prezints"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s vos preye sol såle ~s"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "li scret est"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
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:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
msgstr "messaedjes ki ratindèt el cawêye po ~s"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "Candjmints evoyîs"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "Date"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "Di"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "Po"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "Paket"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "Disfacer les elemints tchoezis"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "Messaedjes ki ratindèt:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-#, fuzzy
-msgid "Remove All Offline Messages"
-msgstr "Messaedjes ki ratindèt"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Module SOCKS5 Bytestreams po ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
msgstr "Eplaidaedje-abounmint"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
msgstr "Module d' eplaidaedje-abounmint po ejabberd"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
msgstr "Dimande d' eplaidaedje-abounmint d' èn abouné"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
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:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
msgstr "ID d' nuk"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "Adresse di l' abouné"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
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:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "Evoyî l' contnou avou les notifiaedjes d' evenmints"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "Evoyî des notifiaedjes d' evenmints"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
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:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "Notifyî åzès abounés cwand l' nuk est disfacé"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
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:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "Cayets permanints a wårder"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "On no uzeu-ahessåve pol nuk"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "Nombe macsimoms di cayets permanints"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "Si on permete les abounmints"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "Sipecifyî l' modele d' accès"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "Pårtaedjîs groupes di soçons k' on s' î pout abouner"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "Dinez l' modele d' eplaideu"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "Contnou macsimom en octets"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "Cwand evoyî l' dierin cayet eplaidî"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "Seulmint evoyî des notifiaedje åzès uzeus disponibes"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr ""
-
-#: mod_register.erl:190
+#: mod_register.erl:191
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:243
-#, fuzzy
-msgid "Users are not allowed to register accounts so quickly"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
msgstr "Les noveas uzeus n' si polèt nén edjîstrer si raddimint"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "Nole"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "Abounmimnt"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "Ratindant"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "Groupes"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "Valider"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "Oister"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "Djivêye des soçons da "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "Mwais fôrmat"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
msgstr "Radjouter èn ID Jabber"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "Djivêye des soçons"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "Pårtaedjîs groupes ezès djivêyes di soçons"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "Radjouter"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
msgstr "Pitit no:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "Discrijhaedje:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "Mimbes:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "Groupes håynés:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "Groupe "
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "Evoyî"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Sierveu Jabber Erlang"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "Date d' askepiaedje"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "Veye"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "Payis"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "Emile"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "No d' famile"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
@@ -1254,241 +1152,242 @@ 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:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "No etir"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "No do mitan"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
msgstr "No"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "No d' l' organizåcion"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "Unité d' l' organizåcion"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
msgstr "Cweri des uzeus dins "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "Uzeu"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
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:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
msgstr "Calpin des uzeus"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "Module vCard ejabberd"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "Rizultats do cweraedje po "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
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:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
msgstr "Manaedjeu waibe ejabberd"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "Manaedjaedje"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "Dinêyes brutes"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "Forveyous sierveus"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "Apontiaedje des rîles d' accès a ~s"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "Forveyous sierveus da ejabberd"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "Uzeus"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "Dierinne activité des uzeus"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "Termene:"
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "Dierin moes"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "Dierinne anêye"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "Dispoy todi"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "Mostrer crexhince"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "Mostrer totå"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "Sitatistikes"
-
-#: web/ejabberd_web_admin.erl:1097
-#, fuzzy
-msgid "Not Found"
-msgstr "Nuk nén trové"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "Nuk nén trové"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "Sierveu"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "Uzeus edjistrés"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "Messaedjes ki ratindèt"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "Dierinne activité"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "Uzeus edjistrés:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "Uzeus raloyîs:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "Raloyaedjes s2s e rexhowe:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "Sierveus s2s e rexhowe:"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "Candjî l' sicret"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "Uzeu "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "Raloyî avou les rsoûces:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "Sicret:"
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "Nole dinêye disponibe"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "Nuks"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "Sitatistikes"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "Uzeus"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "Dierinne activité"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(Dinêyes brutes)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "Dinêyes brutes"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "Apontiaedje des rîles d' accès a ~s"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "Forveyous sierveus da ejabberd"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "Dierinne activité des uzeus"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "Termene:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "Dierin moes"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "Dierinne anêye"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "Dispoy todi"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "Mostrer crexhince"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "Mostrer totå"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "Nuk nén trové"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "Sierveu"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "Uzeus edjistrés"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "Messaedjes ki ratindèt"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "Uzeus edjistrés:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "Uzeus raloyîs:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "Raloyaedjes s2s e rexhowe:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "Sierveus s2s e rexhowe:"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "Candjî l' sicret"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "Uzeu "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "Raloyî avou les rsoûces:"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "Sicret:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "Nole dinêye disponibe"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "Nuk "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
msgstr "Pôrts drovous"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "Mete a djoû"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "Renonder"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "Arester"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
msgstr "Aroke di houcaedje RPC"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "Tåves del båze di dnêyes so "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "Sôre di wårdaedje"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr ""
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "Grandeu"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "Memwere"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "Copeye di såvrité po "
-#: web/ejabberd_web_admin.erl:1958
-#, fuzzy
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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 "
@@ -1496,160 +1395,111 @@ msgstr ""
"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:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "Copeye di såvrité binaire:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
msgstr "'l est bon"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "Rapexhî do côp foû d' ene copeye di såvrité binaire:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
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:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "Copeye di såvrité tecse:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "Rapexhî do côp foû d' ene copeye di såvrité tecse:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2021
-#, fuzzy
-msgid "Import user data from jabberd14 spool file:"
-msgstr "Sititchî des uzeus Jabberd 1.4"
-
-#: web/ejabberd_web_admin.erl:2028
-#, fuzzy
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "Sititchî des uzeus Jabberd 1.4"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "Pôrts drovous so "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "Modules so "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
msgstr "Sitatistikes di ~p"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "Tins dispoy l' enondaedje:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
msgstr "Tins CPU:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "Transaccions evoyeyes:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "Transaccions arestêyes:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "Transaccions renondêyes:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "Transaccions wårdêyes e djournå:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "Metaedje a djoû "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "Plan d' metaedje a djoû"
-#: web/ejabberd_web_admin.erl:2177
-#, fuzzy
-msgid "Modified modules"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
msgstr "Modules metous a djoû"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "Sicripe di metaedje a djoû"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "Sicripe di metaedje a djoû d' bas livea"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
msgstr "Acertinaedje do scripe"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "Pôrt"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr ""
-
-#: web/ejabberd_web_admin.erl:2350
-#, fuzzy
-msgid "Protocol"
-msgstr "Pôrt"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "Module"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "Tchuzes"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "Disfacer"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "Enonder"
-
-#~ msgid "Encodings"
-#~ msgstr "Ecôdaedjes"
-
-#~ msgid "(Raw)"
-#~ msgstr "(Dinêyes brutes)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "Forveyous sierveus"
-
-#~ msgid "Specified nickname is already registered"
-#~ msgstr "Li no metou dné est ddja edjîstré"
-
-#~ msgid "Size"
-#~ msgstr "Grandeu"
diff --git a/src/msgs/zh.msg b/src/msgs/zh.msg
index a29a630b2..1187bc2c4 100644
--- a/src/msgs/zh.msg
+++ b/src/msgs/zh.msg
@@ -6,7 +6,7 @@
{"Access rules","访问规则"}.
{"Access Rules","访问规则"}.
{"Action on user","对用户的动作"}.
-{"Add Jabber ID","添加 Jabber ID"}.
+{"Add Jabber ID","添加Jabber ID"}.
{"Add New","添加新用户"}.
{"Add User","添加用户"}.
{"Administration of ","管理"}.
@@ -14,8 +14,8 @@
{"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 this Jabber ID to subscribe to this pubsub node?","允许该JID订阅该pubsub节点?"}.
+{"Allow users to change subject","允许用户更改主题"}.
{"Allow users to query other users","允许用户查询其它用户"}.
{"Allow users to send invites","允许用户发送邀请"}.
{"Allow users to send private messages","允许用户发送私聊消息"}.
@@ -24,7 +24,6 @@
{"All Users","所有用户"}.
{"Announcements","通知"}.
{"anyone","任何人"}.
-{"A password is required to enter this room","进入此房间需要密码"}.
{"April","四月"}.
{"August","八月"}.
{"Backup Management","备份管理"}.
@@ -44,17 +43,16 @@
{"City","城市"}.
{"Commands","命令"}.
{"Conference room does not exist","会议室不存在"}.
-{"Configuration of room ~s","房间~s的配置 "}.
+{"Configuration for ","配置 "}.
{"Configuration","配 置"}.
-{"Connected Resources:","已连接资源:"}.
-{"Connections parameters","连接参数"}.
+{"Connected Resources:","已连接资源"}.
{"Country","国家"}.
-{"CPU Time:","CPU 时间:"}.
+{"CPU Time:","CPU时间:"}.
{"Database Tables at ","数据库列表位于 "}.
{"Database Tables Configuration at ","数据库表格配置位于"}.
{"Database","数据库"}.
{"December","十二月"}.
-{"Default users as participants","用户默认被视为参与人"}.
+{"Default users as participants","将默认用户视为参与人"}.
{"Delete message of the day on all hosts","删除所有主机上的每日消息"}.
{"Delete message of the day","删除每日消息"}.
{"Delete Selected","删除已选内容"}.
@@ -69,35 +67,29 @@
{"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 字节流模块"}.
+{"ejabberd MUC module","ejabberd MUC模块"}.
+{"ejabberd Publish-Subscribe module","ejabberd发行-订阅模块"}.
+{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5字节流模块"}.
{"ejabberd vCard module","ejabberd vCard 模块"}.
-{"ejabberd virtual hosts","ejabberd 虚拟主机"}.
-{"ejabberd Web Admin","ejabberd 网页管理"}.
-{"Elements","元素"}.
+{"ejabberd virtual hosts","ejabberd虚拟主机"}.
+{"ejabberd Web Admin","ejabberd网页管理"}.
{"Email","电子邮件"}.
{"Enable logging","启用服务器端聊天记录"}.
-{"Encoding for server ~b","服务器 ~b 的编码"}.
+{"Encodings","编码"}.
{"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 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服务器的用户名, 编码, 端口和密码."}.
+{"Enter username and encodings 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\"}]."}.
-{"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):"}.
+{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].","例如: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}]."}.
{"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 用户(在字段末添加*来匹配子串)"}.
+{"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","从"}.
@@ -114,40 +106,29 @@
{"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: ","已将标题设置为: "}.
+{" has set the subject to: ","已将标题设置为: "}.
{"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.","如果您想为 IRC 服务器指定不同的端口, 密码, 编码, 请用 '{\"irc 服务器\", \"编码\", 端口, \"密码\"}' 格式的值填充此表单. 默认情况下此服务使用\"~s\"编码, ~p 端口, 密码为空."}.
+{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.","如果您想为IRC服务器指定不同的编码, 请用'{\"irc 服务器\", \"编码\"}'格式的值填充此表单. 默认情况下此服务使用\"~s\"编码."}.
{"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","不正确的消息类型"}.
+{"Import Users From jabberd14 Spool Files","从Jabberd 1.4 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 用户名"}.
+{"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","不允许向会议发送私聊消息"}.
{"It is not allowed to send private messages","不允许发送私聊消息"}.
{"Jabber ID","Jabber ID"}.
-{"Jabber ID ~s is invalid","Jabber ID ~s无效"}.
{"January","一月"}.
-{"Join IRC channel","加入 IRC 频道"}.
+{"Jabber ID ~s is invalid","JID ~s无效"}.
{"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","上次活动"}.
@@ -156,107 +137,104 @@
{"Last year","上一年"}.
{"leaves the room","离开房间"}.
{"Listened Ports at ","监听的端口位于 "}.
-{"Listened Ports","被监听的端口"}.
+{"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 moderated","使房间处于监管状态"}.
+{"Make room password protected","保护房间密码"}.
+{"Make room persistent","在服务器端保存该房间"}.
{"Make room public searchable","使房间可被公开搜索"}.
{"March","三月"}.
-{"Maximum Number of Occupants","允许的驻留者最大数"}.
+{"Maximum Number of Occupants","占有人最大数"}.
{"Max # of items to persist","允许持久化的最大内容条目数"}.
{"Max payload size in bytes","最大有效负载比特数"}.
{"May","五月"}.
-{"Membership is required to enter this room","进入此房间需要会员身份"}.
+{"Membership required to enter this room","进入此房间需要会员身份"}.
{"Members:","会员:"}.
{"Memory","内存"}.
{"Message body","消息主体"}.
{"Middle Name","中间名"}.
-{"Moderator privileges required","需要主持人权限"}.
-{"moderators only","仅主持人"}.
-{"Modified modules","被修改模块"}.
+{"Moderator privileges required","需要调解人权限"}.
+{"moderators only","仅一般人"}.
{"Modules at ","模块位于 "}.
{"Modules","模块"}.
{"Module","模块"}.
{"Monday","星期一"}.
-{"Name:","姓名:"}.
-{"Name","姓名"}.
+{"Name:","名称:"}.
+{"Name","名称"}.
{"Never","从未"}.
+{"Nickname is already in use by another occupant","昵称已被另一用户占用"}.
+{"Nickname is registered by another person","昵称已被另一人注册"}.
{"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 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 occupants","占用人数"}.
{"Number of online users","在线用户数"}.
{"Number of registered users","注册用户数"}.
{"October","十月"}.
{"Offline Messages:","离线消息:"}.
{"Offline Messages","离线消息"}.
-{"OK","确定"}.
+{"OK","OK"}.
{"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 moderators and participants are allowed to change subject in this room","只允许监管人和参与人更改此房间的主题"}.
+{"Only moderators are allowed to change 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 服务器"}.
+{"Outgoing s2s Connections:","出站s2s连接:"}.
+{"Outgoing s2s Connections","出站s2s连接"}.
+{"Outgoing s2s Servers:","出站s2s服务器"}.
{"Owner privileges required","需要持有人权限"}.
{"Packet","数据包"}.
-{"Password ~b","~b 的密码"}.
+{"Password required to enter this room","进入此房间需要密码"}.
{"Password Verification","确认密码"}.
-{"Password:","密码: "}.
+{"Password:","密码:"}.
{"Password","密码"}.
{"Path to Dir","目录的路径"}.
{"Path to File","文件路径"}.
{"Pending","挂起"}.
-{"Period: ","持续时间: "}.
+{"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 模块, 您还需要分别备份您的数据库."}.
{"Pong","Pong"}.
-{"Port ~b","~b 的端口"}.
{"Port","端口"}.
-{"Present real Jabber IDs to","将真实 Jabber ID 显示给"}.
-{"private, ","保密, "}.
-{"Protocol","协议"}.
-{"Publish-Subscribe","发行-订阅"}.
-{"PubSub subscriber request","PubSub 订阅人请求"}.
+{"Present real Jabber IDs to","将真实JID显示给"}.
+{"private, ","保密"}.
+{"Publish-Subscribe","发布-订阅"}.
+{"PubSub subscriber request","PubSub订阅人请求"}.
{"Queries to the conference members are not allowed in this room","本房间不允许发出成员查询请求"}.
{"RAM and disc copy","内存与磁盘复制"}.
{"RAM copy","内存(RAM)复制"}.
+{"(Raw)","(原始格式)"}.
{"Raw","原始格式"}.
{"Really delete message of the day?","确实要删除每日消息吗?"}.
{"Recipient is not in the conference room","接收人不在会议室"}.
-{"Registered Users:","注册用户:"}.
+{"Registered Users:","注册用户:"}.
{"Registered Users","注册用户"}.
-{"Registration in mod_irc for ","mod_irc 中的注册是为 "}.
+{"Registration in mod_irc for ","mod_irc中的注册是为 "}.
+{"Remark 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模块, 您还需要分别备份您的数据库."}.
{"Remote copy","远程复制"}.
-{"Remove All Offline Messages","移除所有离线消息"}.
{"Remove User","删除用户"}.
{"Remove","移除"}.
{"Replaced by new connection","被新的连接替换"}.
@@ -264,32 +242,29 @@
{"Restart Service","重启服务"}.
{"Restart","重启"}.
{"Restore Backup from File at ","要恢复的备份文件位于"}.
-{"Restore binary backup after next ejabberd restart (requires less memory):","在下次 ejabberd 重启后恢复二进制备份(需要的内存更少):"}.
+{"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 访问规则配置"}.
+{"RPC Call Error","RPC调用错误"}.
+{"Running Nodes","正在运行的节点"}.
+{"~s access rule configuration","~s访问规则配置"}.
{"Saturday","星期六"}.
-{"Script check","脚本检查"}.
+{"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","发送通知给所有用户"}.
+{"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"}.
{"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","共享的花名册组群"}.
@@ -297,13 +272,15 @@
{"Show Ordinary Table","显示普通列表"}.
{"Shut Down Service","关闭服务"}.
{"~s invites you to the room ~s","~s邀请你到~s房间"}.
+{"Size","大小"}.
+{"Specified nickname is already registered","指定的名称已被注册"}.
{"Specify the access model","指定访问模式"}.
{"Specify the publisher model","指定发布人样式"}.
-{"~s's Offline Messages Queue","~s 的离线消息队列"}.
+{"~s's Offline Messages Queue","~s的离线消息队列"}.
{"Start Modules at ","要启动的模块位于 "}.
{"Start Modules","启动模块"}.
{"Start","开始"}.
-{"Statistics of ~p","~p 的统计"}.
+{"Statistics of ~p","~p的统计"}.
{"Statistics","统计"}.
{"Stop Modules at ","要停止的模块位于 "}.
{"Stop Modules","停止模块"}.
@@ -318,14 +295,10 @@
{"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 collections with which a node is affiliated","加入结点的集合"}.
{"the password is","密码是"}.
-{"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 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","时间延迟"}.
@@ -338,8 +311,7 @@
{"Transactions Logged:","记入日志的事务:"}.
{"Transactions Restarted:","重启的事务:"}.
{"Tuesday","星期二"}.
-{"Unable to generate a captcha","无法产生验证码"}.
-{"Unauthorized","未认证的"}.
+{"Updated modules","更新模块"}.
{"Update message of the day (don't send)","更新每日消息(不发送)"}.
{"Update message of the day on all hosts (don't send)","更新所有主机上的每日消息(不发送)"}.
{"Update plan","更新计划"}.
@@ -347,15 +319,16 @@
{"Update ","更新 "}.
{"Update","更新"}.
{"Uptime:","正常运行时间:"}.
-{"Use of STARTTLS required","要求使用 STARTTLS"}.
+{"Use of STARTTLS required","要求使用STARTTLS"}.
{"User Management","用户管理"}.
-{"Users are not allowed to register accounts so quickly","不允许用户太频繁地注册帐户"}.
+{"Users are not allowed to register accounts so fast","不允许用户注册帐户太快"}.
{"Users Last Activity","用户上次活动"}.
{"Users","用户"}.
{"User ","用户 "}.
{"User","用户"}.
{"Validate","确认"}.
-{"vCard User Search","vCard 用户搜索"}.
+{"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","星期三"}.
@@ -363,9 +336,8 @@
{"Whether to allow subscriptions","是否允许订阅"}.
{"You have been banned from this room","您已被禁止进入该房间"}.
{"You must fill in field \"Nickname\" in the form","您必须填充表单中\"昵称\"项"}.
-{"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 register nickname","您需要一个兼容 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.","您的联系人离线消息队列已满. 消息已被丢弃"}.
-{"Your messages to ~s are being blocked. To unblock them, visit ~s","您发送给 ~s 的消息已被阻止. 要解除阻止, 请访问 ~s"}.
+{"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 register nickname","您需要一个兼容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.","您的离线消息队列已满. 消息已被丢弃"}.
diff --git a/src/msgs/zh.po b/src/msgs/zh.po
index 98fbda77e..06e67e682 100644
--- a/src/msgs/zh.po
+++ b/src/msgs/zh.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
-"Last-Translator: Shelley Shyan - shelleyshyan AT gmail DOT com\n"
+"Last-Translator: Shelley Shyan - skylarkbj AT 163 DOT com\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -9,30 +9,18 @@ msgstr ""
"X-Additional-Translator: Zhan Caibao - zhancaibao AT gmail DOT com\n"
"X-Additional-Translator: Mike Wang\n"
-#: ejabberd_c2s.erl:360 ejabberd_c2s.erl:661
+#: ejabberd_c2s.erl:350 ejabberd_c2s.erl:651
msgid "Use of STARTTLS required"
-msgstr "要求使用 STARTTLS"
+msgstr "要求使用STARTTLS"
-#: ejabberd_c2s.erl:439
+#: ejabberd_c2s.erl:434
msgid "No resource provided"
msgstr "无资源提供"
-#: ejabberd_c2s.erl:1071
+#: ejabberd_c2s.erl:1045
msgid "Replaced by new connection"
msgstr "被新的连接替换"
-#: ejabberd_captcha.erl:93 ejabberd_captcha.erl:125
-msgid "Enter the text you see"
-msgstr "请输入您所看到的文本"
-
-#: ejabberd_captcha.erl:97
-msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
-msgstr "您发送给 ~s 的消息已被阻止. 要解除阻止, 请访问 ~s"
-
-#: ejabberd_captcha.erl:235
-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 "命令"
@@ -49,11 +37,11 @@ msgstr "Pong"
msgid "Really delete message of the day?"
msgstr "确实要删除每日消息吗?"
-#: mod_announce.erl:513 mod_configure.erl:1051 mod_configure.erl:1096
+#: mod_announce.erl:513 mod_configure.erl:1034 mod_configure.erl:1079
msgid "Subject"
msgstr "标题"
-#: mod_announce.erl:518 mod_configure.erl:1056 mod_configure.erl:1101
+#: mod_announce.erl:518 mod_configure.erl:1039 mod_configure.erl:1084
msgid "Message body"
msgstr "消息主体"
@@ -67,19 +55,19 @@ msgstr "通知"
#: mod_announce.erl:635
msgid "Send announcement to all users"
-msgstr "发送通知给所有用户"
+msgstr "将通知发送给所有用户"
#: mod_announce.erl:637
msgid "Send announcement to all users on all hosts"
-msgstr "发送通知给所有主机上的所有用户"
+msgstr "给所有主机上的所有用户发送通知"
#: mod_announce.erl:639
msgid "Send announcement to all online users"
-msgstr "发送通知给所有在线用户"
+msgstr "将通知发送给所有在线用户"
-#: mod_announce.erl:641 mod_configure.erl:1046 mod_configure.erl:1091
+#: mod_announce.erl:641 mod_configure.erl:1029 mod_configure.erl:1074
msgid "Send announcement to all online users on all hosts"
-msgstr "发送通知给所有主机的在线用户"
+msgstr "将通知发送给所有主机的所有用户"
#: mod_announce.erl:643
msgid "Set message of the day and send to online users"
@@ -106,1494 +94,1383 @@ msgid "Delete message of the day on all hosts"
msgstr "删除所有主机上的每日消息"
#: mod_configure.erl:114 mod_configure.erl:258 mod_configure.erl:280
-#: mod_configure.erl:466
+#: mod_configure.erl:453
msgid "Configuration"
msgstr "配 置"
-#: mod_configure.erl:125 mod_configure.erl:544 web/ejabberd_web_admin.erl:1863
+#: mod_configure.erl:125 mod_configure.erl:531 web/ejabberd_web_admin.erl:1673
msgid "Database"
msgstr "数据库"
-#: mod_configure.erl:127 mod_configure.erl:563
+#: mod_configure.erl:127 mod_configure.erl:545
msgid "Start Modules"
msgstr "启动模块"
-#: mod_configure.erl:129 mod_configure.erl:564
+#: mod_configure.erl:129 mod_configure.erl:546
msgid "Stop Modules"
msgstr "停止模块"
-#: mod_configure.erl:131 mod_configure.erl:572 web/ejabberd_web_admin.erl:1864
+#: mod_configure.erl:131 mod_configure.erl:554 web/ejabberd_web_admin.erl:1674
msgid "Backup"
msgstr "备份"
-#: mod_configure.erl:133 mod_configure.erl:573
+#: mod_configure.erl:133 mod_configure.erl:555
msgid "Restore"
msgstr "恢复"
-#: mod_configure.erl:135 mod_configure.erl:574
+#: mod_configure.erl:135 mod_configure.erl:556
msgid "Dump to Text File"
msgstr "转储到文本文件"
-#: mod_configure.erl:137 mod_configure.erl:583
+#: mod_configure.erl:137 mod_configure.erl:565
msgid "Import File"
msgstr "导入文件"
-#: mod_configure.erl:139 mod_configure.erl:584
+#: mod_configure.erl:139 mod_configure.erl:566
msgid "Import Directory"
msgstr "导入目录"
-#: mod_configure.erl:141 mod_configure.erl:549 mod_configure.erl:1025
+#: mod_configure.erl:141 mod_configure.erl:536 mod_configure.erl:1008
msgid "Restart Service"
msgstr "重启服务"
-#: mod_configure.erl:143 mod_configure.erl:550 mod_configure.erl:1070
+#: mod_configure.erl:143 mod_configure.erl:537 mod_configure.erl:1053
msgid "Shut Down Service"
msgstr "关闭服务"
-#: mod_configure.erl:145 mod_configure.erl:486 mod_configure.erl:1165
-#: web/ejabberd_web_admin.erl:1508
+#: mod_configure.erl:145 mod_configure.erl:473 mod_configure.erl:1148
+#: web/ejabberd_web_admin.erl:1338
msgid "Add User"
msgstr "添加用户"
-#: mod_configure.erl:147 mod_configure.erl:487 mod_configure.erl:1187
+#: mod_configure.erl:147 mod_configure.erl:474 mod_configure.erl:1170
msgid "Delete User"
msgstr "删除用户"
-#: mod_configure.erl:149 mod_configure.erl:488 mod_configure.erl:1199
+#: mod_configure.erl:149 mod_configure.erl:475 mod_configure.erl:1182
msgid "End User Session"
msgstr "结束用户会话"
-#: mod_configure.erl:151 mod_configure.erl:489 mod_configure.erl:1211
-#: mod_configure.erl:1223
+#: mod_configure.erl:151 mod_configure.erl:476 mod_configure.erl:1194
+#: mod_configure.erl:1206
msgid "Get User Password"
msgstr "获取用户密码"
-#: mod_configure.erl:153 mod_configure.erl:490
+#: mod_configure.erl:153 mod_configure.erl:477
msgid "Change User Password"
msgstr "更改用户密码"
-#: mod_configure.erl:155 mod_configure.erl:491 mod_configure.erl:1240
+#: mod_configure.erl:155 mod_configure.erl:478 mod_configure.erl:1223
msgid "Get User Last Login Time"
msgstr "获取用户上次登陆时间"
-#: mod_configure.erl:157 mod_configure.erl:492 mod_configure.erl:1252
+#: mod_configure.erl:157 mod_configure.erl:479 mod_configure.erl:1235
msgid "Get User Statistics"
msgstr "获取用户统计"
-#: mod_configure.erl:159 mod_configure.erl:493
+#: mod_configure.erl:159 mod_configure.erl:480
msgid "Get Number of Registered Users"
msgstr "获取注册用户数"
-#: mod_configure.erl:161 mod_configure.erl:494
+#: mod_configure.erl:161 mod_configure.erl:481
msgid "Get Number of Online Users"
msgstr "获取在线用户数"
-#: mod_configure.erl:163 mod_configure.erl:477 web/ejabberd_web_admin.erl:811
-#: web/ejabberd_web_admin.erl:852
+#: mod_configure.erl:163 mod_configure.erl:464 web/ejabberd_web_admin.erl:135
+#: web/ejabberd_web_admin.erl:190 web/ejabberd_web_admin.erl:605
+#: web/ejabberd_web_admin.erl:624 web/ejabberd_web_admin.erl:679
+#: web/ejabberd_web_admin.erl:722
msgid "Access Control Lists"
msgstr "访问控制列表(ACL)"
-#: mod_configure.erl:165 mod_configure.erl:478 web/ejabberd_web_admin.erl:920
-#: web/ejabberd_web_admin.erl:956
+#: mod_configure.erl:165 mod_configure.erl:465 web/ejabberd_web_admin.erl:136
+#: web/ejabberd_web_admin.erl:191 web/ejabberd_web_admin.erl:607
+#: web/ejabberd_web_admin.erl:626 web/ejabberd_web_admin.erl:790
+#: web/ejabberd_web_admin.erl:828
msgid "Access Rules"
msgstr "访问规则"
-#: mod_configure.erl:281 mod_configure.erl:467
+#: mod_configure.erl:281 mod_configure.erl:454
msgid "User Management"
msgstr "用户管理"
-#: mod_configure.erl:468 web/ejabberd_web_admin.erl:1038
-#: web/ejabberd_web_admin.erl:1443
+#: mod_configure.erl:455 web/ejabberd_web_admin.erl:193
+#: web/ejabberd_web_admin.erl:629 web/ejabberd_web_admin.erl:905
+#: web/ejabberd_web_admin.erl:1275
msgid "Online Users"
msgstr "在线用户"
-#: mod_configure.erl:469
+#: mod_configure.erl:456
msgid "All Users"
msgstr "所有用户"
-#: mod_configure.erl:470
+#: mod_configure.erl:457
msgid "Outgoing s2s Connections"
-msgstr "出站 s2s 连接"
+msgstr "出站s2s连接"
-#: mod_configure.erl:471 web/ejabberd_web_admin.erl:1834
+#: mod_configure.erl:458 web/ejabberd_web_admin.erl:1644
msgid "Running Nodes"
-msgstr "运行中的节点"
+msgstr "正在运行的节点"
-#: mod_configure.erl:472 web/ejabberd_web_admin.erl:1836
+#: mod_configure.erl:459 web/ejabberd_web_admin.erl:1646
msgid "Stopped Nodes"
msgstr "已经停止的节点"
-#: mod_configure.erl:545 mod_configure.erl:555 web/ejabberd_web_admin.erl:1880
+#: mod_configure.erl:532 web/ejabberd_web_admin.erl:1690
msgid "Modules"
msgstr "模块"
-#: mod_configure.erl:546
+#: mod_configure.erl:533
msgid "Backup Management"
msgstr "备份管理"
-#: mod_configure.erl:547
+#: mod_configure.erl:534
msgid "Import Users From jabberd14 Spool Files"
-msgstr "从 jabberd14 Spool 文件导入用户"
+msgstr "从Jabberd 1.4 Spool文件导入用户"
-#: mod_configure.erl:667
+#: mod_configure.erl:649
msgid "To ~s"
msgstr "发送给~s"
-#: mod_configure.erl:685
+#: mod_configure.erl:667
msgid "From ~s"
msgstr "来自~s"
-#: mod_configure.erl:881
+#: mod_configure.erl:864
msgid "Database Tables Configuration at "
msgstr "数据库表格配置位于"
-#: mod_configure.erl:886
+#: mod_configure.erl:869
msgid "Choose storage type of tables"
msgstr "请选择表格的存储类型"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Disc only copy"
msgstr "仅磁盘复制"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM and disc copy"
msgstr "内存与磁盘复制"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "RAM copy"
msgstr "内存(RAM)复制"
-#: mod_configure.erl:894 mod_configure.erl:896
+#: mod_configure.erl:877 mod_configure.erl:879
msgid "Remote copy"
msgstr "远程复制"
-#: mod_configure.erl:918
+#: mod_configure.erl:901
msgid "Stop Modules at "
msgstr "要停止的模块位于 "
-#: mod_configure.erl:922
+#: mod_configure.erl:905
msgid "Choose modules to stop"
msgstr "请选择要停止的模块"
-#: mod_configure.erl:937
+#: mod_configure.erl:920
msgid "Start Modules at "
msgstr "要启动的模块位于 "
-#: mod_configure.erl:941
+#: mod_configure.erl:924
msgid "Enter list of {Module, [Options]}"
msgstr "请输入{模块, [选项]}列表"
-#: mod_configure.erl:942
+#: mod_configure.erl:925
msgid "List of modules to start"
msgstr "要启动的模块列表"
-#: mod_configure.erl:951
+#: mod_configure.erl:934
msgid "Backup to File at "
msgstr "备份到文件位于"
-#: mod_configure.erl:955 mod_configure.erl:969
+#: mod_configure.erl:938 mod_configure.erl:952
msgid "Enter path to backup file"
msgstr "请输入备份文件的路径"
-#: mod_configure.erl:956 mod_configure.erl:970 mod_configure.erl:984
-#: mod_configure.erl:998
+#: mod_configure.erl:939 mod_configure.erl:953 mod_configure.erl:967
+#: mod_configure.erl:981
msgid "Path to File"
msgstr "文件路径"
-#: mod_configure.erl:965
+#: mod_configure.erl:948
msgid "Restore Backup from File at "
msgstr "要恢复的备份文件位于"
-#: mod_configure.erl:979
+#: mod_configure.erl:962
msgid "Dump Backup to Text File at "
msgstr "转储备份到文本文件于"
-#: mod_configure.erl:983
+#: mod_configure.erl:966
msgid "Enter path to text file"
msgstr "请输入文本文件的路径"
-#: mod_configure.erl:993
+#: mod_configure.erl:976
msgid "Import User from File at "
msgstr "导入用户的文件位于 "
-#: mod_configure.erl:997
+#: mod_configure.erl:980
msgid "Enter path to jabberd14 spool file"
-msgstr "请输入 jabberd14 spool 文件的路径"
+msgstr "请输入jabberd14 spool文件的路径"
-#: mod_configure.erl:1007
+#: mod_configure.erl:990
msgid "Import Users from Dir at "
msgstr "导入用户的目录位于 "
-#: mod_configure.erl:1011
+#: mod_configure.erl:994
msgid "Enter path to jabberd14 spool dir"
-msgstr "请输入 jabberd14 spool 目录的路径"
+msgstr "请输入jabberd14 spool目录的路径"
-#: mod_configure.erl:1012
+#: mod_configure.erl:995
msgid "Path to Dir"
msgstr "目录的路径"
-#: mod_configure.erl:1028 mod_configure.erl:1073
+#: mod_configure.erl:1011 mod_configure.erl:1056
msgid "Time delay"
msgstr "时间延迟"
-#: mod_configure.erl:1111
+#: mod_configure.erl:1094
msgid "Access Control List Configuration"
msgstr "访问控制列表(ACL)配置"
-#: mod_configure.erl:1115
+#: mod_configure.erl:1098
msgid "Access control lists"
msgstr "访问控制列表(ACL)"
-#: mod_configure.erl:1139
+#: mod_configure.erl:1122
msgid "Access Configuration"
msgstr "访问配置"
-#: mod_configure.erl:1143
+#: mod_configure.erl:1126
msgid "Access rules"
msgstr "访问规则"
-#: mod_configure.erl:1168 mod_configure.erl:1190 mod_configure.erl:1202
-#: mod_configure.erl:1214 mod_configure.erl:1226 mod_configure.erl:1243
-#: mod_configure.erl:1255 mod_configure.erl:1620 mod_configure.erl:1670
-#: mod_configure.erl:1691 mod_roster.erl:948 mod_roster_odbc.erl:1049
-#: mod_vcard.erl:465 mod_vcard_ldap.erl:550 mod_vcard_odbc.erl:440
+#: mod_configure.erl:1151 mod_configure.erl:1173 mod_configure.erl:1185
+#: mod_configure.erl:1197 mod_configure.erl:1209 mod_configure.erl:1226
+#: mod_configure.erl:1238 mod_configure.erl:1599 mod_configure.erl:1647
+#: mod_configure.erl:1667 mod_roster.erl:803 mod_roster_odbc.erl:910
+#: mod_vcard.erl:460 mod_vcard_ldap.erl:544 mod_vcard_odbc.erl:457
msgid "Jabber ID"
msgstr "Jabber ID"
-#: mod_configure.erl:1173 mod_configure.erl:1231 mod_configure.erl:1621
-#: mod_configure.erl:1833 mod_muc/mod_muc_room.erl:2849
-#: web/ejabberd_web_admin.erl:1501
+#: mod_configure.erl:1156 mod_configure.erl:1214 mod_configure.erl:1600
+#: mod_configure.erl:1809 mod_muc/mod_muc_room.erl:2702
+#: web/ejabberd_web_admin.erl:1331
msgid "Password"
msgstr "密码"
-#: mod_configure.erl:1178
+#: mod_configure.erl:1161
msgid "Password Verification"
msgstr "确认密码"
-#: mod_configure.erl:1269
+#: mod_configure.erl:1252
msgid "Number of registered users"
msgstr "注册用户数"
-#: mod_configure.erl:1283
+#: mod_configure.erl:1266
msgid "Number of online users"
msgstr "在线用户数"
-#: mod_configure.erl:1652 web/ejabberd_web_admin.erl:1567
+#: mod_configure.erl:1629 web/ejabberd_web_admin.erl:1397
msgid "Never"
msgstr "从未"
-#: mod_configure.erl:1666 web/ejabberd_web_admin.erl:1581
+#: mod_configure.erl:1643 web/ejabberd_web_admin.erl:1411
msgid "Online"
msgstr "在线"
-#: mod_configure.erl:1671
+#: mod_configure.erl:1648
msgid "Last login"
msgstr "上次登陆"
-#: mod_configure.erl:1692
+#: mod_configure.erl:1668
msgid "Roster size"
msgstr "花名册大小"
-#: mod_configure.erl:1693
+#: mod_configure.erl:1669
msgid "IP addresses"
-msgstr "IP 地址"
+msgstr "IP地址"
-#: mod_configure.erl:1694
+#: mod_configure.erl:1670
msgid "Resources"
msgstr "资源"
-#: mod_configure.erl:1820
+#: mod_configure.erl:1796
msgid "Administration of "
msgstr "管理"
-#: mod_configure.erl:1823
+#: mod_configure.erl:1799
msgid "Action on user"
msgstr "对用户的动作"
-#: mod_configure.erl:1827
+#: mod_configure.erl:1803
msgid "Edit Properties"
msgstr "编辑属性"
-#: mod_configure.erl:1830 web/ejabberd_web_admin.erl:1696
+#: mod_configure.erl:1806 web/ejabberd_web_admin.erl:1514
msgid "Remove User"
msgstr "删除用户"
-#: mod_irc/mod_irc.erl:201 mod_muc/mod_muc.erl:335
+#: mod_irc/mod_irc.erl:198 mod_muc/mod_muc.erl:305
msgid "Access denied by service policy"
msgstr "访问被服务策略拒绝"
-#: mod_irc/mod_irc.erl:400
+#: mod_irc/mod_irc.erl:311
msgid "IRC Transport"
-msgstr "IRC 传输"
+msgstr "IRC传输"
-#: mod_irc/mod_irc.erl:427
+#: mod_irc/mod_irc.erl:325
msgid "ejabberd IRC module"
msgstr "ejabberd IRC 模块"
-#: mod_irc/mod_irc.erl:557
+#: mod_irc/mod_irc.erl:443
msgid "You need an x:data capable client to configure mod_irc settings"
-msgstr "您需要一个兼容 x:data 的客户端来配置 mod_irc 设置"
+msgstr "您需要一个兼容x:data的客户端来配置mod_irc设置"
-#: mod_irc/mod_irc.erl:564
+#: mod_irc/mod_irc.erl:450
msgid "Registration in mod_irc for "
-msgstr "mod_irc 中的注册是为 "
+msgstr "mod_irc中的注册是为 "
-#: mod_irc/mod_irc.erl:569
+#: mod_irc/mod_irc.erl:455
msgid ""
-"Enter username, encodings, ports and passwords you wish to use for "
-"connecting to IRC servers"
-msgstr "请输入您想使用的用来连接到IRC服务器的用户名, 编码, 端口和密码."
+"Enter username and encodings you wish to use for connecting to IRC servers"
+msgstr "请输入您想使用的用来连接到IRC服务器的用户名和编码"
-#: mod_irc/mod_irc.erl:574
+#: mod_irc/mod_irc.erl:460
msgid "IRC Username"
-msgstr "IRC 用户名"
+msgstr "IRC用户名"
-#: mod_irc/mod_irc.erl:584
+#: mod_irc/mod_irc.erl:470
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."
+"If you want to specify different encodings for IRC servers, fill this list "
+"with values in format '{\"irc server\", \"encoding\"}'. By default this "
+"service use \"~s\" encoding."
msgstr ""
-"如果您想为 IRC 服务器指定不同的端口, 密码, 编码, 请用 '{\"irc 服务器\", \"编"
-"码\", 端口, \"密码\"}' 格式的值填充此表单. 默认情况下此服务使用\"~s\"编码, "
-"~p 端口, 密码为空."
+"如果您想为IRC服务器指定不同的编码, 请用'{\"irc 服务器\", \"编码\"}'格式的值填"
+"充此表单. 默认情况下此服务使用\"~s\"编码."
-#: mod_irc/mod_irc.erl:596
+#: mod_irc/mod_irc.erl:480
msgid ""
-"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
msgstr ""
-"例如: [{\"irc.lucky.net\", \"koi8-r\"}, 6667, \"secret\"}, {\"vendetta.fef."
-"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
+"例如: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1"
+"\"}]."
-#: mod_irc/mod_irc.erl:601
-msgid "Connections parameters"
-msgstr "连接参数"
+#: mod_irc/mod_irc.erl:485
+msgid "Encodings"
+msgstr "编码"
-#: mod_irc/mod_irc.erl:711
-msgid "Join IRC channel"
-msgstr "加入 IRC 频道"
-
-#: mod_irc/mod_irc.erl:715
-msgid "IRC channel (don't put the first #)"
-msgstr "IRC 频道 (不要输入第一个#号)"
-
-#: mod_irc/mod_irc.erl:720
-msgid "IRC server"
-msgstr "IRC 服务器"
-
-#: mod_irc/mod_irc.erl:753 mod_irc/mod_irc.erl:757
-msgid "Join the IRC channel here."
-msgstr "在这里加入 IRC 频道."
-
-#: mod_irc/mod_irc.erl:761
-msgid "Join the IRC channel in this Jabber ID: ~s"
-msgstr "用此 Jabber ID: ~s 加入 IRC 频道"
-
-#: mod_irc/mod_irc.erl:846
-msgid "IRC settings"
-msgstr "IRC 设置"
-
-#: mod_irc/mod_irc.erl:851
-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:857
-msgid "IRC username"
-msgstr "IRC 用户名"
-
-#: mod_irc/mod_irc.erl:906
-msgid "Password ~b"
-msgstr "~b 的密码"
-
-#: mod_irc/mod_irc.erl:911
-msgid "Port ~b"
-msgstr "~b 的端口"
-
-#: mod_irc/mod_irc.erl:916
-msgid "Encoding for server ~b"
-msgstr "服务器 ~b 的编码"
-
-#: mod_irc/mod_irc.erl:925
-msgid "Server ~b"
-msgstr "服务器 ~b"
-
-#: mod_muc/mod_muc.erl:437
+#: mod_muc/mod_muc.erl:403
msgid "Only service administrators are allowed to send service messages"
msgstr "只有服务管理员可以发送服务消息"
-#: mod_muc/mod_muc.erl:481
+#: mod_muc/mod_muc.erl:446
msgid "Room creation is denied by service policy"
msgstr "创建房间被服务策略拒绝"
-#: mod_muc/mod_muc.erl:488
+#: mod_muc/mod_muc.erl:453
msgid "Conference room does not exist"
msgstr "会议室不存在"
-#: mod_muc/mod_muc.erl:569
+#: mod_muc/mod_muc.erl:510
msgid "Chatrooms"
msgstr "聊天室"
-#: mod_muc/mod_muc.erl:688
+#: mod_muc/mod_muc.erl:561
msgid "You need an x:data capable client to register nickname"
-msgstr "您需要一个兼容 x:data 的客户端来注册昵称"
+msgstr "您需要一个兼容x:data的客户端来注册昵称"
-#: mod_muc/mod_muc.erl:694
+#: mod_muc/mod_muc.erl:567
msgid "Nickname Registration at "
msgstr "昵称注册于 "
-#: mod_muc/mod_muc.erl:698
+#: mod_muc/mod_muc.erl:571
msgid "Enter nickname you want to register"
msgstr "请输入您想要注册的昵称"
-#: mod_muc/mod_muc.erl:699 mod_roster.erl:949 mod_roster_odbc.erl:1050
-#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:445
+#: mod_muc/mod_muc.erl:572 mod_roster.erl:804 mod_roster_odbc.erl:911
+#: mod_vcard.erl:357 mod_vcard.erl:465 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:462
msgid "Nickname"
msgstr "昵称"
-#: mod_muc/mod_muc.erl:738 mod_muc/mod_muc_room.erl:926
-#: mod_muc/mod_muc_room.erl:1513
-msgid "That nickname is registered by another person"
-msgstr "该昵称已被另一个人注册了"
+#: mod_muc/mod_muc.erl:611
+msgid "Specified nickname is already registered"
+msgstr "指定的名称已被注册"
-#: mod_muc/mod_muc.erl:764
+#: mod_muc/mod_muc.erl:635
msgid "You must fill in field \"Nickname\" in the form"
msgstr "您必须填充表单中\"昵称\"项"
-#: mod_muc/mod_muc.erl:784
+#: mod_muc/mod_muc.erl:657
msgid "ejabberd MUC module"
-msgstr "ejabberd MUC 模块"
+msgstr "ejabberd MUC模块"
-#: mod_muc/mod_muc_log.erl:371 mod_muc/mod_muc_log.erl:378
+#: mod_muc/mod_muc_log.erl:338
msgid "Chatroom configuration modified"
msgstr "聊天室配置已修改"
-#: mod_muc/mod_muc_log.erl:381
+#: mod_muc/mod_muc_log.erl:341
msgid "joins the room"
msgstr "加入房间"
-#: mod_muc/mod_muc_log.erl:384 mod_muc/mod_muc_log.erl:387
+#: mod_muc/mod_muc_log.erl:344 mod_muc/mod_muc_log.erl:347
msgid "leaves the room"
msgstr "离开房间"
-#: mod_muc/mod_muc_log.erl:390 mod_muc/mod_muc_log.erl:393
+#: mod_muc/mod_muc_log.erl:350 mod_muc/mod_muc_log.erl:353
msgid "has been banned"
msgstr "已被禁止"
-#: mod_muc/mod_muc_log.erl:396 mod_muc/mod_muc_log.erl:399
+#: mod_muc/mod_muc_log.erl:356 mod_muc/mod_muc_log.erl:359
msgid "has been kicked"
msgstr "已被踢出"
-#: mod_muc/mod_muc_log.erl:402
+#: mod_muc/mod_muc_log.erl:362
msgid "has been kicked because of an affiliation change"
msgstr "因联属关系改变而被踢出"
-#: mod_muc/mod_muc_log.erl:405
+#: mod_muc/mod_muc_log.erl:365
msgid "has been kicked because the room has been changed to members-only"
msgstr "因该房间改为只对会员开放而被踢出"
-#: mod_muc/mod_muc_log.erl:408
+#: mod_muc/mod_muc_log.erl:368
msgid "has been kicked because of a system shutdown"
msgstr "因系统关机而被踢出"
-#: mod_muc/mod_muc_log.erl:411
+#: mod_muc/mod_muc_log.erl:371
msgid "is now known as"
msgstr "现在称呼为"
-#: mod_muc/mod_muc_log.erl:414 mod_muc/mod_muc_log.erl:678
-#: mod_muc/mod_muc_room.erl:2040
+#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:619
+#: mod_muc/mod_muc_room.erl:1973
msgid " has set the subject to: "
-msgstr "已将标题设置为: "
+msgstr "已将标题设置为: "
-#: mod_muc/mod_muc_log.erl:448
+#: mod_muc/mod_muc_log.erl:405
msgid "Monday"
msgstr "星期一"
-#: mod_muc/mod_muc_log.erl:449
+#: mod_muc/mod_muc_log.erl:406
msgid "Tuesday"
msgstr "星期二"
-#: mod_muc/mod_muc_log.erl:450
+#: mod_muc/mod_muc_log.erl:407
msgid "Wednesday"
msgstr "星期三"
-#: mod_muc/mod_muc_log.erl:451
+#: mod_muc/mod_muc_log.erl:408
msgid "Thursday"
msgstr "星期四"
-#: mod_muc/mod_muc_log.erl:452
+#: mod_muc/mod_muc_log.erl:409
msgid "Friday"
msgstr "星期五"
-#: mod_muc/mod_muc_log.erl:453
+#: mod_muc/mod_muc_log.erl:410
msgid "Saturday"
msgstr "星期六"
-#: mod_muc/mod_muc_log.erl:454
+#: mod_muc/mod_muc_log.erl:411
msgid "Sunday"
msgstr "星期天"
-#: mod_muc/mod_muc_log.erl:458
+#: mod_muc/mod_muc_log.erl:415
msgid "January"
msgstr "一月"
-#: mod_muc/mod_muc_log.erl:459
+#: mod_muc/mod_muc_log.erl:416
msgid "February"
msgstr "二月"
-#: mod_muc/mod_muc_log.erl:460
+#: mod_muc/mod_muc_log.erl:417
msgid "March"
msgstr "三月"
-#: mod_muc/mod_muc_log.erl:461
+#: mod_muc/mod_muc_log.erl:418
msgid "April"
msgstr "四月"
-#: mod_muc/mod_muc_log.erl:462
+#: mod_muc/mod_muc_log.erl:419
msgid "May"
msgstr "五月"
-#: mod_muc/mod_muc_log.erl:463
+#: mod_muc/mod_muc_log.erl:420
msgid "June"
msgstr "六月"
-#: mod_muc/mod_muc_log.erl:464
+#: mod_muc/mod_muc_log.erl:421
msgid "July"
msgstr "七月"
-#: mod_muc/mod_muc_log.erl:465
+#: mod_muc/mod_muc_log.erl:422
msgid "August"
msgstr "八月"
-#: mod_muc/mod_muc_log.erl:466
+#: mod_muc/mod_muc_log.erl:423
msgid "September"
msgstr "九月"
-#: mod_muc/mod_muc_log.erl:467
+#: mod_muc/mod_muc_log.erl:424
msgid "October"
msgstr "十月"
-#: mod_muc/mod_muc_log.erl:468
+#: mod_muc/mod_muc_log.erl:425
msgid "November"
msgstr "十一月"
-#: mod_muc/mod_muc_log.erl:469
+#: mod_muc/mod_muc_log.erl:426
msgid "December"
msgstr "十二月"
-#: mod_muc/mod_muc_log.erl:740
+#: mod_muc/mod_muc_log.erl:675
msgid "Room Configuration"
msgstr "房间配置"
-#: mod_muc/mod_muc_log.erl:749
-msgid "Room Occupants"
-msgstr "房间人数"
-
-#: mod_muc/mod_muc_log.erl:852 mod_muc/mod_muc_room.erl:2825
+#: mod_muc/mod_muc_log.erl:768 mod_muc/mod_muc_room.erl:2678
msgid "Room title"
msgstr "房间标题"
-#: mod_muc/mod_muc_room.erl:167
+#: mod_muc/mod_muc_room.erl:226
msgid "Traffic rate limit is exceeded"
msgstr "已经超过传输率限制"
-#: mod_muc/mod_muc_room.erl:239
+#: mod_muc/mod_muc_room.erl:303
msgid ""
"This participant is kicked from the room because he sent an error message"
-msgstr "该用户由于发送了错误消息而被踢出了聊天室"
+msgstr "该用户由于发生了错误而被踢出了聊天室"
-#: mod_muc/mod_muc_room.erl:248
+#: mod_muc/mod_muc_room.erl:312
msgid "It is not allowed to send private messages to the conference"
msgstr "不允许向会议发送私聊消息"
-#: mod_muc/mod_muc_room.erl:293
+#: mod_muc/mod_muc_room.erl:357
msgid "Improper message type"
-msgstr "不正确的消息类型"
+msgstr "消息类型不恰当"
-#: mod_muc/mod_muc_room.erl:403
+#: mod_muc/mod_muc_room.erl:474
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
-msgstr "该用户由于给其他人发送了出错消息而被踢出了聊天室"
+msgstr "该用户由于给其他人发送了出错信息而被踢出了聊天室"
-#: mod_muc/mod_muc_room.erl:416
+#: mod_muc/mod_muc_room.erl:487
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "\"群组聊天\"类型不允许发送私聊消息"
-#: mod_muc/mod_muc_room.erl:428 mod_muc/mod_muc_room.erl:482
+#: mod_muc/mod_muc_room.erl:499 mod_muc/mod_muc_room.erl:553
msgid "Recipient is not in the conference room"
msgstr "接收人不在会议室"
-#: mod_muc/mod_muc_room.erl:448 mod_muc/mod_muc_room.erl:825
-#: mod_muc/mod_muc_room.erl:3447
+#: mod_muc/mod_muc_room.erl:519 mod_muc/mod_muc_room.erl:872
+#: mod_muc/mod_muc_room.erl:3272
msgid "Only occupants are allowed to send messages to the conference"
-msgstr "只允许驻留者向会议发送消息"
+msgstr "只允许占有者向会议发送消息"
-#: mod_muc/mod_muc_room.erl:457
+#: mod_muc/mod_muc_room.erl:528
msgid "It is not allowed to send private messages"
msgstr "不允许发送私聊消息"
-#: mod_muc/mod_muc_room.erl:503
+#: mod_muc/mod_muc_room.erl:574
msgid "Only occupants are allowed to send queries to the conference"
-msgstr "只允许驻留者发出查询请求"
+msgstr "只允许占有者发出查询请求"
-#: mod_muc/mod_muc_room.erl:515
+#: mod_muc/mod_muc_room.erl:586
msgid "Queries to the conference members are not allowed in this room"
msgstr "本房间不允许发出成员查询请求"
-#: mod_muc/mod_muc_room.erl:601
+#: mod_muc/mod_muc_room.erl:671
msgid "private, "
-msgstr "保密, "
+msgstr "保密"
-#: mod_muc/mod_muc_room.erl:801
+#: mod_muc/mod_muc_room.erl:848
msgid ""
-"Only moderators and participants are allowed to change the subject in this "
-"room"
-msgstr "只允许监管人和参与人在此房间里更改主题"
+"Only moderators and participants are allowed to change subject in this room"
+msgstr "只允许监管人和参与人更改此房间的主题"
-#: mod_muc/mod_muc_room.erl:806
-msgid "Only moderators are allowed to change the subject in this room"
+#: mod_muc/mod_muc_room.erl:853
+msgid "Only moderators are allowed to change subject in this room"
msgstr "只允许监管人更改此房间的主题"
-#: mod_muc/mod_muc_room.erl:816
+#: mod_muc/mod_muc_room.erl:863
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "不允许访客给所有占有者发送消息"
-#: mod_muc/mod_muc_room.erl:884
+#: mod_muc/mod_muc_room.erl:931
msgid ""
"This participant is kicked from the room because he sent an error presence"
-msgstr "该用户由于发送了错误状态而被踢出了聊天室"
+msgstr "该用户由于状态信息错误而被踢出了聊天室"
-#: mod_muc/mod_muc_room.erl:902
+#: mod_muc/mod_muc_room.erl:949
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "此房间不允许用户更改昵称"
-#: mod_muc/mod_muc_room.erl:915 mod_muc/mod_muc_room.erl:1505
-msgid "That nickname is already in use by another occupant"
-msgstr "该昵称已被另一用户使用"
+#: mod_muc/mod_muc_room.erl:962 mod_muc/mod_muc_room.erl:1484
+msgid "Nickname is already in use by another occupant"
+msgstr "昵称已被另一用户占用"
-#: mod_muc/mod_muc_room.erl:1494
+#: mod_muc/mod_muc_room.erl:973 mod_muc/mod_muc_room.erl:1492
+msgid "Nickname is registered by another person"
+msgstr "昵称已被另一人注册"
+
+#: mod_muc/mod_muc_room.erl:1473
msgid "You have been banned from this room"
msgstr "您已被禁止进入该房间"
-#: mod_muc/mod_muc_room.erl:1497
-msgid "Membership is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1476
+msgid "Membership required to enter this room"
msgstr "进入此房间需要会员身份"
-#: mod_muc/mod_muc_room.erl:1533
+#: mod_muc/mod_muc_room.erl:1511
msgid "This room is not anonymous"
msgstr "此房间不是匿名房间"
-#: mod_muc/mod_muc_room.erl:1559
-msgid "A password is required to enter this room"
+#: mod_muc/mod_muc_room.erl:1536
+msgid "Password required to enter this room"
msgstr "进入此房间需要密码"
-#: mod_muc/mod_muc_room.erl:1581
-msgid "Unable to generate a captcha"
-msgstr "无法产生验证码"
-
-#: mod_muc/mod_muc_room.erl:1591
+#: mod_muc/mod_muc_room.erl:1545
msgid "Incorrect password"
msgstr "密码不正确"
-#: mod_muc/mod_muc_room.erl:2095
+#: mod_muc/mod_muc_room.erl:2028
msgid "Administrator privileges required"
msgstr "需要管理员权限"
-#: mod_muc/mod_muc_room.erl:2110
+#: mod_muc/mod_muc_room.erl:2043
msgid "Moderator privileges required"
-msgstr "需要主持人权限"
+msgstr "需要调解人权限"
-#: mod_muc/mod_muc_room.erl:2265
+#: mod_muc/mod_muc_room.erl:2198
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s无效"
-#: mod_muc/mod_muc_room.erl:2279
+#: mod_muc/mod_muc_room.erl:2212
msgid "Nickname ~s does not exist in the room"
msgstr "昵称~s不在该房间"
-#: mod_muc/mod_muc_room.erl:2305 mod_muc/mod_muc_room.erl:2683
+#: mod_muc/mod_muc_room.erl:2238 mod_muc/mod_muc_room.erl:2609
msgid "Invalid affiliation: ~s"
msgstr "无效加入: ~s"
-#: mod_muc/mod_muc_room.erl:2362
+#: mod_muc/mod_muc_room.erl:2295
msgid "Invalid role: ~s"
msgstr "无效角色: ~s"
-#: mod_muc/mod_muc_room.erl:2660 mod_muc/mod_muc_room.erl:2696
+#: mod_muc/mod_muc_room.erl:2586 mod_muc/mod_muc_room.erl:2622
msgid "Owner privileges required"
msgstr "需要持有人权限"
-#: mod_muc/mod_muc_room.erl:2820
-msgid "Configuration of room ~s"
-msgstr "房间~s的配置 "
+#: mod_muc/mod_muc_room.erl:2672
+msgid "Configuration for "
+msgstr "配置 "
-#: mod_muc/mod_muc_room.erl:2828 mod_muc/mod_muc_room.erl:3246
+#: mod_muc/mod_muc_room.erl:2681 mod_muc/mod_muc_room.erl:3082
+#, fuzzy
msgid "Room description"
-msgstr "房间描述"
+msgstr "描述:"
-#: mod_muc/mod_muc_room.erl:2835
+#: mod_muc/mod_muc_room.erl:2688
msgid "Make room persistent"
-msgstr "永久保存该房间"
+msgstr "在服务器端保存该房间"
-#: mod_muc/mod_muc_room.erl:2840
+#: mod_muc/mod_muc_room.erl:2693
msgid "Make room public searchable"
msgstr "使房间可被公开搜索"
-#: mod_muc/mod_muc_room.erl:2843
+#: mod_muc/mod_muc_room.erl:2696
msgid "Make participants list public"
msgstr "公开参与人列表"
-#: mod_muc/mod_muc_room.erl:2846
+#: mod_muc/mod_muc_room.erl:2699
msgid "Make room password protected"
-msgstr "进入此房间需要密码"
+msgstr "保护房间密码"
-#: mod_muc/mod_muc_room.erl:2857
+#: mod_muc/mod_muc_room.erl:2710
msgid "Maximum Number of Occupants"
-msgstr "允许的驻留者最大数"
+msgstr "占有人最大数"
-#: mod_muc/mod_muc_room.erl:2864
+#: mod_muc/mod_muc_room.erl:2723
msgid "No limit"
msgstr "不限"
-#: mod_muc/mod_muc_room.erl:2875
+#: mod_muc/mod_muc_room.erl:2733
msgid "Present real Jabber IDs to"
-msgstr "将真实 Jabber ID 显示给"
+msgstr "将真实Jabber ID显示给"
-#: mod_muc/mod_muc_room.erl:2883
+#: mod_muc/mod_muc_room.erl:2741
msgid "moderators only"
-msgstr "仅主持人"
+msgstr "仅一般人"
-#: mod_muc/mod_muc_room.erl:2885
+#: mod_muc/mod_muc_room.erl:2743
msgid "anyone"
msgstr "任何人"
-#: mod_muc/mod_muc_room.erl:2887
+#: mod_muc/mod_muc_room.erl:2745
msgid "Make room members-only"
msgstr "设置房间只接收会员"
-#: mod_muc/mod_muc_room.erl:2890
+#: mod_muc/mod_muc_room.erl:2748
msgid "Make room moderated"
-msgstr "只有有\"发言权\"的用户才可以发送消息给所有驻留者"
+msgstr "使房间处于监管状态"
-#: mod_muc/mod_muc_room.erl:2893
+#: mod_muc/mod_muc_room.erl:2751
msgid "Default users as participants"
-msgstr "用户默认被视为参与人"
+msgstr "将默认用户视为参与人"
-#: mod_muc/mod_muc_room.erl:2896
-msgid "Allow users to change the subject"
+#: mod_muc/mod_muc_room.erl:2754
+msgid "Allow users to change subject"
msgstr "允许用户更改主题"
-#: mod_muc/mod_muc_room.erl:2899
+#: mod_muc/mod_muc_room.erl:2757
msgid "Allow users to send private messages"
msgstr "允许用户发送私聊消息"
-#: mod_muc/mod_muc_room.erl:2902
+#: mod_muc/mod_muc_room.erl:2760
msgid "Allow users to query other users"
msgstr "允许用户查询其它用户"
-#: mod_muc/mod_muc_room.erl:2905
+#: mod_muc/mod_muc_room.erl:2763
msgid "Allow users to send invites"
msgstr "允许用户发送邀请"
-#: mod_muc/mod_muc_room.erl:2908
+#: mod_muc/mod_muc_room.erl:2766
msgid "Allow visitors to send status text in presence updates"
msgstr "更新在线状态时允许用户发送状态文本"
-#: mod_muc/mod_muc_room.erl:2911
+#: mod_muc/mod_muc_room.erl:2769
msgid "Allow visitors to change nickname"
msgstr "允许用户更改昵称"
-#: mod_muc/mod_muc_room.erl:2917
-msgid "Make room captcha protected"
-msgstr "保护房间验证码"
-
-#: mod_muc/mod_muc_room.erl:2926
+#: mod_muc/mod_muc_room.erl:2777
msgid "Enable logging"
msgstr "启用服务器端聊天记录"
-#: mod_muc/mod_muc_room.erl:2934
+#: mod_muc/mod_muc_room.erl:2785
msgid "You need an x:data capable client to configure room"
-msgstr "您需要一个兼容 x:data 的客户端来配置房间"
+msgstr "您需要一个兼容x:data的客户端来配置房间"
-#: mod_muc/mod_muc_room.erl:3248
+#: mod_muc/mod_muc_room.erl:3084
msgid "Number of occupants"
-msgstr "驻留人数"
+msgstr "占用人数"
-#: mod_muc/mod_muc_room.erl:3367
+#: mod_muc/mod_muc_room.erl:3192
msgid "~s invites you to the room ~s"
msgstr "~s邀请你到~s房间"
-#: mod_muc/mod_muc_room.erl:3376
+#: mod_muc/mod_muc_room.erl:3201
msgid "the password is"
msgstr "密码是"
-#: mod_offline.erl:509 mod_offline_odbc.erl:352
+#: mod_offline.erl:446 mod_offline_odbc.erl:296
msgid ""
"Your contact offline message queue is full. The message has been discarded."
-msgstr "您的联系人离线消息队列已满. 消息已被丢弃"
+msgstr "您的离线消息队列已满. 消息已被丢弃"
-#: mod_offline.erl:558 mod_offline_odbc.erl:407
+#: mod_offline.erl:495 mod_offline_odbc.erl:351
msgid "~s's Offline Messages Queue"
-msgstr "~s 的离线消息队列"
+msgstr "~s的离线消息队列"
-#: mod_offline.erl:561 mod_offline_odbc.erl:410 mod_roster.erl:992
-#: mod_roster_odbc.erl:1093 mod_shared_roster.erl:778
-#: mod_shared_roster.erl:879 web/ejabberd_web_admin.erl:813
-#: web/ejabberd_web_admin.erl:854 web/ejabberd_web_admin.erl:922
-#: web/ejabberd_web_admin.erl:958 web/ejabberd_web_admin.erl:999
-#: web/ejabberd_web_admin.erl:1489 web/ejabberd_web_admin.erl:1688
-#: web/ejabberd_web_admin.erl:1858 web/ejabberd_web_admin.erl:1890
-#: web/ejabberd_web_admin.erl:1953 web/ejabberd_web_admin.erl:2057
-#: web/ejabberd_web_admin.erl:2082 web/ejabberd_web_admin.erl:2170
+#: mod_offline.erl:498 mod_offline_odbc.erl:354 mod_roster.erl:847
+#: mod_roster_odbc.erl:954 mod_shared_roster.erl:648 mod_shared_roster.erl:748
+#: web/ejabberd_web_admin.erl:681 web/ejabberd_web_admin.erl:724
+#: web/ejabberd_web_admin.erl:792 web/ejabberd_web_admin.erl:830
+#: web/ejabberd_web_admin.erl:870 web/ejabberd_web_admin.erl:1319
+#: web/ejabberd_web_admin.erl:1506 web/ejabberd_web_admin.erl:1668
+#: web/ejabberd_web_admin.erl:1735 web/ejabberd_web_admin.erl:1816
+#: web/ejabberd_web_admin.erl:1839 web/ejabberd_web_admin.erl:1908
msgid "Submitted"
msgstr "已提交"
-#: mod_offline.erl:569
+#: mod_offline.erl:506
msgid "Time"
msgstr "时间"
-#: mod_offline.erl:570
+#: mod_offline.erl:507
msgid "From"
msgstr "从"
-#: mod_offline.erl:571
+#: mod_offline.erl:508
msgid "To"
msgstr "到"
-#: mod_offline.erl:572 mod_offline_odbc.erl:418
+#: mod_offline.erl:509 mod_offline_odbc.erl:362
msgid "Packet"
msgstr "数据包"
-#: mod_offline.erl:585 mod_offline_odbc.erl:431 mod_shared_roster.erl:785
-#: web/ejabberd_web_admin.erl:862 web/ejabberd_web_admin.erl:966
+#: mod_offline.erl:522 mod_offline_odbc.erl:375 mod_shared_roster.erl:655
+#: web/ejabberd_web_admin.erl:732 web/ejabberd_web_admin.erl:838
msgid "Delete Selected"
msgstr "删除已选内容"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
+#: mod_offline.erl:557 mod_offline_odbc.erl:440
msgid "Offline Messages:"
msgstr "离线消息:"
-#: mod_offline.erl:620 mod_offline_odbc.erl:496
-msgid "Remove All Offline Messages"
-msgstr "移除所有离线消息"
-
-#: mod_proxy65/mod_proxy65_service.erl:213
+#: mod_proxy65/mod_proxy65_service.erl:192
msgid "ejabberd SOCKS5 Bytestreams module"
-msgstr "ejabberd SOCKS5 字节流模块"
+msgstr "ejabberd SOCKS5字节流模块"
-#: mod_pubsub/mod_pubsub.erl:1066 mod_pubsub/mod_pubsub_odbc.erl:892
+#: mod_pubsub/mod_pubsub.erl:753
msgid "Publish-Subscribe"
-msgstr "发行-订阅"
+msgstr "发布-订阅"
-#: mod_pubsub/mod_pubsub.erl:1163 mod_pubsub/mod_pubsub_odbc.erl:990
+#: mod_pubsub/mod_pubsub.erl:846
msgid "ejabberd Publish-Subscribe module"
-msgstr "ejabberd 发行-订阅模块"
+msgstr "ejabberd发行-订阅模块"
-#: mod_pubsub/mod_pubsub.erl:1446 mod_pubsub/mod_pubsub_odbc.erl:1277
+#: mod_pubsub/mod_pubsub.erl:997
msgid "PubSub subscriber request"
-msgstr "PubSub 订阅人请求"
+msgstr "PubSub订阅人请求"
-#: mod_pubsub/mod_pubsub.erl:1448 mod_pubsub/mod_pubsub_odbc.erl:1279
+#: mod_pubsub/mod_pubsub.erl:999
msgid "Choose whether to approve this entity's subscription."
msgstr "选择是否允许该实体的订阅"
-#: mod_pubsub/mod_pubsub.erl:1454 mod_pubsub/mod_pubsub_odbc.erl:1285
+#: mod_pubsub/mod_pubsub.erl:1005
msgid "Node ID"
-msgstr "节点 ID"
+msgstr "节点ID"
-#: mod_pubsub/mod_pubsub.erl:1459 mod_pubsub/mod_pubsub_odbc.erl:1290
+#: mod_pubsub/mod_pubsub.erl:1010
msgid "Subscriber Address"
msgstr "订阅人地址"
-#: mod_pubsub/mod_pubsub.erl:1465 mod_pubsub/mod_pubsub_odbc.erl:1296
+#: mod_pubsub/mod_pubsub.erl:1016
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
-msgstr "允许该 Jabber ID 订阅该pubsub节点?"
+msgstr "允许该Jabber ID订阅该pubsub节点?"
-#: mod_pubsub/mod_pubsub.erl:3265 mod_pubsub/mod_pubsub_odbc.erl:3119
+#: mod_pubsub/mod_pubsub.erl:2497
msgid "Deliver payloads with event notifications"
msgstr "用事件通告传输有效负载"
-#: mod_pubsub/mod_pubsub.erl:3266 mod_pubsub/mod_pubsub_odbc.erl:3120
+#: mod_pubsub/mod_pubsub.erl:2498
msgid "Deliver event notifications"
msgstr "传递事件通知"
-#: mod_pubsub/mod_pubsub.erl:3267 mod_pubsub/mod_pubsub_odbc.erl:3121
+#: mod_pubsub/mod_pubsub.erl:2499
msgid "Notify subscribers when the node configuration changes"
msgstr "当节点设置改变时通知订阅人"
-#: mod_pubsub/mod_pubsub.erl:3268 mod_pubsub/mod_pubsub_odbc.erl:3122
+#: mod_pubsub/mod_pubsub.erl:2500
msgid "Notify subscribers when the node is deleted"
msgstr "当节点被删除时通知订阅人"
-#: mod_pubsub/mod_pubsub.erl:3269 mod_pubsub/mod_pubsub_odbc.erl:3123
+#: mod_pubsub/mod_pubsub.erl:2501
msgid "Notify subscribers when items are removed from the node"
msgstr "当从节点删除内容条目时通知订阅人"
-#: mod_pubsub/mod_pubsub.erl:3270 mod_pubsub/mod_pubsub_odbc.erl:3124
+#: mod_pubsub/mod_pubsub.erl:2502
msgid "Persist items to storage"
msgstr "持久化内容条目"
-#: mod_pubsub/mod_pubsub.erl:3271 mod_pubsub/mod_pubsub_odbc.erl:3125
+#: mod_pubsub/mod_pubsub.erl:2503
msgid "A friendly name for the node"
msgstr "该节点的友好名称"
-#: mod_pubsub/mod_pubsub.erl:3272 mod_pubsub/mod_pubsub_odbc.erl:3126
+#: mod_pubsub/mod_pubsub.erl:2504
msgid "Max # of items to persist"
msgstr "允许持久化的最大内容条目数"
-#: mod_pubsub/mod_pubsub.erl:3273 mod_pubsub/mod_pubsub_odbc.erl:3127
+#: mod_pubsub/mod_pubsub.erl:2505
msgid "Whether to allow subscriptions"
msgstr "是否允许订阅"
-#: mod_pubsub/mod_pubsub.erl:3274 mod_pubsub/mod_pubsub_odbc.erl:3128
+#: mod_pubsub/mod_pubsub.erl:2506
msgid "Specify the access model"
msgstr "指定访问模式"
-#: mod_pubsub/mod_pubsub.erl:3277 mod_pubsub/mod_pubsub_odbc.erl:3131
+#: mod_pubsub/mod_pubsub.erl:2510
msgid "Roster groups allowed to subscribe"
msgstr "允许订阅的花名册组"
-#: mod_pubsub/mod_pubsub.erl:3278 mod_pubsub/mod_pubsub_odbc.erl:3132
+#: mod_pubsub/mod_pubsub.erl:2514
msgid "Specify the publisher model"
msgstr "指定发布人样式"
-#: mod_pubsub/mod_pubsub.erl:3280 mod_pubsub/mod_pubsub_odbc.erl:3134
+#: mod_pubsub/mod_pubsub.erl:2516
msgid "Max payload size in bytes"
msgstr "最大有效负载比特数"
-#: mod_pubsub/mod_pubsub.erl:3281 mod_pubsub/mod_pubsub_odbc.erl:3135
+#: mod_pubsub/mod_pubsub.erl:2517
msgid "When to send the last published item"
msgstr "何时发送最新发布的内容条目"
-#: mod_pubsub/mod_pubsub.erl:3283 mod_pubsub/mod_pubsub_odbc.erl:3137
+#: mod_pubsub/mod_pubsub.erl:2519
msgid "Only deliver notifications to available users"
msgstr "仅将通知发送给可发送的用户"
-#: mod_pubsub/mod_pubsub.erl:3284 mod_pubsub/mod_pubsub_odbc.erl:3138
-msgid "The collections with which a node is affiliated"
-msgstr "加入结点的集合"
-
-#: mod_register.erl:190
+#: mod_register.erl:191
msgid "Choose a username and password to register with this server"
msgstr "请选择在此服务器上注册所需的用户名和密码"
-#: mod_register.erl:243
-msgid "Users are not allowed to register accounts so quickly"
-msgstr "不允许用户太频繁地注册帐户"
+#: mod_register.erl:232
+msgid "Users are not allowed to register accounts so fast"
+msgstr "不允许用户注册帐户太快"
-#: mod_roster.erl:943 mod_roster_odbc.erl:1044 web/ejabberd_web_admin.erl:1653
-#: web/ejabberd_web_admin.erl:1813 web/ejabberd_web_admin.erl:1824
-#: web/ejabberd_web_admin.erl:2141
+#: mod_roster.erl:798 mod_roster_odbc.erl:905 web/ejabberd_web_admin.erl:1481
+#: web/ejabberd_web_admin.erl:1623 web/ejabberd_web_admin.erl:1634
+#: web/ejabberd_web_admin.erl:1898
msgid "None"
msgstr "无"
-#: mod_roster.erl:950 mod_roster_odbc.erl:1051
+#: mod_roster.erl:805 mod_roster_odbc.erl:912
msgid "Subscription"
msgstr "订阅"
-#: mod_roster.erl:951 mod_roster_odbc.erl:1052
+#: mod_roster.erl:806 mod_roster_odbc.erl:913
msgid "Pending"
msgstr "挂起"
-#: mod_roster.erl:952 mod_roster_odbc.erl:1053
+#: mod_roster.erl:807 mod_roster_odbc.erl:914
msgid "Groups"
msgstr "组"
-#: mod_roster.erl:979 mod_roster_odbc.erl:1080
+#: mod_roster.erl:834 mod_roster_odbc.erl:941
msgid "Validate"
msgstr "确认"
-#: mod_roster.erl:987 mod_roster_odbc.erl:1088
+#: mod_roster.erl:842 mod_roster_odbc.erl:949
msgid "Remove"
msgstr "移除"
-#: mod_roster.erl:990 mod_roster_odbc.erl:1091
+#: mod_roster.erl:845 mod_roster_odbc.erl:952
msgid "Roster of "
msgstr "花名册属于 "
-#: mod_roster.erl:993 mod_roster_odbc.erl:1094 mod_shared_roster.erl:779
-#: mod_shared_roster.erl:880 web/ejabberd_web_admin.erl:814
-#: web/ejabberd_web_admin.erl:855 web/ejabberd_web_admin.erl:923
-#: web/ejabberd_web_admin.erl:959 web/ejabberd_web_admin.erl:1000
-#: web/ejabberd_web_admin.erl:1490 web/ejabberd_web_admin.erl:1689
-#: web/ejabberd_web_admin.erl:1859 web/ejabberd_web_admin.erl:2058
-#: web/ejabberd_web_admin.erl:2083 web/ejabberd_web_admin.erl:2171
+#: mod_roster.erl:848 mod_roster_odbc.erl:955 mod_shared_roster.erl:649
+#: mod_shared_roster.erl:749 web/ejabberd_web_admin.erl:682
+#: web/ejabberd_web_admin.erl:725 web/ejabberd_web_admin.erl:793
+#: web/ejabberd_web_admin.erl:831 web/ejabberd_web_admin.erl:871
+#: web/ejabberd_web_admin.erl:1320 web/ejabberd_web_admin.erl:1507
+#: web/ejabberd_web_admin.erl:1669 web/ejabberd_web_admin.erl:1817
+#: web/ejabberd_web_admin.erl:1840 web/ejabberd_web_admin.erl:1909
msgid "Bad format"
msgstr "格式错误"
-#: mod_roster.erl:1000 mod_roster_odbc.erl:1101
+#: mod_roster.erl:855 mod_roster_odbc.erl:962
msgid "Add Jabber ID"
-msgstr "添加 Jabber ID"
+msgstr "添加Jabber ID"
-#: mod_roster.erl:1099 mod_roster_odbc.erl:1200
+#: mod_roster.erl:936 mod_roster_odbc.erl:1043
msgid "Roster"
msgstr "花名册"
-#: mod_shared_roster.erl:734 mod_shared_roster.erl:776
-#: mod_shared_roster.erl:876
+#: mod_shared_roster.erl:604 mod_shared_roster.erl:646
+#: mod_shared_roster.erl:745
msgid "Shared Roster Groups"
msgstr "共享的花名册组群"
-#: mod_shared_roster.erl:772 web/ejabberd_web_admin.erl:1346
-#: web/ejabberd_web_admin.erl:2383
+#: mod_shared_roster.erl:642 web/ejabberd_web_admin.erl:1189
+#: web/ejabberd_web_admin.erl:2082
msgid "Add New"
msgstr "添加新用户"
-#: mod_shared_roster.erl:847
+#: mod_shared_roster.erl:716
msgid "Name:"
-msgstr "姓名:"
+msgstr "名称:"
-#: mod_shared_roster.erl:852
+#: mod_shared_roster.erl:721
msgid "Description:"
msgstr "描述:"
-#: mod_shared_roster.erl:860
+#: mod_shared_roster.erl:729
msgid "Members:"
msgstr "会员:"
-#: mod_shared_roster.erl:868
+#: mod_shared_roster.erl:737
msgid "Displayed Groups:"
msgstr "已显示的组:"
-#: mod_shared_roster.erl:877
+#: mod_shared_roster.erl:746
msgid "Group "
msgstr "组"
-#: mod_shared_roster.erl:886 web/ejabberd_web_admin.erl:820
-#: web/ejabberd_web_admin.erl:864 web/ejabberd_web_admin.erl:929
-#: web/ejabberd_web_admin.erl:1006 web/ejabberd_web_admin.erl:1944
+#: mod_shared_roster.erl:755 web/ejabberd_web_admin.erl:691
+#: web/ejabberd_web_admin.erl:734 web/ejabberd_web_admin.erl:802
+#: web/ejabberd_web_admin.erl:877 web/ejabberd_web_admin.erl:1751
msgid "Submit"
msgstr "提交"
-#: mod_vcard.erl:165 mod_vcard_ldap.erl:237 mod_vcard_odbc.erl:129
+#: mod_vcard.erl:165 mod_vcard_ldap.erl:235 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber 服务器"
-#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:446
+#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:463
msgid "Birthday"
msgstr "出生日期"
-#: mod_vcard.erl:357 mod_vcard.erl:473 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:448
+#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:465
msgid "City"
msgstr "城市"
-#: mod_vcard.erl:357 mod_vcard.erl:472 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:447
+#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:464
msgid "Country"
msgstr "国家"
-#: mod_vcard.erl:357 mod_vcard.erl:474 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:449
+#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:466
msgid "Email"
msgstr "电子邮件"
-#: mod_vcard.erl:357 mod_vcard.erl:469 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:444
+#: mod_vcard.erl:357 mod_vcard.erl:464 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:461
msgid "Family Name"
msgstr "姓氏"
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
-msgstr "填充表单以搜索任何匹配的 Jabber 用户(在字段末添加*来匹配子串)"
+msgstr "填充表单以搜索任何匹配的Jabber用户(在字段末添加*来匹配子串)"
-#: mod_vcard.erl:357 mod_vcard.erl:466 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:441
+#: mod_vcard.erl:357 mod_vcard.erl:461 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:458
msgid "Full Name"
msgstr "全名"
-#: mod_vcard.erl:357 mod_vcard.erl:468 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:443
+#: mod_vcard.erl:357 mod_vcard.erl:463 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:460
msgid "Middle Name"
msgstr "中间名"
-#: mod_vcard.erl:357 mod_vcard.erl:467 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:442 web/ejabberd_web_admin.erl:1933
+#: mod_vcard.erl:357 mod_vcard.erl:462 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:459 web/ejabberd_web_admin.erl:1740
msgid "Name"
-msgstr "姓名"
+msgstr "名称"
-#: mod_vcard.erl:357 mod_vcard.erl:475 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:450
+#: mod_vcard.erl:357 mod_vcard.erl:470 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:467
msgid "Organization Name"
msgstr "组织名称"
-#: mod_vcard.erl:357 mod_vcard.erl:476 mod_vcard_odbc.erl:334
-#: mod_vcard_odbc.erl:451
+#: mod_vcard.erl:357 mod_vcard.erl:471 mod_vcard_odbc.erl:354
+#: mod_vcard_odbc.erl:468
msgid "Organization Unit"
msgstr "组织单位"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "Search users in "
-msgstr "搜索用户于 "
+msgstr "要搜索的用户位于 "
-#: mod_vcard.erl:357 mod_vcard_odbc.erl:334 web/ejabberd_web_admin.erl:1496
-#: web/ejabberd_web_admin.erl:1551
+#: mod_vcard.erl:357 mod_vcard_odbc.erl:354 web/ejabberd_web_admin.erl:1326
+#: web/ejabberd_web_admin.erl:1381
msgid "User"
msgstr "用户"
-#: mod_vcard.erl:357 mod_vcard_ldap.erl:458 mod_vcard_odbc.erl:334
+#: mod_vcard.erl:357 mod_vcard_ldap.erl:455 mod_vcard_odbc.erl:354
msgid "You need an x:data capable client to search"
-msgstr "您需要一个兼容 x:data 的客户端来搜索"
+msgstr "您需要一个兼容x:data的客户端来搜索"
-#: mod_vcard.erl:382 mod_vcard_ldap.erl:483 mod_vcard_odbc.erl:359
+#: mod_vcard.erl:379 mod_vcard_ldap.erl:477 mod_vcard_odbc.erl:376
msgid "vCard User Search"
-msgstr "vCard 用户搜索"
+msgstr "vCard用户搜索"
-#: mod_vcard.erl:438 mod_vcard_ldap.erl:537 mod_vcard_odbc.erl:413
+#: mod_vcard.erl:433 mod_vcard_ldap.erl:531 mod_vcard_odbc.erl:430
msgid "ejabberd vCard module"
msgstr "ejabberd vCard 模块"
-#: mod_vcard.erl:462 mod_vcard_ldap.erl:547 mod_vcard_odbc.erl:437
+#: mod_vcard.erl:457 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:454
msgid "Search Results for "
msgstr "搜索结果属于关键词 "
-#: mod_vcard_ldap.erl:458
+#: mod_vcard_ldap.erl:455
msgid "Fill in fields to search for any matching Jabber User"
-msgstr "填充字段以搜索任何匹配的 Jabber 用户"
+msgstr "填充字段以搜索任何匹配的Jabber用户"
-#: web/ejabberd_web_admin.erl:179 web/ejabberd_web_admin.erl:186
-#: web/ejabberd_web_admin.erl:202 web/ejabberd_web_admin.erl:209
-msgid "Unauthorized"
-msgstr "未认证的"
-
-#: web/ejabberd_web_admin.erl:266 web/ejabberd_web_admin.erl:283
+#: web/ejabberd_web_admin.erl:115 web/ejabberd_web_admin.erl:166
msgid "ejabberd Web Admin"
-msgstr "ejabberd 网页管理"
+msgstr "ejabberd网页管理"
-#: web/ejabberd_web_admin.erl:749 web/ejabberd_web_admin.erl:760
+#: web/ejabberd_web_admin.erl:130 web/ejabberd_web_admin.erl:181
+#: web/ejabberd_web_admin.erl:603 web/ejabberd_web_admin.erl:622
msgid "Administration"
msgstr "管理"
-#: web/ejabberd_web_admin.erl:858 web/ejabberd_web_admin.erl:962
-msgid "Raw"
-msgstr "原始格式"
+#: web/ejabberd_web_admin.erl:137 web/ejabberd_web_admin.erl:609
+msgid "Virtual Hosts"
+msgstr "虚拟主机"
-#: web/ejabberd_web_admin.erl:997
-msgid "~s access rule configuration"
-msgstr "~s 访问规则配置"
-
-#: web/ejabberd_web_admin.erl:1015
-msgid "ejabberd virtual hosts"
-msgstr "ejabberd 虚拟主机"
-
-#: web/ejabberd_web_admin.erl:1023 web/ejabberd_web_admin.erl:1030
-msgid "Users"
-msgstr "用户"
-
-#: web/ejabberd_web_admin.erl:1058
-msgid "Users Last Activity"
-msgstr "用户上次活动"
-
-#: web/ejabberd_web_admin.erl:1060
-msgid "Period: "
-msgstr "持续时间: "
-
-#: web/ejabberd_web_admin.erl:1070
-msgid "Last month"
-msgstr "上个月"
-
-#: web/ejabberd_web_admin.erl:1071
-msgid "Last year"
-msgstr "上一年"
-
-#: web/ejabberd_web_admin.erl:1072
-msgid "All activity"
-msgstr "所有活动"
-
-#: web/ejabberd_web_admin.erl:1074
-msgid "Show Ordinary Table"
-msgstr "显示普通列表"
-
-#: web/ejabberd_web_admin.erl:1076
-msgid "Show Integral Table"
-msgstr "显示完整列表"
-
-#: web/ejabberd_web_admin.erl:1085 web/ejabberd_web_admin.erl:1866
-msgid "Statistics"
-msgstr "统计"
-
-#: web/ejabberd_web_admin.erl:1097
-msgid "Not Found"
-msgstr "没有找到"
-
-#: web/ejabberd_web_admin.erl:1114
-msgid "Node not found"
-msgstr "没有找到节点"
-
-#: web/ejabberd_web_admin.erl:1441
-msgid "Host"
-msgstr "主机"
-
-#: web/ejabberd_web_admin.erl:1442
-msgid "Registered Users"
-msgstr "注册用户"
-
-#: web/ejabberd_web_admin.erl:1552
-msgid "Offline Messages"
-msgstr "离线消息"
-
-#: web/ejabberd_web_admin.erl:1553
-msgid "Last Activity"
-msgstr "上次活动"
-
-#: web/ejabberd_web_admin.erl:1611 web/ejabberd_web_admin.erl:1627
-msgid "Registered Users:"
-msgstr "注册用户:"
-
-#: web/ejabberd_web_admin.erl:1613 web/ejabberd_web_admin.erl:1629
-#: web/ejabberd_web_admin.erl:2114
-msgid "Online Users:"
-msgstr "在线用户:"
-
-#: web/ejabberd_web_admin.erl:1615
-msgid "Outgoing s2s Connections:"
-msgstr "出站 s2s 连接:"
-
-#: web/ejabberd_web_admin.erl:1617
-msgid "Outgoing s2s Servers:"
-msgstr "出站 s2s 服务器"
-
-#: web/ejabberd_web_admin.erl:1683
-msgid "Change Password"
-msgstr "更改密码"
-
-#: web/ejabberd_web_admin.erl:1686
-msgid "User "
-msgstr "用户 "
-
-#: web/ejabberd_web_admin.erl:1693
-msgid "Connected Resources:"
-msgstr "已连接资源:"
-
-#: web/ejabberd_web_admin.erl:1694
-msgid "Password:"
-msgstr "密码: "
-
-#: web/ejabberd_web_admin.erl:1755
-msgid "No Data"
-msgstr "没有数据"
-
-#: web/ejabberd_web_admin.erl:1833
+#: web/ejabberd_web_admin.erl:138 web/ejabberd_web_admin.erl:195
+#: web/ejabberd_web_admin.erl:610 web/ejabberd_web_admin.erl:631
+#: web/ejabberd_web_admin.erl:1643
msgid "Nodes"
msgstr "节点"
-#: web/ejabberd_web_admin.erl:1856 web/ejabberd_web_admin.erl:1878
+#: web/ejabberd_web_admin.erl:139 web/ejabberd_web_admin.erl:196
+#: web/ejabberd_web_admin.erl:611 web/ejabberd_web_admin.erl:632
+#: web/ejabberd_web_admin.erl:950 web/ejabberd_web_admin.erl:1676
+msgid "Statistics"
+msgstr "统计"
+
+#: web/ejabberd_web_admin.erl:192 web/ejabberd_web_admin.erl:628
+#: web/ejabberd_web_admin.erl:892 web/ejabberd_web_admin.erl:898
+msgid "Users"
+msgstr "用户"
+
+#: web/ejabberd_web_admin.erl:194 web/ejabberd_web_admin.erl:630
+#: web/ejabberd_web_admin.erl:1383
+msgid "Last Activity"
+msgstr "上次活动"
+
+#: web/ejabberd_web_admin.erl:606 web/ejabberd_web_admin.erl:608
+#: web/ejabberd_web_admin.erl:625 web/ejabberd_web_admin.erl:627
+msgid "(Raw)"
+msgstr "(原始格式)"
+
+#: web/ejabberd_web_admin.erl:728 web/ejabberd_web_admin.erl:834
+msgid "Raw"
+msgstr "原始格式"
+
+#: web/ejabberd_web_admin.erl:868
+msgid "~s access rule configuration"
+msgstr "~s访问规则配置"
+
+#: web/ejabberd_web_admin.erl:885
+msgid "ejabberd virtual hosts"
+msgstr "ejabberd虚拟主机"
+
+#: web/ejabberd_web_admin.erl:924
+msgid "Users Last Activity"
+msgstr "用户上次活动"
+
+#: web/ejabberd_web_admin.erl:926
+msgid "Period: "
+msgstr "持续时间:"
+
+#: web/ejabberd_web_admin.erl:936
+msgid "Last month"
+msgstr "上个月"
+
+#: web/ejabberd_web_admin.erl:937
+msgid "Last year"
+msgstr "上一年"
+
+#: web/ejabberd_web_admin.erl:938
+msgid "All activity"
+msgstr "所有活动"
+
+#: web/ejabberd_web_admin.erl:940
+msgid "Show Ordinary Table"
+msgstr "显示普通列表"
+
+#: web/ejabberd_web_admin.erl:942
+msgid "Show Integral Table"
+msgstr "显示完整列表"
+
+#: web/ejabberd_web_admin.erl:971
+msgid "Node not found"
+msgstr "没有找到节点"
+
+#: web/ejabberd_web_admin.erl:1273
+msgid "Host"
+msgstr "主机"
+
+#: web/ejabberd_web_admin.erl:1274
+msgid "Registered Users"
+msgstr "注册用户"
+
+#: web/ejabberd_web_admin.erl:1382
+msgid "Offline Messages"
+msgstr "离线消息"
+
+#: web/ejabberd_web_admin.erl:1439 web/ejabberd_web_admin.erl:1455
+msgid "Registered Users:"
+msgstr "注册用户:"
+
+#: web/ejabberd_web_admin.erl:1441 web/ejabberd_web_admin.erl:1457
+#: web/ejabberd_web_admin.erl:1871
+msgid "Online Users:"
+msgstr "在线用户:"
+
+#: web/ejabberd_web_admin.erl:1443
+msgid "Outgoing s2s Connections:"
+msgstr "出站s2s连接:"
+
+#: web/ejabberd_web_admin.erl:1445
+msgid "Outgoing s2s Servers:"
+msgstr "出站s2s服务器"
+
+#: web/ejabberd_web_admin.erl:1501
+msgid "Change Password"
+msgstr "更改密码"
+
+#: web/ejabberd_web_admin.erl:1504
+msgid "User "
+msgstr "用户 "
+
+#: web/ejabberd_web_admin.erl:1511
+msgid "Connected Resources:"
+msgstr "已连接资源"
+
+#: web/ejabberd_web_admin.erl:1512
+msgid "Password:"
+msgstr "密码:"
+
+#: web/ejabberd_web_admin.erl:1567
+msgid "No Data"
+msgstr "没有数据"
+
+#: web/ejabberd_web_admin.erl:1666 web/ejabberd_web_admin.erl:1688
msgid "Node "
msgstr "节点 "
-#: web/ejabberd_web_admin.erl:1865
+#: web/ejabberd_web_admin.erl:1675
msgid "Listened Ports"
-msgstr "被监听的端口"
+msgstr "监听端口"
-#: web/ejabberd_web_admin.erl:1867 web/ejabberd_web_admin.erl:2182
-#: web/ejabberd_web_admin.erl:2370
+#: web/ejabberd_web_admin.erl:1677 web/ejabberd_web_admin.erl:1913
+#: web/ejabberd_web_admin.erl:2071
msgid "Update"
msgstr "更新"
-#: web/ejabberd_web_admin.erl:1870 web/ejabberd_web_admin.erl:2491
+#: web/ejabberd_web_admin.erl:1680 web/ejabberd_web_admin.erl:2148
msgid "Restart"
msgstr "重启"
-#: web/ejabberd_web_admin.erl:1872 web/ejabberd_web_admin.erl:2493
+#: web/ejabberd_web_admin.erl:1682 web/ejabberd_web_admin.erl:2150
msgid "Stop"
msgstr "停止"
-#: web/ejabberd_web_admin.erl:1886
+#: web/ejabberd_web_admin.erl:1696
msgid "RPC Call Error"
-msgstr "RPC 调用错误"
+msgstr "RPC调用错误"
-#: web/ejabberd_web_admin.erl:1927
+#: web/ejabberd_web_admin.erl:1734
msgid "Database Tables at "
msgstr "数据库列表位于 "
-#: web/ejabberd_web_admin.erl:1934
+#: web/ejabberd_web_admin.erl:1741
msgid "Storage Type"
msgstr "存储类型"
-#: web/ejabberd_web_admin.erl:1935
-msgid "Elements"
-msgstr "元素"
+#: web/ejabberd_web_admin.erl:1742
+msgid "Size"
+msgstr "大小"
-#: web/ejabberd_web_admin.erl:1936
+#: web/ejabberd_web_admin.erl:1743
msgid "Memory"
msgstr "内存"
-#: web/ejabberd_web_admin.erl:1954 web/ejabberd_web_admin.erl:2059
-msgid "Error"
-msgstr "错误"
-
-#: web/ejabberd_web_admin.erl:1956
+#: web/ejabberd_web_admin.erl:1758
msgid "Backup of "
msgstr "备份来源 "
-#: web/ejabberd_web_admin.erl:1958
+#: web/ejabberd_web_admin.erl:1759
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 "
+"Remark 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 模块, 您还需"
-"要分别备份您的数据库."
+"注意:这些选项仅将备份内置的Mnesia数据库. 如果您在使用ODBC模块, 您还需要分别"
+"备份您的数据库."
-#: web/ejabberd_web_admin.erl:1963
+#: web/ejabberd_web_admin.erl:1764
msgid "Store binary backup:"
msgstr "存储为二进制备份:"
-#: web/ejabberd_web_admin.erl:1967 web/ejabberd_web_admin.erl:1974
-#: web/ejabberd_web_admin.erl:1982 web/ejabberd_web_admin.erl:1989
-#: web/ejabberd_web_admin.erl:1996 web/ejabberd_web_admin.erl:2003
-#: web/ejabberd_web_admin.erl:2010 web/ejabberd_web_admin.erl:2018
-#: web/ejabberd_web_admin.erl:2025 web/ejabberd_web_admin.erl:2032
+#: web/ejabberd_web_admin.erl:1768 web/ejabberd_web_admin.erl:1775
+#: web/ejabberd_web_admin.erl:1783 web/ejabberd_web_admin.erl:1790
+#: web/ejabberd_web_admin.erl:1797
msgid "OK"
-msgstr "确定"
+msgstr "OK"
-#: web/ejabberd_web_admin.erl:1970
+#: web/ejabberd_web_admin.erl:1771
msgid "Restore binary backup immediately:"
msgstr "立即恢复二进制备份:"
-#: web/ejabberd_web_admin.erl:1978
+#: web/ejabberd_web_admin.erl:1779
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
-msgstr "在下次 ejabberd 重启后恢复二进制备份(需要的内存更少):"
+msgstr "在下次ejabberd重启后恢复二进制备份(需要的内存更少):"
-#: web/ejabberd_web_admin.erl:1985
+#: web/ejabberd_web_admin.erl:1786
msgid "Store plain text backup:"
msgstr "存储为普通文本备份:"
-#: web/ejabberd_web_admin.erl:1992
+#: web/ejabberd_web_admin.erl:1793
msgid "Restore plain text backup immediately:"
msgstr "立即恢复普通文本备份:"
-#: web/ejabberd_web_admin.erl:1999
-msgid "Import users data from a PIEFXIS file (XEP-0227):"
-msgstr "从 PIEFXIS 文件 (XEP-0227)导入用户数据:"
-
-#: web/ejabberd_web_admin.erl:2006
-msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
-msgstr "将服务器上所有用户的数据导出到 PIEFXIS 文件 (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2013
-msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
-msgstr "将某主机的用户数据导出到 PIEFXIS 文件 (XEP-0227):"
-
-#: web/ejabberd_web_admin.erl:2021
-msgid "Import user data from jabberd14 spool file:"
-msgstr "从 jabberd14 Spool文件导入用户数据:"
-
-#: web/ejabberd_web_admin.erl:2028
-msgid "Import users data from jabberd14 spool directory:"
-msgstr "从 jabberd14 Spool目录导入用户数据:"
-
-#: web/ejabberd_web_admin.erl:2054
+#: web/ejabberd_web_admin.erl:1814
msgid "Listened Ports at "
msgstr "监听的端口位于 "
-#: web/ejabberd_web_admin.erl:2079
+#: web/ejabberd_web_admin.erl:1837
msgid "Modules at "
msgstr "模块位于 "
-#: web/ejabberd_web_admin.erl:2105
+#: web/ejabberd_web_admin.erl:1862
msgid "Statistics of ~p"
-msgstr "~p 的统计"
+msgstr "~p的统计"
-#: web/ejabberd_web_admin.erl:2108
+#: web/ejabberd_web_admin.erl:1865
msgid "Uptime:"
msgstr "正常运行时间:"
-#: web/ejabberd_web_admin.erl:2111
+#: web/ejabberd_web_admin.erl:1868
msgid "CPU Time:"
-msgstr "CPU 时间:"
+msgstr "CPU时间:"
-#: web/ejabberd_web_admin.erl:2117
+#: web/ejabberd_web_admin.erl:1874
msgid "Transactions Committed:"
msgstr "提交的事务:"
-#: web/ejabberd_web_admin.erl:2120
+#: web/ejabberd_web_admin.erl:1877
msgid "Transactions Aborted:"
msgstr "取消的事务:"
-#: web/ejabberd_web_admin.erl:2123
+#: web/ejabberd_web_admin.erl:1880
msgid "Transactions Restarted:"
msgstr "重启的事务:"
-#: web/ejabberd_web_admin.erl:2126
+#: web/ejabberd_web_admin.erl:1883
msgid "Transactions Logged:"
msgstr "记入日志的事务:"
-#: web/ejabberd_web_admin.erl:2168
+#: web/ejabberd_web_admin.erl:1906
msgid "Update "
msgstr "更新 "
-#: web/ejabberd_web_admin.erl:2176
+#: web/ejabberd_web_admin.erl:1914
msgid "Update plan"
msgstr "更新计划"
-#: web/ejabberd_web_admin.erl:2177
-msgid "Modified modules"
-msgstr "被修改模块"
+#: web/ejabberd_web_admin.erl:1915
+msgid "Updated modules"
+msgstr "更新模块"
-#: web/ejabberd_web_admin.erl:2178
+#: web/ejabberd_web_admin.erl:1916
msgid "Update script"
msgstr "更新脚本"
-#: web/ejabberd_web_admin.erl:2179
+#: web/ejabberd_web_admin.erl:1917
msgid "Low level update script"
msgstr "低级别更新脚本"
-#: web/ejabberd_web_admin.erl:2180
+#: web/ejabberd_web_admin.erl:1918
msgid "Script check"
-msgstr "脚本检查"
+msgstr "检查脚本"
-#: web/ejabberd_web_admin.erl:2348
+#: web/ejabberd_web_admin.erl:2054
msgid "Port"
msgstr "端口"
-#: web/ejabberd_web_admin.erl:2349
-msgid "IP"
-msgstr "IP"
-
-#: web/ejabberd_web_admin.erl:2350
-msgid "Protocol"
-msgstr "协议"
-
-#: web/ejabberd_web_admin.erl:2351 web/ejabberd_web_admin.erl:2478
+#: web/ejabberd_web_admin.erl:2055 web/ejabberd_web_admin.erl:2135
msgid "Module"
msgstr "模块"
-#: web/ejabberd_web_admin.erl:2352 web/ejabberd_web_admin.erl:2479
+#: web/ejabberd_web_admin.erl:2056 web/ejabberd_web_admin.erl:2136
msgid "Options"
msgstr "选项"
-#: web/ejabberd_web_admin.erl:2372
+#: web/ejabberd_web_admin.erl:2073
msgid "Delete"
msgstr "删除"
-#: web/ejabberd_web_admin.erl:2501
+#: web/ejabberd_web_admin.erl:2158
msgid "Start"
msgstr "开始"
-
-#~ msgid "Encodings"
-#~ msgstr "编码"
-
-#~ msgid "(Raw)"
-#~ msgstr "(原始格式)"
-
-#~ msgid "Virtual Hosts"
-#~ msgstr "虚拟主机"
-
-#~ msgid "Specified nickname is already registered"
-#~ msgstr "指定的昵称已被注册"
-
-#~ msgid "Size"
-#~ msgstr "大小"
diff --git a/src/odbc/ejabberd_odbc.erl b/src/odbc/ejabberd_odbc.erl
index ef00c8b20..fd77decea 100644
--- a/src/odbc/ejabberd_odbc.erl
+++ b/src/odbc/ejabberd_odbc.erl
@@ -121,7 +121,10 @@ sql_query_t(Query) ->
%% Escape character that will confuse an SQL engine
escape(S) when is_list(S) ->
- [odbc_queries:escape(C) || C <- S].
+ [odbc_queries:escape(C) || C <- S];
+
+escape(S) when is_binary(S) ->
+ [odbc_queries:escape(C) || <> <= S].
%% Escape character that will confuse an SQL engine
%% Percent and underscore only need to be escaped for pattern matching like
diff --git a/src/odbc/mssql2000.sql b/src/odbc/mssql2000.sql
index 89429a210..176ff8300 100644
--- a/src/odbc/mssql2000.sql
+++ b/src/odbc/mssql2000.sql
@@ -290,8 +290,6 @@ ALTER TABLE [dbo].[privacy_default_list] WITH NOCHECK ADD
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO
-
-
CREATE INDEX [IX_rostergroups_jid] ON [dbo].[rostergroups]([jid]) WITH FILLFACTOR = 90 ON [PRIMARY]
GO
diff --git a/src/odbc/odbc_queries.erl b/src/odbc/odbc_queries.erl
index f70b8fb35..630a26a5b 100644
--- a/src/odbc/odbc_queries.erl
+++ b/src/odbc/odbc_queries.erl
@@ -90,14 +90,6 @@
-define(generic, true).
-endif.
-%% Almost a copy of string:join/2.
-%% We use this version because string:join/2 is relatively
-%% new function (introduced in R12B-0).
-join([], _Sep) ->
- [];
-join([H|T], Sep) ->
- [H, [[Sep, X] || X <- T]].
-
%% -----------------
%% Generic queries
-ifdef(generic).
@@ -111,14 +103,14 @@ update_t(Table, Fields, Vals, Where) ->
Fields, Vals),
case ejabberd_odbc:sql_query_t(
["update ", Table, " set ",
- join(UPairs, ", "),
+ string:join(UPairs, ", "),
" where ", Where, ";"]) of
{updated, 1} ->
ok;
_ ->
ejabberd_odbc:sql_query_t(
- ["insert into ", Table, "(", join(Fields, ", "),
- ") values ('", join(Vals, "', '"), "');"])
+ ["insert into ", Table, "(", string:join(Fields, ", "),
+ ") values ('", string:join(Vals, "', '"), "');"])
end.
%% F can be either a fun or a list of queries
@@ -353,7 +345,7 @@ update_roster(_LServer, Username, SJID, ItemVals, ItemGroups) ->
ejabberd_odbc:sql_query_t(
["insert into rostergroups("
" username, jid, grp) "
- " values ('", join(ItemGroup, "', '"), "');"])
+ " values ('", string:join(ItemGroup, "', '"), "');"])
end,
ItemGroups).
@@ -365,13 +357,13 @@ update_roster_sql(Username, SJID, ItemVals, ItemGroups) ->
" username, jid, nick, "
" subscription, ask, askmessage, "
" server, subscribe, type) "
- " values ('", join(ItemVals, "', '"), "');"],
+ " values ('", string:join(ItemVals, "', '"), "');"],
["delete from rostergroups "
" where username='", Username, "' "
" and jid='", SJID, "';"]] ++
[["insert into rostergroups("
" username, jid, grp) "
- " values ('", join(ItemGroup, "', '"), "');"] ||
+ " values ('", string:join(ItemGroup, "', '"), "');"] ||
ItemGroup <- ItemGroups].
roster_subscribe(_LServer, Username, SJID, ItemVals) ->
@@ -527,7 +519,7 @@ set_privacy_list(ID, RItems) ->
"match_presence_out "
") "
"values ('", ID, "', '",
- join(Items, "', '"), "');"])
+ string:join(Items, "', '"), "');"])
end, RItems).
del_privacy_lists(LServer, Server, Username) ->
@@ -558,7 +550,6 @@ count_records_where(LServer, Table, WhereClause) ->
LServer,
["select count(*) from ", Table, " ", WhereClause, ";"]).
-
get_roster_version(LServer, LUser) ->
ejabberd_odbc:sql_query(LServer,
["select version from roster_version where username = '", LUser, "'"]).
diff --git a/src/stringprep/Makefile.in b/src/stringprep/Makefile.in
deleted file mode 100644
index 7c4997d26..000000000
--- a/src/stringprep/Makefile.in
+++ /dev/null
@@ -1,60 +0,0 @@
-# $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
-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
-
diff --git a/src/stringprep/Makefile.win32 b/src/stringprep/Makefile.win32
deleted file mode 100644
index 60ccb416c..000000000
--- a/src/stringprep/Makefile.win32
+++ /dev/null
@@ -1,40 +0,0 @@
-
-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:$(DLL) $(OBJECT)
-
-$(OBJECT) : $(SOURCE) $(AUXIL)
- $(CC) $(CC_FLAGS) -c -Fo$(OBJECT) $(SOURCE)
-
diff --git a/src/stringprep/stringprep.erl b/src/stringprep/stringprep.erl
deleted file mode 100644
index eac3745b7..000000000
--- a/src/stringprep/stringprep.erl
+++ /dev/null
@@ -1,113 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : stringprep.erl
-%%% Author : Alexey Shchepin
-%%% Purpose : Interface to stringprep_drv
-%%% Created : 16 Feb 2003 by Alexey Shchepin
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2009 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.
-
-
-
diff --git a/src/stringprep/stringprep_drv.c b/src/stringprep/stringprep_drv.c
deleted file mode 100644
index 8007fb5f8..000000000
--- a/src/stringprep/stringprep_drv.c
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * ejabberd, Copyright (C) 2002-2009 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
-
-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 int stringprep_erl_control(ErlDrvData drv_data,
- unsigned int command,
- char *buf, int len,
- char **rbuf, int 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 */
-};
-
-DRIVER_INIT(stringprep_erl) /* must match name in driver_entry */
-{
- return &stringprep_driver_entry;
-}
-
diff --git a/src/stringprep/stringprep_sup.erl b/src/stringprep/stringprep_sup.erl
deleted file mode 100644
index 354d52d07..000000000
--- a/src/stringprep/stringprep_sup.erl
+++ /dev/null
@@ -1,68 +0,0 @@
-%%%-------------------------------------------------------------------
-%%% File : stringprep_sup.erl
-%%% Author : Mickael Remond
-%%% Description : Supervisor for the Stringprep worker.
-%%% Created : 29 Jun 2007 by Mickael Remond
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2009 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]}}.
diff --git a/src/stringprep/uni_data.c b/src/stringprep/uni_data.c
deleted file mode 100644
index 1c76ee811..000000000
--- a/src/stringprep/uni_data.c
+++ /dev/null
@@ -1,1257 +0,0 @@
-/*
- * 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))]])
-
diff --git a/src/stringprep/uni_norm.c b/src/stringprep/uni_norm.c
deleted file mode 100644
index 7575f1405..000000000
--- a/src/stringprep/uni_norm.c
+++ /dev/null
@@ -1,3264 +0,0 @@
-/*
- * 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)
-
diff --git a/src/stringprep/uni_parse.tcl b/src/stringprep/uni_parse.tcl
deleted file mode 100644
index 100631b6b..000000000
--- a/src/stringprep/uni_parse.tcl
+++ /dev/null
@@ -1,437 +0,0 @@
-# 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
diff --git a/src/stringprep/uni_parse2.tcl b/src/stringprep/uni_parse2.tcl
deleted file mode 100644
index 950090a09..000000000
--- a/src/stringprep/uni_parse2.tcl
+++ /dev/null
@@ -1,702 +0,0 @@
-# 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
diff --git a/src/stun/ejabberd_stun.erl b/src/stun/ejabberd_stun.erl
index 0b87a3a4e..2c27f321d 100644
--- a/src/stun/ejabberd_stun.erl
+++ b/src/stun/ejabberd_stun.erl
@@ -75,10 +75,10 @@ socket_type() ->
udp_recv(Sock, Addr, Port, Data, _Opts) ->
case stun_codec:decode(Data) of
{ok, Msg, <<>>} ->
- ?DEBUG("got:~n~p", [Msg]),
+ ?DEBUG("got:~n~s", [stun_codec:pp(Msg)]),
case process(Addr, Port, Msg) of
RespMsg when is_record(RespMsg, stun) ->
- ?DEBUG("sent:~n~p", [RespMsg]),
+ ?DEBUG("sent:~n~s", [stun_codec:pp(RespMsg)]),
Data1 = stun_codec:encode(RespMsg),
gen_udp:send(Sock, Addr, Port, Data1);
_ ->
@@ -112,11 +112,11 @@ wait_for_tls(Event, State) ->
{next_state, wait_for_tls, State}.
session_established(Msg, State) when is_record(Msg, stun) ->
- ?DEBUG("got:~n~p", [Msg]),
+ ?DEBUG("got:~n~s", [stun_codec:pp(Msg)]),
{Addr, Port} = State#state.peer,
case process(Addr, Port, Msg) of
Resp when is_record(Resp, stun) ->
- ?DEBUG("sent:~n~p", [Resp]),
+ ?DEBUG("sent:~n~s", [stun_codec:pp(Resp)]),
Data = stun_codec:encode(Resp),
(State#state.sock_mod):send(State#state.sock, Data);
_ ->
diff --git a/src/translate.erl b/src/translate.erl
index 0488530f3..391d22574 100644
--- a/src/translate.erl
+++ b/src/translate.erl
@@ -32,6 +32,8 @@
load_file/2,
translate/2]).
+-export([tokens/2, ascii_tolower/1]).
+
-include("ejabberd.hrl").
start() ->
@@ -67,13 +69,13 @@ load_dir(Dir) ->
end, Files),
lists:foreach(
fun(FN) ->
- LP = ascii_tolower(
- string:substr(FN, 1, string:len(FN) - 4)),
- L = case string:tokens(LP, ".") of
- [Language] -> Language;
- [Language, _Project] -> Language
- end,
- load_file(L, Dir ++ "/" ++ FN)
+ LP = string:substr(FN, 1, string:len(FN) - 4),
+ L1 = case string:tokens(LP, ".") of
+ [Language] -> Language;
+ [Language, _Project] -> Language
+ end,
+ L2 = ascii_tolower(list_to_binary(L1)),
+ load_file(L2, Dir ++ "/" ++ FN)
end, MsgFiles),
ok;
{error, Reason} ->
@@ -111,14 +113,14 @@ translate(Lang, Msg) ->
[{_, Trans}] ->
Trans;
_ ->
- ShortLang = case string:tokens(LLang, "-") of
+ ShortLang = case tokens(LLang, $-) of
[] ->
LLang;
[SL | _] ->
SL
end,
case ShortLang of
- "en" ->
+ <<"en">> ->
Msg;
LLang ->
translate(Msg);
@@ -133,27 +135,29 @@ translate(Lang, Msg) ->
end.
translate(Msg) ->
+ %%TODO: ?MYLANG macro returns lang as a list(). Lang should be a binary.
case ?MYLANG of
undefined ->
Msg;
"en" ->
Msg;
Lang ->
- LLang = ascii_tolower(Lang),
+ BLang = list_to_binary(Lang),
+ LLang = ascii_tolower(BLang),
case ets:lookup(translations, {LLang, Msg}) of
[{_, Trans}] ->
Trans;
_ ->
- ShortLang = case string:tokens(LLang, "-") of
+ ShortLang = case tokens(LLang, $-) of
[] ->
LLang;
[SL | _] ->
SL
end,
case ShortLang of
- "en" ->
+ <<"en">> ->
Msg;
- Lang ->
+ BLang ->
Msg;
_ ->
case ets:lookup(translations, {ShortLang, Msg}) of
@@ -166,10 +170,25 @@ translate(Msg) ->
end
end.
-ascii_tolower([C | Cs]) when C >= $A, C =< $Z ->
- [C + ($a - $A) | ascii_tolower(Cs)];
-ascii_tolower([C | Cs]) ->
- [C | ascii_tolower(Cs)];
-ascii_tolower([]) ->
- [].
+ascii_tolower(undefined) ->
+ <<>>;
+ascii_tolower(Bin) ->
+ << <<(char_tolower(X))>> || <> <= Bin >>.
+
+char_tolower(C) when C >= $A, C =< $Z ->
+ C + ($a -$A);
+char_tolower(C) ->
+ C.
+
+tokens(<<>>,_Sep) ->
+ [];
+tokens(Bin, Sep) ->
+ tokens(Bin, Sep, <<>>, []).
+
+tokens(<<>>, _Sep, T, Tokens) ->
+ lists:reverse([T|Tokens]);
+tokens(<>, Sep, T, Tokens) ->
+ tokens(R, Sep, <<>>, [T | Tokens]);
+tokens(<>, Sep, T, Tokens) ->
+ tokens(R, Sep, <>, Tokens).
diff --git a/src/web/Makefile.in b/src/web/Makefile.in
index 21f7c9348..151f4c476 100644
--- a/src/web/Makefile.in
+++ b/src/web/Makefile.in
@@ -9,7 +9,6 @@ LIBS = @LIBS@
ERLANG_CFLAGS = @ERLANG_CFLAGS@
ERLANG_LIBS = @ERLANG_LIBS@
-EFLAGS += @ERLANG_SSL39@
EFLAGS += -I ..
EFLAGS += -pz ..
diff --git a/src/web/ejabberd_http.erl b/src/web/ejabberd_http.erl
index bff4b4d45..54ee37563 100644
--- a/src/web/ejabberd_http.erl
+++ b/src/web/ejabberd_http.erl
@@ -35,10 +35,14 @@
receive_headers/1,
url_encode/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("ejabberd_http.hrl").
+%% @type request() = term()
+%% @type query() = list()
+
-record(state, {sockmod,
socket,
request_method,
@@ -47,7 +51,7 @@
request_auth,
request_keepalive,
request_content_length,
- request_lang = "en",
+ request_lang = <<"en">>,
%% XXX bard: request handlers are configured in
%% ejabberd.cfg under the HTTP service. For example,
%% to have the module test_web handle requests with
@@ -213,7 +217,7 @@ process_header(State, Data) ->
request_path = Path,
request_keepalive = KeepAlive};
{ok, {http_header, _, 'Connection'=Name, _, Conn}} ->
- KeepAlive1 = case jlib:tolower(Conn) of
+ KeepAlive1 = case exmpp_stringprep:to_lower(Conn) of
"keep-alive" ->
true;
"close" ->
@@ -370,10 +374,9 @@ process_request(#state{request_method = Method,
%% procedure (process) that handles dispatching based on
%% URL path prefix.
case process(RequestHandlers, Request) of
- El when element(1, El) == xmlelement ->
+ El when is_record(El, xmlel) ->
make_xhtml_output(State, 200, [], El);
- {Status, Headers, El} when
- element(1, El) == xmlelement ->
+ {Status, Headers, El} when is_record(El, xmlel) ->
make_xhtml_output(State, Status, Headers, El);
Output when is_list(Output) or is_binary(Output) ->
make_text_output(State, 200, [], Output);
@@ -433,10 +436,9 @@ process_request(#state{request_method = Method,
headers = RequestHeaders,
ip = IP},
case process(RequestHandlers, Request) of
- El when element(1, El) == xmlelement ->
+ El when is_record(El, xmlel) ->
make_xhtml_output(State, 200, [], El);
- {Status, Headers, El} when
- element(1, El) == xmlelement ->
+ {Status, Headers, El} when is_record(El, xmlel) ->
make_xhtml_output(State, Status, Headers, El);
Output when is_list(Output) or is_binary(Output) ->
make_text_output(State, 200, [], Output);
@@ -449,8 +451,8 @@ process_request(State) ->
make_xhtml_output(State,
400,
[],
- ejabberd_web:make_xhtml([{xmlelement, "h1", [],
- [{xmlcdata, "400 Bad Request"}]}])).
+ ejabberd_web:make_xhtml([#xmlel{ns = ?NS_XHTML, name = 'h1', children =
+ [#xmlcdata{cdata = <<"400 Bad Request">>}]}])).
recv_data(State, Len) ->
@@ -477,10 +479,10 @@ make_xhtml_output(State, Status, Headers, XHTML) ->
Data = case lists:member(html, Headers) of
true ->
list_to_binary([?HTML_DOCTYPE,
- element_to_string(XHTML)]);
+ exmpp_xml:document_to_list(XHTML)]);
_ ->
list_to_binary([?XHTML_DOCTYPE,
- element_to_string(XHTML)])
+ exmpp_xml:document_to_list(XHTML)])
end,
Headers1 = case lists:keysearch("Content-Type", 1, Headers) of
{value, _} ->
@@ -557,45 +559,11 @@ make_text_output(State, Status, Headers, Data) when is_binary(Data) ->
parse_lang(Langs) ->
case string:tokens(Langs, ",; ") of
[First | _] ->
- First;
+ list_to_binary(First);
[] ->
- "en"
+ <<"en">>
end.
-element_to_string(El) ->
- case El of
- {xmlelement, Name, Attrs, Els} ->
- if
- Els /= [] ->
- [$<, Name, attrs_to_list(Attrs), $>,
- [element_to_string(E) || E <- Els],
- $<, $/, Name, $>];
- true ->
- [$<, Name, attrs_to_list(Attrs), $/, $>]
- end;
- {xmlcdata, CData} ->
- crypt(CData)
- end.
-
-attrs_to_list(Attrs) ->
- [attr_to_list(A) || A <- Attrs].
-
-attr_to_list({Name, Value}) ->
- [$\s, crypt(Name), $=, $", crypt(Value), $"].
-
-crypt(S) when is_list(S) ->
- [case C of
- $& -> "&";
- $< -> "<";
- $> -> ">";
- $" -> """;
- $' -> "'";
- _ -> C
- end || C <- S];
-crypt(S) when is_binary(S) ->
- crypt(binary_to_list(S)).
-
-
% Code below is taken (with some modifications) from the yaws webserver, which
% is distributed under the folowing license:
%
diff --git a/src/web/ejabberd_http_bind.erl b/src/web/ejabberd_http_bind.erl
index 43fd9ecfd..1fa05f007 100644
--- a/src/web/ejabberd_http_bind.erl
+++ b/src/web/ejabberd_http_bind.erl
@@ -38,6 +38,9 @@
-include("jlib.hrl").
-include("ejabberd_http.hrl").
+%% TODO: Use exmpp library instead of including this
+-define(NS_STREAM, "http://etherx.jabber.org/streams").
+
-record(http_bind, {id, pid, to, hold, wait, version}).
-define(NULL_PEER, {{0, 0, 0, 0}, 0}).
diff --git a/src/web/ejabberd_http_poll.erl b/src/web/ejabberd_http_poll.erl
index 9a41fc362..e340d0e35 100644
--- a/src/web/ejabberd_http_poll.erl
+++ b/src/web/ejabberd_http_poll.erl
@@ -44,8 +44,9 @@
close/1,
process/2]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("ejabberd_http.hrl").
-record(http_poll, {id, pid}).
@@ -72,6 +73,11 @@
-define(CT, {"Content-Type", "text/xml; charset=utf-8"}).
-define(BAD_REQUEST, [?CT, {"Set-Cookie", "ID=-3:0; expires=-1"}]).
+-define(PARSER_OPTIONS, [
+ {namespace, true},
+ {name_as_atom, true},
+ {autoload_known, true}
+]).
%%%----------------------------------------------------------------------
%%% API
@@ -157,8 +163,8 @@ process([], #request{data = Data,
{200, [?CT, {"Set-Cookie", "ID=-2:0; expires=-1"}], ""}
end;
process(_, _Request) ->
- {400, [], {xmlelement, "h1", [],
- [{xmlcdata, "400 Bad Request"}]}}.
+ {400, [], #xmlel{ns = ?NS_XHTML, name = 'h1', children =
+ [#xmlcdata{cdata = <<"400 Bad Request">>}]}}.
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
@@ -406,7 +412,7 @@ resend_messages(Messages) ->
%% This function is used to resend messages that have been polled but not
%% delivered.
resend_message(Packet) ->
- ParsedPacket = xml_stream:parse_element(Packet),
+ [ParsedPacket] = exmpp_xml:parse_document(Packet, ?PARSER_OPTIONS),
From = get_jid("from", ParsedPacket),
To = get_jid("to", ParsedPacket),
?DEBUG("Resend ~p ~p ~p~n",[From,To, ParsedPacket]),
@@ -414,10 +420,17 @@ resend_message(Packet) ->
%% Type can be "from" or "to"
%% Parsed packet is a parsed Jabber packet.
-get_jid(Type, ParsedPacket) ->
- case xml:get_tag_attr(Type, ParsedPacket) of
- {value, StringJid} ->
- jlib:string_to_jid(StringJid);
- false ->
- jlib:make_jid("","","")
+get_jid("from", ParsedPacket) ->
+ case exmpp_stanza:get_sender(ParsedPacket) of
+ undefined ->
+ exmpp_jid:make();
+ From ->
+ exmpp_jid:parse(From)
+ end;
+get_jid("to", ParsedPacket) ->
+ case exmpp_stanza:get_recipient(ParsedPacket) of
+ undefined ->
+ exmpp_jid:make();
+ From ->
+ exmpp_jid:parse(From)
end.
diff --git a/src/web/ejabberd_web.erl b/src/web/ejabberd_web.erl
index 575114b8c..7c0a5e158 100644
--- a/src/web/ejabberd_web.erl
+++ b/src/web/ejabberd_web.erl
@@ -31,10 +31,12 @@
-export([make_xhtml/1, make_xhtml/2,
error/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("ejabberd_http.hrl").
+%% @type html() = term()
%% XXX bard: there are variants of make_xhtml in ejabberd_http and
%% ejabberd_web_admin. It might be a good idea to centralize it here
@@ -45,36 +47,40 @@ make_xhtml(Els) ->
make_xhtml([], Els).
make_xhtml(HeadEls, Els) ->
- {xmlelement, "html", [{"xmlns", "http://www.w3.org/1999/xhtml"},
- {"xml:lang", "en"},
- {"lang", "en"}],
- [{xmlelement, "head", [],
- [{xmlelement, "meta", [{"http-equiv", "Content-Type"},
- {"content", "text/html; charset=utf-8"}], []}
- | HeadEls]},
- {xmlelement, "body", [], Els}
- ]}.
+ #xmlel{ns = ?NS_XHTML, name = 'html', attrs = [
+ exmpp_xml:attribute(?NS_XML, 'lang', <<"en">>),
+ ?XMLATTR('lang', <<"en">>)], children = [
+ #xmlel{ns = ?NS_XHTML, name = 'head', children = [
+ #xmlel{ns = ?NS_XHTML, name = 'meta', attrs = [
+ ?XMLATTR('http-equiv', <<"Content-Type">>),
+ ?XMLATTR('content', <<"text/html; charset=utf-8">>)
+ ]}
+ | HeadEls
+ ]},
+ #xmlel{ns = ?NS_XHTML, name = 'body', children = Els}
+ ]}.
--define(X(Name), {xmlelement, Name, [], []}).
--define(XA(Name, Attrs), {xmlelement, Name, Attrs, []}).
--define(XE(Name, Els), {xmlelement, Name, [], Els}).
--define(XAE(Name, Attrs, Els), {xmlelement, Name, Attrs, Els}).
--define(C(Text), {xmlcdata, Text}).
+-define(X(Name), #xmlel{ns = ?NS_XHTML, name = Name}).
+-define(XA(Name, Attrs), #xmlel{ns = ?NS_XHTML, name = Name, attrs = Attrs}).
+-define(XE(Name, Els), #xmlel{ns = ?NS_XHTML, name = Name, children = Els}).
+-define(XAE(Name, Attrs, Els), #xmlel{ns = ?NS_XHTML, name = Name,
+ attrs = Attrs, children = Els}).
+-define(C(Text), #xmlcdata{cdata = list_to_binary(Text)}).
-define(XC(Name, Text), ?XE(Name, [?C(Text)])).
-define(XAC(Name, Attrs, Text), ?XAE(Name, Attrs, [?C(Text)])).
--define(LI(Els), ?XE("li", Els)).
--define(A(URL, Els), ?XAE("a", [{"href", URL}], Els)).
+-define(LI(Els), ?XE('li', Els)).
+-define(A(URL, Els), ?XAE('a', [?XMLATTR('href', URL)], Els)).
-define(AC(URL, Text), ?A(URL, [?C(Text)])).
--define(P, ?X("p")).
--define(BR, ?X("br")).
+-define(P, ?X('p')).
+-define(BR, ?X('br')).
-define(INPUT(Type, Name, Value),
- ?XA("input", [{"type", Type},
- {"name", Name},
- {"value", Value}])).
+ ?XA('input', [?XMLATTR('type', Type),
+ ?XMLATTR('name', Name),
+ ?XMLATTR('value', Value)])).
error(not_found) ->
- {404, [], make_xhtml([?XC("h1", "404 Not Found")])};
+ {404, [], make_xhtml([?XC('h1', "404 Not Found")])};
error(not_allowed) ->
- {401, [], make_xhtml([?XC("h1", "401 Unauthorized")])}.
+ {401, [], make_xhtml([?XC('h1', "401 Unauthorized")])}.
diff --git a/src/web/ejabberd_web_admin.erl b/src/web/ejabberd_web_admin.erl
index 7ef793a36..697b03cfd 100644
--- a/src/web/ejabberd_web_admin.erl
+++ b/src/web/ejabberd_web_admin.erl
@@ -33,19 +33,19 @@
-export([process/2,
list_users/4,
list_users_in_diapason/4,
- pretty_print_xml/1,
term_to_id/1]).
+-include_lib("exmpp/include/exmpp.hrl").
+
-include("ejabberd.hrl").
--include("jlib.hrl").
-include("ejabberd_http.hrl").
-include("ejabberd_web_admin.hrl").
-define(INPUTATTRS(Type, Name, Value, Attrs),
?XA("input", Attrs ++
- [{"type", Type},
- {"name", Name},
- {"value", Value}])).
+ [?XMLATTR('type', Type),
+ ?XMLATTR('name', Name),
+ ?XMLATTR('value', Value)])).
%%%==================================
%%%% get_acl_access
@@ -74,7 +74,7 @@ get_acl_rule(_RPath) -> {global, configure}.
get_jid(Auth, HostHTTP) ->
case get_auth_admin(Auth, HostHTTP, []) of
{ok, {User, Server}} ->
- jlib:make_jid(User, Server, "");
+ exmpp_jid:make(User, Server, "");
{unauthorized, Error} ->
?ERROR_MSG("Unauthorized ~p: ~p", [Auth, Error]),
throw({unauthorized, Auth})
@@ -164,7 +164,7 @@ process(["doc", LocalFile], _Request) ->
end;
process(["server", SHost | RPath] = Path, #request{auth = Auth, lang = Lang, host = HostHTTP} = Request) ->
- Host = jlib:nameprep(SHost),
+ Host = exmpp_stringprep:nameprep(SHost),
case lists:member(Host, ?MYHOSTS) of
true ->
case get_auth_admin(Auth, HostHTTP, Path) of
@@ -176,17 +176,17 @@ process(["server", SHost | RPath] = Path, #request{auth = Auth, lang = Lang, hos
{unauthorized, "no-auth-provided"} ->
{401,
[{"WWW-Authenticate", "basic realm=\"ejabberd\""}],
- ejabberd_web:make_xhtml([?XCT("h1", "Unauthorized")])};
+ ejabberd_web:make_xhtml([?XCT('h1', "Unauthorized")])};
{unauthorized, Error} ->
?WARNING_MSG("Access ~p failed with error: ~p~n~p",
[Auth, Error, Request]),
{401,
[{"WWW-Authenticate",
"basic realm=\"auth error, retry login to ejabberd\""}],
- ejabberd_web:make_xhtml([?XCT("h1", "Unauthorized")])}
+ ejabberd_web:make_xhtml([?XCT('h1', "Unauthorized")])}
end;
false ->
- ejabberd_web:error(not_found)
+ ejabberd_web:error(not_found)
end;
process(RPath, #request{auth = Auth, lang = Lang, host = HostHTTP} = Request) ->
@@ -199,30 +199,36 @@ process(RPath, #request{auth = Auth, lang = Lang, host = HostHTTP} = Request) ->
{unauthorized, "no-auth-provided"} ->
{401,
[{"WWW-Authenticate", "basic realm=\"ejabberd\""}],
- ejabberd_web:make_xhtml([?XCT("h1", "Unauthorized")])};
+ ejabberd_web:make_xhtml([?XCT('h1', "Unauthorized")])};
{unauthorized, Error} ->
?WARNING_MSG("Access ~p failed with error: ~p~n~p",
[Auth, Error, Request]),
{401,
[{"WWW-Authenticate",
"basic realm=\"auth error, retry login to ejabberd\""}],
- ejabberd_web:make_xhtml([?XCT("h1", "Unauthorized")])}
+ ejabberd_web:make_xhtml([?XCT('h1', "Unauthorized")])}
end.
get_auth_admin(Auth, HostHTTP, RPath) ->
case Auth of
- {SJID, Pass} ->
- {HostOfRule, AccessRule} = get_acl_rule(RPath),
- case jlib:string_to_jid(SJID) of
- error ->
- {unauthorized, "badformed-jid"};
- #jid{user = "", server = User} ->
- %% If the user only specified username, not username@server
- get_auth_account(HostOfRule, AccessRule, User, HostHTTP, Pass);
- #jid{user = User, server = Server} ->
- get_auth_account(HostOfRule, AccessRule, User, Server, Pass)
- end;
- undefined ->
+ {SJID, Pass} ->
+ try
+ {HostOfRule, AccessRule} = get_acl_rule(RPath),
+ JID = exmpp_jid:parse(SJID),
+ User = exmpp_jid:node_as_list(JID),
+ Server = exmpp_jid:domain_as_list(JID),
+ case User == undefined of
+ true ->
+ %% If only specified username, not username@server
+ get_auth_account(HostOfRule, AccessRule, User, HostHTTP, Pass);
+ false ->
+ get_auth_account(HostOfRule, AccessRule, User, Server, Pass)
+ end
+ catch
+ _ ->
+ {unauthorized, "badformed-jid"}
+ end;
+ _ ->
{unauthorized, "no-auth-provided"}
end.
@@ -230,7 +236,7 @@ get_auth_account(HostOfRule, AccessRule, User, Server, Pass) ->
case ejabberd_auth:check_password(User, Server, Pass) of
true ->
case acl:match_rule(HostOfRule, AccessRule,
- jlib:make_jid(User, Server, "")) of
+ exmpp_jid:make(User, Server)) of
deny ->
{unauthorized, "unprivileged-account"};
allow ->
@@ -259,45 +265,52 @@ make_xhtml(Els, Host, Node, Lang, JID) ->
Base = get_base_path(Host, cluster), %% Enforcing 'cluster' on purpose here
MenuItems = make_navigation(Host, Node, Lang, JID),
{200, [html],
- {xmlelement, "html", [{"xmlns", "http://www.w3.org/1999/xhtml"},
- {"xml:lang", Lang},
- {"lang", Lang}],
- [{xmlelement, "head", [],
- [?XCT("title", "ejabberd Web Admin"),
- {xmlelement, "meta", [{"http-equiv", "Content-Type"},
- {"content", "text/html; charset=utf-8"}], []},
- {xmlelement, "script", [{"src", Base ++ "/additions.js"},
- {"type", "text/javascript"}], [?C(" ")]},
- {xmlelement, "link", [{"href", Base ++ "favicon.ico"},
- {"type", "image/x-icon"},
- {"rel", "shortcut icon"}], []},
- {xmlelement, "link", [{"href", Base ++ "style.css"},
- {"type", "text/css"},
- {"rel", "stylesheet"}], []}]},
- ?XE("body",
- [?XAE("div",
- [{"id", "container"}],
- [?XAE("div",
- [{"id", "header"}],
- [?XE("h1",
+ #xmlel{ns = ?NS_XHTML, name = 'html', attrs = [
+ exmpp_xml:attribute(?NS_XML, 'lang', Lang),
+ ?XMLATTR('lang', Lang)], children =
+ [#xmlel{ns = ?NS_XHTML, name = 'head', children =
+ [?XCT('title', "ejabberd Web Admin"),
+ #xmlel{ns = ?NS_XHTML, name = 'meta', attrs = [
+ ?XMLATTR('http-equiv', <<"Content-Type">>),
+ ?XMLATTR('content', <<"text/html; charset=utf-8">>)]},
+ #xmlel{ns = ?NS_XHTML, name = 'script',
+ %% This children is to ensure exmpp puts:
+ children = [?C(".")],
+ attrs = [
+ ?XMLATTR('src', Base ++ "additions.js"),
+ ?XMLATTR('type', <<"text/javascript">>)]},
+ #xmlel{ns = ?NS_XHTML, name = 'link', attrs = [
+ ?XMLATTR('href', Base ++ "favicon.ico"),
+ ?XMLATTR('type', <<"image/x-icon">>),
+ ?XMLATTR('rel', <<"shortcut icon">>)]},
+ #xmlel{ns = ?NS_XHTML, name = 'link', attrs = [
+ ?XMLATTR('href', Base ++ "style.css"),
+ ?XMLATTR('type', <<"text/css">>),
+ ?XMLATTR('rel', <<"stylesheet">>)]}]},
+ ?XE('body',
+ [?XAE('div',
+ [?XMLATTR('id', <<"container">>)],
+ [?XAE('div',
+ [?XMLATTR('id', <<"header">>)],
+ [?XE('h1',
[?ACT("/admin/", "ejabberd Web Admin")]
)]),
- ?XAE("div",
- [{"id", "navigation"}],
- [?XE("ul",
+ ?XAE('div',
+ [?XMLATTR('id', <<"navigation">>)],
+ [?XE('ul',
MenuItems
)]),
- ?XAE("div",
- [{"id", "content"}],
+ ?XAE('div',
+ [?XMLATTR('id', <<"content">>)],
Els),
- ?XAE("div",
- [{"id", "clearcopyright"}],
- [{xmlcdata, ""}])]),
- ?XAE("div",
- [{"id", "copyrightouter"}],
- [?XAE("div",
- [{"id", "copyright"}],
- [?XC("p",
+ ?XAE('div',
+ [?XMLATTR('id', <<"clearcopyright">>)],
+ [#xmlcdata{cdata = <<>>}])]),
+ ?XAE('div',
+ [?XMLATTR('id', <<"copyrightouter">>)],
+ [?XAE('div',
+ [?XMLATTR('id', <<"copyright">>)],
+ [?XC('p',
"ejabberd (c) 2002-2009 ProcessOne")
])])])
]}}.
@@ -664,7 +677,7 @@ h3 {
padding-left: 10px;
}
-#content ul.nolistyle>li {
+#content ul.noliststyle > li {
list-style-type: none;
}
@@ -747,7 +760,7 @@ process_admin(global,
lang = Lang}) ->
%%Base = get_base_path(global, cluster),
make_xhtml(?H1GL(?T("Administration"), "toc", "Contents") ++
- [?XE("ul",
+ [?XE('ul',
[?LI([?ACT(MIU, MIN)]) || {MIU, MIN} <- get_menu_items(global, cluster, Lang, AJID)]
)
], global, Lang, AJID);
@@ -757,8 +770,8 @@ process_admin(Host,
auth = {_, _Auth, AJID},
lang = Lang}) ->
%%Base = get_base_path(Host, cluster),
- make_xhtml([?XCT("h1", "Administration"),
- ?XE("ul",
+ make_xhtml([?XCT('h1', "Administration"),
+ ?XE('ul',
[?LI([?ACT(MIU, MIN)]) || {MIU, MIN} <- get_menu_items(Host, cluster, Lang, AJID)]
)
], Host, Lang, AJID);
@@ -814,7 +827,7 @@ process_admin(Host,
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[?TEXTAREA("acls", integer_to_list(lists:max([16, NumLines])), "80", ACLsP++"."),
?BR,
?INPUTT("submit", "submit", "Submit")
@@ -855,8 +868,8 @@ process_admin(Host,
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XE("p", [?ACT("../acls-raw/", "Raw")])] ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XE('p', [?ACT("../acls-raw/", "Raw")])] ++
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[acls_to_xhtml(ACLs),
?BR,
?INPUTT("submit", "delete", "Delete Selected"),
@@ -923,7 +936,7 @@ process_admin(Host,
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[?TEXTAREA("access", integer_to_list(lists:max([16, NumLines])), "80", AccessP++"."),
?BR,
?INPUTT("submit", "submit", "Submit")
@@ -959,8 +972,8 @@ process_admin(Host,
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XE("p", [?ACT("../access-raw/", "Raw")])] ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XE('p', [?ACT("../access-raw/", "Raw")])] ++
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[access_rules_to_xhtml(AccessRules, Lang),
?BR,
?INPUTT("submit", "delete", "Delete Selected")
@@ -993,14 +1006,14 @@ process_admin(Host,
Rs1 ->
Rs1
end,
- make_xhtml([?XC("h1",
+ make_xhtml([?XC('h1',
io_lib:format(?T("~s access rule configuration"), [SName]))] ++
case Res of
ok -> [?XREST("Submitted")];
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[access_rule_to_xhtml(Rules),
?BR,
?INPUTT("submit", "submit", "Submit")
@@ -1020,14 +1033,14 @@ process_admin(Host,
auth = {_, _Auth, AJID},
lang = Lang}) when is_list(Host) ->
Res = list_users(Host, Query, Lang, fun url_func/1),
- make_xhtml([?XCT("h1", "Users")] ++ Res, Host, Lang, AJID);
+ make_xhtml([?XCT('h1', "Users")] ++ Res, Host, Lang, AJID);
process_admin(Host,
#request{path = ["users", Diap],
auth = {_, _Auth, AJID},
lang = Lang}) when is_list(Host) ->
Res = list_users_in_diapason(Host, Diap, Lang, fun url_func/1),
- make_xhtml([?XCT("h1", "Users")] ++ Res, Host, Lang, AJID);
+ make_xhtml([?XCT('h1', "Users")] ++ Res, Host, Lang, AJID);
process_admin(Host,
#request{
@@ -1035,7 +1048,7 @@ process_admin(Host,
auth = {_, _Auth, AJID},
lang = Lang}) when is_list(Host) ->
Res = list_online_users(Host, Lang),
- make_xhtml([?XCT("h1", "Online Users")] ++ Res, Host, Lang, AJID);
+ make_xhtml([?XCT('h1', "Online Users")] ++ Res, Host, Lang, AJID);
process_admin(Host,
#request{path = ["last-activity"],
@@ -1055,18 +1068,18 @@ process_admin(Host,
_ ->
list_last_activity(Host, Lang, true, Month)
end,
- make_xhtml([?XCT("h1", "Users Last Activity")] ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ make_xhtml([?XCT('h1', "Users Last Activity")] ++
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[?CT("Period: "),
- ?XAE("select", [{"name", "period"}],
+ ?XAE('select', [?XMLATTR('name', <<"period">>)],
lists:map(
fun({O, V}) ->
Sel = if
- O == Month -> [{"selected", "selected"}];
+ O == Month -> [?XMLATTR('selected', <<"selected">>)];
true -> []
end,
- ?XAC("option",
- Sel ++ [{"value", O}], V)
+ ?XAC('option',
+ Sel ++ [?XMLATTR('value', O)], V)
end, [{"month", ?T("Last month")},
{"year", ?T("Last year")},
{"all", ?T("All activity")}])),
@@ -1082,7 +1095,7 @@ process_admin(Host,
auth = {_, _Auth, AJID},
lang = Lang}) ->
Res = get_stats(Host, Lang),
- make_xhtml([?XCT("h1", "Statistics")] ++ Res, Host, Lang, AJID);
+ make_xhtml([?XCT('h1', "Statistics")] ++ Res, Host, Lang, AJID);
process_admin(Host,
#request{path = ["user", U],
@@ -1094,7 +1107,7 @@ process_admin(Host,
Res = user_info(U, Host, Query, Lang),
make_xhtml(Res, Host, Lang, AJID);
false ->
- make_xhtml([?XCT("h1", "Not Found")], Host, Lang, AJID)
+ make_xhtml([?XCT('h1', "Not Found")], Host, Lang, AJID)
end;
process_admin(Host,
@@ -1111,7 +1124,7 @@ process_admin(Host,
lang = Lang}) ->
case search_running_node(SNode) of
false ->
- make_xhtml([?XCT("h1", "Node not found")], Host, Lang, AJID);
+ make_xhtml([?XCT('h1', "Node not found")], Host, Lang, AJID);
Node ->
Res = get_node(Host, Node, NPath, Query, Lang),
make_xhtml(Res, Host, Node, Lang, AJID)
@@ -1127,8 +1140,8 @@ process_admin(Host, #request{lang = Lang,
global -> {webadmin_page_main, [Request]};
Host -> {webadmin_page_host, [Host, Request]}
end,
- case ejabberd_hooks:run_fold(Hook, Host, [], Opts) of
- [] -> setelement(1, make_xhtml([?XC("h1", "Not Found")], Host, Lang, AJID), 404);
+ case ejabberd_hooks:run_fold(Hook, list_to_binary(Host), [], Opts) of
+ [] -> setelement(1, make_xhtml([?XC('h1', "Not Found")], Host, Lang, AJID), 404);
Res -> make_xhtml(Res, Host, Lang, AJID)
end.
@@ -1136,21 +1149,21 @@ process_admin(Host, #request{lang = Lang,
%%%% acl
acls_to_xhtml(ACLs) ->
- ?XAE("table", [],
- [?XE("tbody",
+ ?XAE('table', [],
+ [?XE('tbody',
lists:map(
fun({acl, Name, Spec} = ACL) ->
SName = atom_to_list(Name),
ID = term_to_id(ACL),
- ?XE("tr",
- [?XE("td", [?INPUT("checkbox", "selected", ID)]),
- ?XC("td", SName)] ++
+ ?XE('tr',
+ [?XE('td', [?INPUT("checkbox", "selected", ID)]),
+ ?XC('td', SName)] ++
acl_spec_to_xhtml(ID, Spec)
)
end, ACLs) ++
- [?XE("tr",
- [?X("td"),
- ?XE("td", [?INPUT("text", "namenew", "")])
+ [?XE('tr',
+ [?X('td'),
+ ?XE('td', [?INPUT("text", "namenew", "")])
] ++
acl_spec_to_xhtml("new", {user, ""})
)]
@@ -1200,16 +1213,16 @@ acl_spec_to_xhtml(ID, Spec) ->
[acl_spec_select(ID, Type), ?ACLINPUT(Str)].
acl_spec_select(ID, Opt) ->
- ?XE("td",
- [?XAE("select", [{"name", "type" ++ ID}],
+ ?XE('td',
+ [?XAE('select', [?XMLATTR('name', "type" ++ ID)],
lists:map(
fun(O) ->
Sel = if
- O == Opt -> [{"selected", "selected"}];
+ O == Opt -> [?XMLATTR('selected', <<"selected">>)];
true -> []
end,
- ?XAC("option",
- Sel ++ [{"value", atom_to_list(O)}],
+ ?XAC('option',
+ Sel ++ [?XMLATTR('value', O)],
atom_to_list(O))
end, [user, server, user_regexp, server_regexp,
node_regexp, user_glob, server_glob, node_glob, all, raw]))]).
@@ -1219,13 +1232,13 @@ acl_spec_select(ID, Opt) ->
term_to_string(T) ->
StringParagraph = lists:flatten(io_lib:format("~1000000p", [T])),
%% Remove from the string all the carriage returns characters
- {ok, StringLine, _} = regexp:gsub(StringParagraph, "\\n ", ""),
+ StringLine = re:replace(StringParagraph, "\\n ", "", [global,{return,list}]),
StringLine.
%% @spec (T::any(), Cols::integer()) -> {NumLines::integer(), Paragraph::string()}
term_to_paragraph(T, Cols) ->
Paragraph = erl_prettypr:format(erl_syntax:abstract(T), [{paper, Cols}]),
- {ok, FieldList} = regexp:split(Paragraph, "\n"),
+ FieldList = re:split(Paragraph, "\n", [{return, list}]),
NumLines = length(FieldList),
{NumLines, Paragraph}.
@@ -1290,14 +1303,20 @@ string_to_spec("user_regexp", Val) ->
string_to_spec("server_regexp", Val) ->
{server_regexp, Val};
string_to_spec("node_regexp", Val) ->
- #jid{luser = U, lserver = S, resource = ""} = jlib:string_to_jid(Val),
+ JID = exmpp_jid:parse(Val),
+ U = exmpp_jid:prep_node_as_list(JID),
+ S = exmpp_jid:prep_domain_as_list(JID),
+ undefined = exmpp_jid:resource(JID),
{node_regexp, U, S};
string_to_spec("user_glob", Val) ->
string_to_spec2(user_glob, Val);
string_to_spec("server_glob", Val) ->
{server_glob, Val};
string_to_spec("node_glob", Val) ->
- #jid{luser = U, lserver = S, resource = ""} = jlib:string_to_jid(Val),
+ JID = exmpp_jid:parse(Val),
+ U = exmpp_jid:prep_node_as_list(JID),
+ S = exmpp_jid:prep_domain_as_list(JID),
+ undefined = exmpp_jid:resource(JID),
{node_glob, U, S};
string_to_spec("all", _) ->
all;
@@ -1307,9 +1326,12 @@ string_to_spec("raw", Val) ->
NewSpec.
string_to_spec2(ACLName, Val) ->
- #jid{luser = U, lserver = S, resource = ""} = jlib:string_to_jid(Val),
+ JID = exmpp_jid:parse(Val),
+ U = exmpp_jid:prep_node_as_list(JID),
+ S = exmpp_jid:prep_domain_as_list(JID),
+ undefined = exmpp_jid:resource(JID),
case U of
- "" ->
+ undefined ->
{ACLName, S};
_ ->
{ACLName, U, S}
@@ -1327,23 +1349,23 @@ acl_parse_delete(ACLs, Query) ->
access_rules_to_xhtml(AccessRules, Lang) ->
- ?XAE("table", [],
- [?XE("tbody",
+ ?XAE('table', [],
+ [?XE('tbody',
lists:map(
fun({access, Name, Rules} = Access) ->
SName = atom_to_list(Name),
ID = term_to_id(Access),
- ?XE("tr",
- [?XE("td", [?INPUT("checkbox", "selected", ID)]),
- ?XE("td", [?AC(SName ++ "/", SName)]),
- ?XC("td", term_to_string(Rules))
+ ?XE('tr',
+ [?XE('td', [?INPUT("checkbox", "selected", ID)]),
+ ?XE('td', [?AC(SName ++ "/", SName)]),
+ ?XC('td', term_to_string(Rules))
]
)
- end, AccessRules) ++
- [?XE("tr",
- [?X("td"),
- ?XE("td", [?INPUT("text", "namenew", "")]),
- ?XE("td", [?INPUTT("submit", "addnew", "Add New")])
+ end, lists:sort(AccessRules)) ++
+ [?XE('tr',
+ [?X('td'),
+ ?XE('td', [?INPUT("text", "namenew", "")]),
+ ?XE('td', [?INPUTT("submit", "addnew", "Add New")])
]
)]
)]).
@@ -1398,9 +1420,9 @@ access_rule_to_xhtml(Rules) ->
SACL = atom_to_list(ACL),
SAccess ++ "\s\t" ++ SACL ++ "\n"
end, Rules),
- ?XAC("textarea", [{"name", "rules"},
- {"rows", "16"},
- {"cols", "80"}],
+ ?XAC('textarea', [?XMLATTR('name', <<"rules">>),
+ ?XMLATTR('rows', <<"16">>),
+ ?XMLATTR('cols', <<"80">>)],
Text).
parse_access_rule(Text) ->
@@ -1435,24 +1457,24 @@ list_vhosts(Lang, JID) ->
list_vhosts2(Lang, Hosts) ->
SHosts = lists:sort(Hosts),
- [?XE("table",
- [?XE("thead",
- [?XE("tr",
- [?XCT("td", "Host"),
- ?XCT("td", "Registered Users"),
- ?XCT("td", "Online Users")
+ [?XE('table',
+ [?XE('thead',
+ [?XE('tr',
+ [?XCT('td', "Host"),
+ ?XCT('td', "Registered Users"),
+ ?XCT('td', "Online Users")
])]),
- ?XE("tbody",
+ ?XE('tbody',
lists:map(
fun(Host) ->
OnlineUsers =
- length(ejabberd_sm:get_vh_session_list(Host)),
+ length(ejabberd_sm:get_vh_session_list(list_to_binary(Host))),
RegisteredUsers =
ejabberd_auth:get_vh_registered_users_number(Host),
- ?XE("tr",
- [?XE("td", [?AC("../server/" ++ Host ++ "/", Host)]),
- ?XC("td", pretty_string_int(RegisteredUsers)),
- ?XC("td", pretty_string_int(OnlineUsers))
+ ?XE('tr',
+ [?XE('td', [?AC("../server/" ++ Host ++ "/", Host)]),
+ ?XC('td', pretty_string_int(RegisteredUsers)),
+ ?XC('td', pretty_string_int(OnlineUsers))
])
end, SHosts)
)])].
@@ -1490,23 +1512,23 @@ list_users(Host, Query, Lang, URLFunc) ->
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
- [?XE("table",
- [?XE("tr",
- [?XC("td", ?T("User") ++ ":"),
- ?XE("td", [?INPUT("text", "newusername", "")]),
- ?XE("td", [?C([" @ ", Host])])
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
+ [?XE('table',
+ [?XE('tr',
+ [?XC('td', ?T("User") ++ ":"),
+ ?XE('td', [?INPUT("text", "newusername", "")]),
+ ?XE('td', [?C([" @ ", Host])])
]),
- ?XE("tr",
- [?XC("td", ?T("Password") ++ ":"),
- ?XE("td", [?INPUT("password", "newuserpassword", "")]),
- ?X("td")
+ ?XE('tr',
+ [?XC('td', ?T("Password") ++ ":"),
+ ?XE('td', [?INPUT("password", "newuserpassword", "")]),
+ ?X('td')
]),
- ?XE("tr",
- [?X("td"),
- ?XAE("td", [{"class", "alignright"}],
+ ?XE('tr',
+ [?X('td'),
+ ?XAE('td', [?XMLATTR('class', <<"alignright">>)],
[?INPUTT("submit", "addnewuser", "Add User")]),
- ?X("td")
+ ?X('td')
])]),
?P] ++
FUsers)].
@@ -1519,16 +1541,19 @@ list_users_parse_query(Query, Host) ->
lists:keysearch("newusername", 1, Query),
{value, {_, Password}} =
lists:keysearch("newuserpassword", 1, Query),
- case jlib:string_to_jid(Username++"@"++Host) of
- error ->
- error;
- #jid{user = User, server = Server} ->
- case ejabberd_auth:try_register(User, Server, Password) of
- {error, _Reason} ->
- error;
- _ ->
- ok
- end
+ try
+ JID = exmpp_jid:parse(Username++"@"++Host),
+ User = exmpp_jid:node_as_list(JID),
+ Server = exmpp_jid:domain_as_list(JID),
+ case ejabberd_auth:try_register(User, Server, Password) of
+ {error, _Reason} ->
+ error;
+ _ ->
+ ok
+ end
+ catch
+ _ ->
+ error
end;
false ->
nothing
@@ -1538,29 +1563,35 @@ list_users_parse_query(Query, Host) ->
list_users_in_diapason(Host, Diap, Lang, URLFunc) ->
Users = ejabberd_auth:get_vh_registered_users(Host),
SUsers = lists:sort([{S, U} || {U, S} <- Users]),
- {ok, [S1, S2]} = regexp:split(Diap, "-"),
+ [S1, S2] = re:split(Diap, "-", [{return, list}]),
N1 = list_to_integer(S1),
N2 = list_to_integer(S2),
Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
[list_given_users(Sub, "../../", Lang, URLFunc)].
list_given_users(Users, Prefix, Lang, URLFunc) ->
- ?XE("table",
- [?XE("thead",
- [?XE("tr",
- [?XCT("td", "User"),
- ?XCT("td", "Offline Messages"),
- ?XCT("td", "Last Activity")])]),
- ?XE("tbody",
+ ?XE('table',
+ [?XE('thead',
+ [?XE('tr',
+ [?XCT('td', "User"),
+ ?XCT('td', "Offline Messages"),
+ ?XCT('td', "Last Activity")])]),
+ ?XE('tbody',
lists:map(
fun(_SU = {Server, User}) ->
- US = {User, Server},
- QueueLen = length(mnesia:dirty_read({offline_msg, US})),
- FQueueLen = [?AC(URLFunc({users_queue, Prefix,
- User, Server}),
- pretty_string_int(QueueLen))],
+ ServerB = list_to_binary(Server),
+ UserB = list_to_binary(User),
+ US = {UserB, ServerB},
+ FQueueLen = try
+ QueueLen = length(mnesia:dirty_read({offline_msg, US})),
+ [?AC(URLFunc({users_queue, Prefix,
+ User, Server}),
+ pretty_string_int(QueueLen))]
+ catch
+ _:_ -> [#xmlcdata{cdata = <<"Can't access the offline messages storage.">>}]
+ end,
FLast =
- case ejabberd_sm:get_user_resources(User, Server) of
+ case ejabberd_sm:get_user_resources(UserB, ServerB) of
[] ->
case mnesia:dirty_read({last_activity, US}) of
[] ->
@@ -1580,22 +1611,22 @@ list_given_users(Users, Prefix, Lang, URLFunc) ->
_ ->
?T("Online")
end,
- ?XE("tr",
- [?XE("td",
+ ?XE('tr',
+ [?XE('td',
[?AC(URLFunc({user, Prefix,
ejabberd_http:url_encode(User),
Server}),
us_to_list(US))]),
- ?XE("td", FQueueLen),
- ?XC("td", FLast)])
+ ?XE('td', FQueueLen),
+ ?XC('td', FLast)])
end, Users)
)]).
us_to_list({User, Server}) ->
- jlib:jid_to_string({User, Server, ""}).
+ exmpp_jid:to_list(User, Server, undefined).
su_to_list({Server, User}) ->
- jlib:jid_to_string({User, Server, ""}).
+ exmpp_jid:to_list(User, Server, undefined).
%%%==================================
%%%% get_stats
@@ -1606,56 +1637,58 @@ get_stats(global, Lang) ->
S2SConns = ejabberd_s2s:dirty_get_connections(),
S2SConnections = length(S2SConns),
S2SServers = length(lists:usort([element(2, C) || C <- S2SConns])),
- [?XAE("table", [],
- [?XE("tbody",
- [?XE("tr", [?XCT("td", "Registered Users:"),
- ?XC("td", pretty_string_int(RegisteredUsers))]),
- ?XE("tr", [?XCT("td", "Online Users:"),
- ?XC("td", pretty_string_int(OnlineUsers))]),
- ?XE("tr", [?XCT("td", "Outgoing s2s Connections:"),
- ?XC("td", pretty_string_int(S2SConnections))]),
- ?XE("tr", [?XCT("td", "Outgoing s2s Servers:"),
- ?XC("td", pretty_string_int(S2SServers))])
+ [?XAE('table', [],
+ [?XE('tbody',
+ [?XE('tr', [?XCT('td', "Registered Users:"),
+ ?XC('td', pretty_string_int(RegisteredUsers))]),
+ ?XE('tr', [?XCT('td', "Online Users:"),
+ ?XC('td', pretty_string_int(OnlineUsers))]),
+ ?XE('tr', [?XCT('td', "Outgoing s2s Connections:"),
+ ?XC('td', pretty_string_int(S2SConnections))]),
+ ?XE('tr', [?XCT('td', "Outgoing s2s Servers:"),
+ ?XC('td', pretty_string_int(S2SServers))])
])
])];
get_stats(Host, Lang) ->
- OnlineUsers = length(ejabberd_sm:get_vh_session_list(Host)),
+ OnlineUsers = length(ejabberd_sm:get_vh_session_list(list_to_binary(Host))),
RegisteredUsers = ejabberd_auth:get_vh_registered_users_number(Host),
- [?XAE("table", [],
- [?XE("tbody",
- [?XE("tr", [?XCT("td", "Registered Users:"),
- ?XC("td", pretty_string_int(RegisteredUsers))]),
- ?XE("tr", [?XCT("td", "Online Users:"),
- ?XC("td", pretty_string_int(OnlineUsers))])
+ [?XAE('table', [],
+ [?XE('tbody',
+ [?XE('tr', [?XCT('td', "Registered Users:"),
+ ?XC('td', pretty_string_int(RegisteredUsers))]),
+ ?XE('tr', [?XCT('td', "Online Users:"),
+ ?XC('td', pretty_string_int(OnlineUsers))])
])
])].
list_online_users(Host, _Lang) ->
- Users = [{S, U} || {U, S, _R} <- ejabberd_sm:get_vh_session_list(Host)],
+ Users = [{S, U} || {U, S, _R} <- ejabberd_sm:get_vh_session_list(list_to_binary(Host))],
SUsers = lists:usort(Users),
lists:flatmap(
fun({_S, U} = SU) ->
- [?AC("../user/" ++ ejabberd_http:url_encode(U) ++ "/",
+ [?AC("../user/" ++ ejabberd_http:url_encode(binary_to_list(U)) ++ "/",
su_to_list(SU)),
?BR]
end, SUsers).
user_info(User, Server, Query, Lang) ->
- LServer = jlib:nameprep(Server),
- US = {jlib:nodeprep(User), LServer},
+ UserB = list_to_binary(User),
+ ServerB = list_to_binary(Server),
+ LServer = exmpp_stringprep:nameprep(Server),
+ US = {exmpp_stringprep:nodeprep(User), LServer},
Res = user_parse_query(User, Server, Query),
- Resources = ejabberd_sm:get_user_resources(User, Server),
+ Resources = ejabberd_sm:get_user_resources(UserB, ServerB),
FResources =
case Resources of
[] ->
[?CT("None")];
_ ->
- [?XE("ul",
+ [?XE('ul',
lists:map(fun(R) ->
FIP = case ejabberd_sm:get_user_info(
- User, Server, R) of
+ UserB, ServerB, R) of
offline ->
"";
[{node, Node}, {conn, Conn}, {ip, {IP, Port}}] ->
@@ -1675,23 +1708,23 @@ user_info(User, Server, Query, Lang) ->
++ "#" ++ atom_to_list(Node)
++ ")"
end,
- ?LI([?C(R ++ FIP)])
+ ?LI([?C(binary_to_list(R) ++ FIP)])
end, lists:sort(Resources)))]
end,
Password = ejabberd_auth:get_password_s(User, Server),
FPassword = [?INPUT("password", "password", Password), ?C(" "),
?INPUTT("submit", "chpassword", "Change Password")],
- UserItems = ejabberd_hooks:run_fold(webadmin_user, LServer, [],
+ UserItems = ejabberd_hooks:run_fold(webadmin_user, list_to_binary(LServer), [],
[User, Server, Lang]),
- [?XC("h1", ?T("User ") ++ us_to_list(US))] ++
+ [?XC('h1', ?T("User ") ++ us_to_list(US))] ++
case Res of
ok -> [?XREST("Submitted")];
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
- [?XCT("h3", "Connected Resources:")] ++ FResources ++
- [?XCT("h3", "Password:")] ++ FPassword ++
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
+ [?XCT('h3', "Connected Resources:")] ++ FResources ++
+ [?XCT('h3', "Password:")] ++ FPassword ++
UserItems ++
[?P, ?INPUTT("submit", "removeuser", "Remove User")])].
@@ -1719,7 +1752,7 @@ user_parse_query1("removeuser", User, Server, _Query) ->
ejabberd_auth:remove_user(User, Server),
ok;
user_parse_query1(Action, User, Server, Query) ->
- case ejabberd_hooks:run_fold(webadmin_user_parse_query, Server, [], [Action, User, Server, Query]) of
+ case ejabberd_hooks:run_fold(webadmin_user_parse_query, list_to_binary(Server), [], [Action, User, Server, Query]) of
[] -> nothing;
Res -> Res
end.
@@ -1767,13 +1800,13 @@ list_last_activity(Host, Lang, Integral, Period) ->
lists:duplicate(Left, 0)
end,
Max = lists:max(Hist),
- [?XAE("ol",
- [{"id", "lastactivity"}, {"start", "0"}],
- [?XAE("li",
- [{"style",
+ [?XAE('ol',
+ [?XMLATTR('id', <<"lastactivity">>), ?XMLATTR('start', <<"0">>)],
+ [?XAE('li',
+ [?XMLATTR('style',
"width:" ++ integer_to_list(
- trunc(90 * V / Max)) ++ "%;"}],
- [{xmlcdata, pretty_string_int(V)}])
+ trunc(90 * V / Max)) ++ "%;")],
+ [#xmlcdata{cdata = list_to_binary(pretty_string_int(V))}])
|| V <- Hist ++ Tail])]
end
end.
@@ -1812,7 +1845,7 @@ get_nodes(Lang) ->
RunningNodes == [] ->
?CT("None");
true ->
- ?XE("ul",
+ ?XE('ul',
lists:map(
fun(N) ->
S = atom_to_list(N),
@@ -1823,17 +1856,17 @@ get_nodes(Lang) ->
StoppedNodes == [] ->
?CT("None");
true ->
- ?XE("ul",
+ ?XE('ul',
lists:map(
fun(N) ->
S = atom_to_list(N),
?LI([?C(S)])
end, lists:sort(StoppedNodes)))
end,
- [?XCT("h1", "Nodes"),
- ?XCT("h3", "Running Nodes"),
+ [?XCT('h1', "Nodes"),
+ ?XCT('h3', "Running Nodes"),
FRN,
- ?XCT("h3", "Stopped Nodes"),
+ ?XCT('h3', "Stopped Nodes"),
FSN].
search_running_node(SNode) ->
@@ -1853,37 +1886,37 @@ get_node(global, Node, [], Query, Lang) ->
Res = node_parse_query(Node, Query),
Base = get_base_path(global, Node),
MenuItems2 = make_menu_items(global, Node, Base, Lang),
- [?XC("h1", ?T("Node ") ++ atom_to_list(Node))] ++
+ [?XC('h1', ?T("Node ") ++ atom_to_list(Node))] ++
case Res of
ok -> [?XREST("Submitted")];
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XE("ul",
+ [?XE('ul',
[?LI([?ACT(Base ++ "db/", "Database")]),
?LI([?ACT(Base ++ "backup/", "Backup")]),
?LI([?ACT(Base ++ "ports/", "Listened Ports")]),
?LI([?ACT(Base ++ "stats/", "Statistics")]),
?LI([?ACT(Base ++ "update/", "Update")])
] ++ MenuItems2),
- ?XAE("form", [{"action", ""}, {"method", "post"}],
- [?INPUTT("submit", "restart", "Restart"),
+ ?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
+ [?INPUTT('submit', "restart", "Restart"),
?C(" "),
- ?INPUTT("submit", "stop", "Stop")])
+ ?INPUTT('submit', "stop", "Stop")])
];
get_node(Host, Node, [], _Query, Lang) ->
Base = get_base_path(Host, Node),
MenuItems2 = make_menu_items(Host, Node, Base, Lang),
- [?XC("h1", ?T("Node ") ++ atom_to_list(Node)),
- ?XE("ul",
+ [?XC('h1', ?T("Node ") ++ atom_to_list(Node)),
+ ?XE('ul',
[?LI([?ACT(Base ++ "modules/", "Modules")])] ++ MenuItems2)
];
get_node(global, Node, ["db"], Query, Lang) ->
case rpc:call(Node, mnesia, system_info, [tables]) of
{badrpc, _Reason} ->
- [?XCT("h1", "RPC Call Error")];
+ [?XCT('h1', "RPC Call Error")];
Tables ->
ResS = case node_db_parse_query(Node, Tables, Query) of
nothing -> [];
@@ -1914,32 +1947,32 @@ get_node(global, Node, ["db"], Query, Lang) ->
_ ->
{unknown, 0, 0}
end,
- ?XE("tr",
- [?XC("td", STable),
- ?XE("td", [db_storage_select(
+ ?XE('tr',
+ [?XC('td', STable),
+ ?XE('td', [db_storage_select(
STable, Type, Lang)]),
- ?XAC("td", [{"class", "alignright"}],
- pretty_string_int(Size)),
- ?XAC("td", [{"class", "alignright"}],
- pretty_string_int(Memory))
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
+ pretty_string_int(Size)),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
+ pretty_string_int(Memory))
])
end, STables),
- [?XC("h1", ?T("Database Tables at ") ++ atom_to_list(Node))] ++
+ [?XC('h1', ?T("Database Tables at ") ++ atom_to_list(Node))] ++
ResS ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
- [?XAE("table", [],
- [?XE("thead",
- [?XE("tr",
- [?XCT("td", "Name"),
- ?XCT("td", "Storage Type"),
- ?XCT("td", "Elements"), %% Elements/items/records inserted in the table
- ?XCT("td", "Memory") %% Words or Bytes allocated to the table on this node
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
+ [?XAE('table', [],
+ [?XE('thead',
+ [?XE('tr',
+ [?XCT('td', "Name"),
+ ?XCT('td', "Storage Type"),
+ ?XCT('td', "Elements"), %% Elements/items/records inserted in the table
+ ?XCT('td', "Memory") %% Words or Bytes allocated to the table on this node
])]),
- ?XE("tbody",
+ ?XE('tbody',
Rows ++
- [?XE("tr",
- [?XAE("td", [{"colspan", "4"},
- {"class", "alignright"}],
+ [?XE('tr',
+ [?XAE('td', [?XMLATTR('colspan', <<"4">>),
+ ?XMLATTR('class', <<"alignright">>)],
[?INPUTT("submit", "submit",
"Submit")])
])]
@@ -1953,83 +1986,83 @@ get_node(global, Node, ["backup"], Query, Lang) ->
ok -> [?XREST("Submitted")];
{error, Error} -> [?XRES(?T("Error") ++": " ++ io_lib:format("~p", [Error]))]
end,
- [?XC("h1", ?T("Backup of ") ++ atom_to_list(Node))] ++
+ [?XC('h1', ?T("Backup of ") ++ atom_to_list(Node))] ++
ResS ++
- [?XCT("p", "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."),
- ?XAE("form", [{"action", ""}, {"method", "post"}],
- [?XAE("table", [],
- [?XE("tbody",
- [?XE("tr",
- [?XCT("td", "Store binary backup:"),
- ?XE("td", [?INPUT("text", "storepath",
- filename:join(HomeDir, "ejabberd.backup"))]),
- ?XE("td", [?INPUTT("submit", "store",
+ [?XCT('p', "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."),
+ ?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
+ [?XAE('table', [],
+ [?XE('tbody',
+ [?XE('tr',
+ [?XCT('td', "Store binary backup:"),
+ ?XE('td', [?INPUT("text", "storepath",
+ filename:join(HomeDir, "ejabberd.backup"))]),
+ ?XE('td', [?INPUTT("submit", "store",
"OK")])
]),
- ?XE("tr",
- [?XCT("td", "Restore binary backup immediately:"),
- ?XE("td", [?INPUT("text", "restorepath",
- filename:join(HomeDir, "ejabberd.backup"))]),
- ?XE("td", [?INPUTT("submit", "restore",
+ ?XE('tr',
+ [?XCT('td', "Restore binary backup immediately:"),
+ ?XE('td', [?INPUT("text", "restorepath",
+ filename:join(HomeDir, "ejabberd.backup"))]),
+ ?XE('td', [?INPUTT("submit", "restore",
"OK")])
]),
- ?XE("tr",
- [?XCT("td",
+ ?XE('tr',
+ [?XCT('td',
"Restore binary backup after next ejabberd restart (requires less memory):"),
- ?XE("td", [?INPUT("text", "fallbackpath",
- filename:join(HomeDir, "ejabberd.backup"))]),
- ?XE("td", [?INPUTT("submit", "fallback",
+ ?XE('td', [?INPUT("text", "fallbackpath",
+ filename:join(HomeDir, "ejabberd.backup"))]),
+ ?XE('td', [?INPUTT("submit", "fallback",
+ "OK")])
+ ]),
+ ?XE('tr',
+ [?XCT('td', "Store plain text backup:"),
+ ?XE('td', [?INPUT("text", "dumppath",
+ filename:join(HomeDir, "ejabberd.dump"))]),
+ ?XE('td', [?INPUTT("submit", "dump",
+ "OK")])
+ ]),
+ ?XE('tr',
+ [?XCT('td', "Restore plain text backup immediately:"),
+ ?XE('td', [?INPUT("text", "loadpath",
+ filename:join(HomeDir, "ejabberd.dump"))]),
+ ?XE('td', [?INPUTT("submit", "load",
"OK")])
]),
?XE("tr",
- [?XCT("td", "Store plain text backup:"),
- ?XE("td", [?INPUT("text", "dumppath",
- filename:join(HomeDir, "ejabberd.dump"))]),
- ?XE("td", [?INPUTT("submit", "dump",
+ [?XCT("td", "Import users data from a PIEFXIS file (XEP-0227):"),
+ ?XE("td", [?INPUT("text", "import_piefxis_filepath",
+ filename:join(HomeDir, "users.xml"))]),
+ ?XE("td", [?INPUTT("submit", "import_piefxis_file",
"OK")])
]),
?XE("tr",
- [?XCT("td", "Restore plain text backup immediately:"),
- ?XE("td", [?INPUT("text", "loadpath",
- filename:join(HomeDir, "ejabberd.dump"))]),
- ?XE("td", [?INPUTT("submit", "load",
+ [?XCT("td", "Export data of all users in the server to PIEFXIS files (XEP-0227):"),
+ ?XE("td", [?INPUT("text", "export_piefxis_dirpath",
+ HomeDir)]),
+ ?XE("td", [?INPUTT("submit", "export_piefxis_dir",
+ "OK")])
+ ]),
+ ?XE("tr",
+ [?XE("td", [?CT("Export data of users in a host to PIEFXIS files (XEP-0227):"),
+ ?C(" "),
+ ?INPUT("text", "export_piefxis_host_dirhost", ?MYNAME)]),
+ ?XE("td", [?INPUT("text", "export_piefxis_host_dirpath", HomeDir)]),
+ ?XE("td", [?INPUTT("submit", "export_piefxis_host_dir",
+ "OK")])
+ ]),
+ ?XE("tr",
+ [?XCT("td", "Import user data from jabberd14 spool file:"),
+ ?XE("td", [?INPUT("text", "import_filepath",
+ filename:join(HomeDir, "user1.xml"))]),
+ ?XE("td", [?INPUTT("submit", "import_file",
+ "OK")])
+ ]),
+ ?XE("tr",
+ [?XCT("td", "Import users data from jabberd14 spool directory:"),
+ ?XE("td", [?INPUT("text", "import_dirpath",
+ "/var/spool/jabber/")]),
+ ?XE("td", [?INPUTT("submit", "import_dir",
"OK")])
- ]),
- ?XE("tr",
- [?XCT("td", "Import users data from a PIEFXIS file (XEP-0227):"),
- ?XE("td", [?INPUT("text", "import_piefxis_filepath",
- filename:join(HomeDir, "users.xml"))]),
- ?XE("td", [?INPUTT("submit", "import_piefxis_file",
- "OK")])
- ]),
- ?XE("tr",
- [?XCT("td", "Export data of all users in the server to PIEFXIS files (XEP-0227):"),
- ?XE("td", [?INPUT("text", "export_piefxis_dirpath",
- HomeDir)]),
- ?XE("td", [?INPUTT("submit", "export_piefxis_dir",
- "OK")])
- ]),
- ?XE("tr",
- [?XE("td", [?CT("Export data of users in a host to PIEFXIS files (XEP-0227):"),
- ?C(" "),
- ?INPUT("text", "export_piefxis_host_dirhost", ?MYNAME)]),
- ?XE("td", [?INPUT("text", "export_piefxis_host_dirpath", HomeDir)]),
- ?XE("td", [?INPUTT("submit", "export_piefxis_host_dir",
- "OK")])
- ]),
- ?XE("tr",
- [?XCT("td", "Import user data from jabberd14 spool file:"),
- ?XE("td", [?INPUT("text", "import_filepath",
- filename:join(HomeDir, "user1.xml"))]),
- ?XE("td", [?INPUTT("submit", "import_file",
- "OK")])
- ]),
- ?XE("tr",
- [?XCT("td", "Import users data from jabberd14 spool directory:"),
- ?XE("td", [?INPUT("text", "import_dirpath",
- "/var/spool/jabber/")]),
- ?XE("td", [?INPUTT("submit", "import_dir",
- "OK")])
])
])
])])];
@@ -2059,7 +2092,7 @@ get_node(global, Node, ["ports"], Query, Lang) ->
{error, ReasonT} -> [?XRES(?T("Error") ++ ": " ++ ReasonT)];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[node_ports_to_xhtml(NewPorts, Lang)])
];
@@ -2083,7 +2116,7 @@ get_node(Host, Node, ["modules"], Query, Lang) when is_list(Host) ->
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[node_modules_to_xhtml(NewModules, Lang)])
];
@@ -2102,29 +2135,29 @@ get_node(global, Node, ["stats"], _Query, Lang) ->
TransactionsLogged =
rpc:call(Node, mnesia, system_info, [transaction_log_writes]),
- [?XC("h1", io_lib:format(?T("Statistics of ~p"), [Node])),
- ?XAE("table", [],
- [?XE("tbody",
- [?XE("tr", [?XCT("td", "Uptime:"),
- ?XAC("td", [{"class", "alignright"}],
+ [?XC('h1', io_lib:format(?T("Statistics of ~p"), [Node])),
+ ?XAE('table', [],
+ [?XE('tbody',
+ [?XE('tr', [?XCT('td', "Uptime:"),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
UpTimeS)]),
- ?XE("tr", [?XCT("td", "CPU Time:"),
- ?XAC("td", [{"class", "alignright"}],
+ ?XE('tr', [?XCT('td', "CPU Time:"),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
CPUTimeS)]),
- ?XE("tr", [?XCT("td", "Online Users:"),
- ?XAC("td", [{"class", "alignright"}],
+ ?XE('tr', [?XCT('td', "Online Users:"),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
pretty_string_int(OnlineUsers))]),
- ?XE("tr", [?XCT("td", "Transactions Committed:"),
- ?XAC("td", [{"class", "alignright"}],
+ ?XE('tr', [?XCT('td', "Transactions Committed:"),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
pretty_string_int(TransactionsCommitted))]),
- ?XE("tr", [?XCT("td", "Transactions Aborted:"),
- ?XAC("td", [{"class", "alignright"}],
+ ?XE('tr', [?XCT('td', "Transactions Aborted:"),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
pretty_string_int(TransactionsAborted))]),
- ?XE("tr", [?XCT("td", "Transactions Restarted:"),
- ?XAC("td", [{"class", "alignright"}],
+ ?XE('tr', [?XCT('td', "Transactions Restarted:"),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
pretty_string_int(TransactionsRestarted))]),
- ?XE("tr", [?XCT("td", "Transactions Logged:"),
- ?XAC("td", [{"class", "alignright"}],
+ ?XE('tr', [?XCT('td', "Transactions Logged:"),
+ ?XAC('td', [?XMLATTR('class', <<"alignright">>)],
pretty_string_int(TransactionsLogged))])
])
])];
@@ -2146,7 +2179,8 @@ get_node(global, Node, ["update"], Query, Lang) ->
BeamString = atom_to_list(Beam),
?LI([
?INPUT("checkbox", "selected", BeamString),
- %%?XA("input", [{"checked", ""}, %% Selected by default
+ %% If we want checkboxes selected by default:
+ %%?XA("input", [{"checked", ""},
%% {"type", "checkbox"},
%% {"name", "selected"},
%% {"value", BeamString}]),
@@ -2155,29 +2189,32 @@ get_node(global, Node, ["update"], Query, Lang) ->
UpdatedBeams),
SelectButtons =
[?BR,
- ?INPUTATTRS("button", "selectall", "Select All",
- [{"onClick", "selectAll()"}]),
+ ?INPUTATTRS(<<"button">>, <<"selectall">>,
+ <<"Select All">>,
+ [?XMLATTR('onClick', <<"selectAll()">>)]),
?C(" "),
- ?INPUTATTRS("button", "unselectall", "Unselect All",
- [{"onClick", "unSelectAll()"}])],
+ ?INPUTATTRS(<<"button">>, <<"unselectall">>,
+ <<"Unselect All">>,
+ [?XMLATTR('onClick', <<"unSelectAll()">>)])],
%%?XE("ul", BeamsLis)
- ?XAE("ul", [{"class", "nolistyle"}], BeamsLis ++ SelectButtons)
+ ?XAE('ul', [?XMLATTR('class', <<"noliststyle">>)],
+ BeamsLis ++ SelectButtons)
end,
- FmtScript = ?XC("pre", io_lib:format("~p", [Script])),
- FmtLowLevelScript = ?XC("pre", io_lib:format("~p", [LowLevelScript])),
- [?XC("h1", ?T("Update ") ++ atom_to_list(Node))] ++
+ FmtScript = ?XC('pre', io_lib:format("~p", [Script])),
+ FmtLowLevelScript = ?XC('pre', io_lib:format("~p", [LowLevelScript])),
+ [?XC('h1', ?T("Update ") ++ atom_to_list(Node))] ++
case Res of
ok -> [?XREST("Submitted")];
error -> [?XREST("Bad format")];
nothing -> []
end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
+ [?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
[
- ?XCT("h2", "Update plan"),
- ?XCT("h3", "Modified modules"), Mods,
- ?XCT("h3", "Update script"), FmtScript,
- ?XCT("h3", "Low level update script"), FmtLowLevelScript,
- ?XCT("h3", "Script check"), ?XC("pre", atom_to_list(Check)),
+ ?XCT('h2', "Update plan"),
+ ?XCT('h3', "Modified modules"), Mods,
+ ?XCT('h3', "Update script"), FmtScript,
+ ?XCT('h3', "Low level update script"), FmtLowLevelScript,
+ ?XCT('h3', "Script check"), ?XC("pre", atom_to_list(Check)),
?BR,
?INPUTT("submit", "update", "Update")
])
@@ -2188,8 +2225,8 @@ get_node(Host, Node, NPath, Query, Lang) ->
global -> {webadmin_page_node, [Node, NPath, Query, Lang]};
Host -> {webadmin_page_hostnode, [Host, Node, NPath, Query, Lang]}
end,
- case ejabberd_hooks:run_fold(Hook, Host, [], Opts) of
- [] -> [?XC("h1", "Not Found")];
+ case ejabberd_hooks:run_fold(Hook, list_to_binary(Host), [], Opts) of
+ [] -> [?XC('h1', "Not Found")];
Res -> Res
end.
@@ -2221,15 +2258,15 @@ node_parse_query(Node, Query) ->
db_storage_select(ID, Opt, Lang) ->
- ?XAE("select", [{"name", "table" ++ ID}],
+ ?XAE('select', [?XMLATTR('name', "table" ++ ID)],
lists:map(
fun({O, Desc}) ->
Sel = if
- O == Opt -> [{"selected", "selected"}];
+ O == Opt -> [?XMLATTR('selected', <<"selected">>)];
true -> []
end,
- ?XACT("option",
- Sel ++ [{"value", atom_to_list(O)}],
+ ?XACT('option',
+ Sel ++ [?XMLATTR('value', O)],
Desc)
end, [{ram_copies, "RAM copy"},
{disc_copies, "RAM and disc copy"},
@@ -2342,16 +2379,16 @@ node_backup_parse_query(Node, Query) ->
"import_piefxis_file", "export_piefxis_dir", "export_piefxis_host_dir"]).
node_ports_to_xhtml(Ports, Lang) ->
- ?XAE("table", [{"class", "withtextareas"}],
- [?XE("thead",
- [?XE("tr",
- [?XCT("td", "Port"),
- ?XCT("td", "IP"),
- ?XCT("td", "Protocol"),
- ?XCT("td", "Module"),
- ?XCT("td", "Options")
+ ?XAE('table', [?XMLATTR('class', <<"withtextareas">>)],
+ [?XE('thead',
+ [?XE('tr',
+ [?XCT('td', "Port"),
+ ?XCT('td', "IP"),
+ ?XCT('td', "Protocol"),
+ ?XCT('td', "Module"),
+ ?XCT('td', "Options")
])]),
- ?XE("tbody",
+ ?XE('tbody',
lists:map(
fun({PortIP, Module, Opts} = _E) ->
{_Port, SPort, _TIP, SIP, SSPort, NetProt, OptsClean} =
@@ -2359,42 +2396,42 @@ node_ports_to_xhtml(Ports, Lang) ->
SModule = atom_to_list(Module),
{NumLines, SOptsClean} = term_to_paragraph(OptsClean, 40),
%%ID = term_to_id(E),
- ?XE("tr",
- [?XAE("td", [{"size", "6"}], [?C(SPort)]),
- ?XAE("td", [{"size", "15"}], [?C(SIP)]),
- ?XAE("td", [{"size", "4"}], [?C(atom_to_list(NetProt))]),
- ?XE("td", [?INPUTS("text", "module" ++ SSPort,
+ ?XE('tr',
+ [?XAE('td', [?XMLATTR('size', <<"6">>)], [?C(SPort)]),
+ ?XAE('td', [?XMLATTR('size', <<"15">>)], [?C(SIP)]),
+ ?XAE('td', [?XMLATTR('size', <<"4">>)], [?C(atom_to_list(NetProt))]),
+ ?XE('td', [?INPUTS("text", "module" ++ SSPort,
SModule, "15")]),
- ?XE("td", [?TEXTAREA("opts" ++ SSPort, integer_to_list(NumLines), "35", SOptsClean)]),
- ?XE("td", [?INPUTT("submit", "add" ++ SSPort,
+ ?XE('td', [?TEXTAREA("opts" ++ SSPort, integer_to_list(NumLines), "35", SOptsClean)]),
+ ?XE('td', [?INPUTT("submit", "add" ++ SSPort,
"Update")]),
- ?XE("td", [?INPUTT("submit", "delete" ++ SSPort,
+ ?XE('td', [?INPUTT("submit", "delete" ++ SSPort,
"Delete")])
]
)
end, Ports) ++
- [?XE("tr",
- [?XE("td", [?INPUTS("text", "portnew", "", "6")]),
- ?XE("td", [?INPUTS("text", "ipnew", "0.0.0.0", "15")]),
+ [?XE('tr',
+ [?XE('td', [?INPUTS("text", "portnew", "", "6")]),
+ ?XE('td', [?INPUTS("text", "ipnew", "0.0.0.0", "15")]),
?XE("td", [make_netprot_html("tcp")]),
- ?XE("td", [?INPUTS("text", "modulenew", "", "15")]),
- ?XE("td", [?TEXTAREA("optsnew", "2", "35", "[]")]),
- ?XAE("td", [{"colspan", "2"}],
+ ?XE('td', [?INPUTS("text", "modulenew", "", "15")]),
+ ?XE('td', [?TEXTAREA("optsnew", "2", "35", "[]")]),
+ ?XAE('td', [?XMLATTR("colspan", "2")],
[?INPUTT("submit", "addnew", "Add New")])
]
)]
)]).
make_netprot_html(NetProt) ->
- ?XAE("select", [{"name", "netprotnew"}],
+ ?XAE('select', [?XMLATTR('name', "netprotnew")],
lists:map(
fun(O) ->
Sel = if
- O == NetProt -> [{"selected", "selected"}];
+ O == NetProt -> [?XMLATTR('selected', <<"selected">>)];
true -> []
end,
- ?XAC("option",
- Sel ++ [{"value", O}],
+ ?XAC('option',
+ Sel ++ [?XMLATTR('value', O)],
O)
end, ["tcp", "udp"])).
@@ -2472,32 +2509,32 @@ node_ports_parse_query(Node, Ports, Query) ->
end.
node_modules_to_xhtml(Modules, Lang) ->
- ?XAE("table", [{"class", "withtextareas"}],
- [?XE("thead",
- [?XE("tr",
- [?XCT("td", "Module"),
- ?XCT("td", "Options")
+ ?XAE('table', [?XMLATTR('class', <<"withtextareas">>)],
+ [?XE('thead',
+ [?XE('tr',
+ [?XCT('td', "Module"),
+ ?XCT('td', "Options")
])]),
- ?XE("tbody",
+ ?XE('tbody',
lists:map(
fun({Module, Opts} = _E) ->
SModule = atom_to_list(Module),
{NumLines, SOpts} = term_to_paragraph(Opts, 40),
%%ID = term_to_id(E),
- ?XE("tr",
- [?XC("td", SModule),
- ?XE("td", [?TEXTAREA("opts" ++ SModule, integer_to_list(NumLines), "40", SOpts)]),
- ?XE("td", [?INPUTT("submit", "restart" ++ SModule,
+ ?XE('tr',
+ [?XC('td', SModule),
+ ?XE('td', [?TEXTAREA("opts" ++ SModule, integer_to_list(NumLines), "40", SOpts)]),
+ ?XE('td', [?INPUTT("submit", "restart" ++ SModule,
"Restart")]),
- ?XE("td", [?INPUTT("submit", "stop" ++ SModule,
+ ?XE('td', [?INPUTT("submit", "stop" ++ SModule,
"Stop")])
]
)
end, Modules) ++
- [?XE("tr",
- [?XE("td", [?INPUT("text", "modulenew", "")]),
- ?XE("td", [?TEXTAREA("optsnew", "2", "40", "[]")]),
- ?XAE("td", [{"colspan", "2"}],
+ [?XE('tr',
+ [?XE('td', [?INPUT("text", "modulenew", "")]),
+ ?XE('td', [?TEXTAREA("optsnew", "2", "40", "[]")]),
+ ?XAE('td', [?XMLATTR("colspan", "2")],
[?INPUTT("submit", "start", "Start")])
]
)]
@@ -2560,48 +2597,6 @@ node_update_parse_query(Node, Query) ->
end.
-pretty_print_xml(El) ->
- lists:flatten(pretty_print_xml(El, "")).
-
-pretty_print_xml({xmlcdata, CData}, Prefix) ->
- [Prefix, CData, $\n];
-pretty_print_xml({xmlelement, Name, Attrs, Els}, Prefix) ->
- [Prefix, $<, Name,
- case Attrs of
- [] ->
- [];
- [{Attr, Val} | RestAttrs] ->
- AttrPrefix = [Prefix,
- string:copies(" ", length(Name) + 2)],
- [$\s, Attr, $=, $', xml:crypt(Val), $' |
- lists:map(fun({Attr1, Val1}) ->
- [$\n, AttrPrefix,
- Attr1, $=, $', xml:crypt(Val1), $']
- end, RestAttrs)]
- end,
- if
- Els == [] ->
- "/>\n";
- true ->
- OnlyCData = lists:all(fun({xmlcdata, _}) -> true;
- ({xmlelement, _, _, _}) -> false
- end, Els),
- if
- OnlyCData ->
- [$>,
- xml:get_cdata(Els),
- $<, $/, Name, $>, $\n
- ];
- true ->
- [$>, $\n,
- lists:map(fun(E) ->
- pretty_print_xml(E, [Prefix, " "])
- end, Els),
- Prefix, $<, $/, Name, $>, $\n
- ]
- end
- end].
-
element_to_list(X) when is_atom(X) -> atom_to_list(X);
element_to_list(X) when is_integer(X) -> integer_to_list(X).
@@ -2731,9 +2726,9 @@ make_server_menu(HostMenu, NodeMenu, Lang, JID) ->
get_menu_items_hook({hostnode, Host, Node}, Lang) ->
- ejabberd_hooks:run_fold(webadmin_menu_hostnode, Host, [], [Host, Node, Lang]);
+ ejabberd_hooks:run_fold(webadmin_menu_hostnode, list_to_binary(Host), [], [Host, Node, Lang]);
get_menu_items_hook({host, Host}, Lang) ->
- ejabberd_hooks:run_fold(webadmin_menu_host, Host, [], [Host, Lang]);
+ ejabberd_hooks:run_fold(webadmin_menu_host, list_to_binary(Host), [], [Host, Lang]);
get_menu_items_hook({node, Node}, Lang) ->
ejabberd_hooks:run_fold(webadmin_menu_node, [], [Node, Lang]);
get_menu_items_hook(server, Lang) ->
@@ -2769,17 +2764,17 @@ make_menu_items2(Lang, Deep, {MURI, MName, [Item | Items]}, Res) ->
make_menu_items2(Lang, Deep, {MURI, MName, Items}, Res2).
make_menu_item(header, 1, URI, Name, _Lang) ->
- ?LI([?XAE("div", [{"id", "navhead"}], [?AC(URI, Name)] )]);
+ ?LI([?XAE('div', [?XMLATTR('id', <<"navhead">>)], [?AC(URI, Name)] )]);
make_menu_item(header, 2, URI, Name, _Lang) ->
- ?LI([?XAE("div", [{"id", "navheadsub"}], [?AC(URI, Name)] )]);
+ ?LI([?XAE('div', [?XMLATTR('id', <<"navheadsub">>)], [?AC(URI, Name)] )]);
make_menu_item(header, 3, URI, Name, _Lang) ->
- ?LI([?XAE("div", [{"id", "navheadsubsub"}], [?AC(URI, Name)] )]);
+ ?LI([?XAE('div', [?XMLATTR('id', <<"navheadsubsub">>)], [?AC(URI, Name)] )]);
make_menu_item(item, 1, URI, Name, Lang) ->
- ?LI([?XAE("div", [{"id", "navitem"}], [?ACT(URI, Name)] )]);
+ ?LI([?XAE('div', [?XMLATTR('id', <<"navitem">>)], [?ACT(URI, Name)] )]);
make_menu_item(item, 2, URI, Name, Lang) ->
- ?LI([?XAE("div", [{"id", "navitemsub"}], [?ACT(URI, Name)] )]);
+ ?LI([?XAE('div', [?XMLATTR('id', <<"navitemsub">>)], [?ACT(URI, Name)] )]);
make_menu_item(item, 3, URI, Name, Lang) ->
- ?LI([?XAE("div", [{"id", "navitemsubsub"}], [?ACT(URI, Name)] )]).
+ ?LI([?XAE('div', [?XMLATTR('id', <<"navitemsubsub">>)], [?ACT(URI, Name)] )]).
%%%==================================
diff --git a/src/web/ejabberd_web_admin.hrl b/src/web/ejabberd_web_admin.hrl
index 2bf164e0b..6f822f2f6 100644
--- a/src/web/ejabberd_web_admin.hrl
+++ b/src/web/ejabberd_web_admin.hrl
@@ -19,11 +19,12 @@
%%%
%%%----------------------------------------------------------------------
--define(X(Name), {xmlelement, Name, [], []}).
--define(XA(Name, Attrs), {xmlelement, Name, Attrs, []}).
--define(XE(Name, Els), {xmlelement, Name, [], Els}).
--define(XAE(Name, Attrs, Els), {xmlelement, Name, Attrs, Els}).
--define(C(Text), {xmlcdata, Text}).
+-define(X(Name), #xmlel{ns = ?NS_XHTML, name = Name}).
+-define(XA(Name, Attrs), #xmlel{ns = ?NS_XHTML, name = Name, attrs = Attrs}).
+-define(XE(Name, Els), #xmlel{ns = ?NS_XHTML, name = Name, children = Els}).
+-define(XAE(Name, Attrs, Els), #xmlel{ns = ?NS_XHTML, name = Name,
+ attrs = Attrs, children = Els}).
+-define(C(Text), #xmlcdata{cdata = list_to_binary(Text)}).
-define(XC(Name, Text), ?XE(Name, [?C(Text)])).
-define(XAC(Name, Attrs, Text), ?XAE(Name, Attrs, [?C(Text)])).
@@ -32,45 +33,46 @@
-define(XCT(Name, Text), ?XC(Name, ?T(Text))).
-define(XACT(Name, Attrs, Text), ?XAC(Name, Attrs, ?T(Text))).
--define(LI(Els), ?XE("li", Els)).
--define(A(URL, Els), ?XAE("a", [{"href", URL}], Els)).
+-define(LI(Els), ?XE('li', Els)).
+-define(A(URL, Els), ?XAE('a', [exmpp_xml:attribute('href', URL)], Els)).
-define(AC(URL, Text), ?A(URL, [?C(Text)])).
-define(ACT(URL, Text), ?AC(URL, ?T(Text))).
--define(P, ?X("p")).
--define(BR, ?X("br")).
+-define(P, ?X('p')).
+-define(BR, ?X('br')).
-define(INPUT(Type, Name, Value),
- ?XA("input", [{"type", Type},
- {"name", Name},
- {"value", Value}])).
+ ?XA('input', [exmpp_xml:attribute('type', Type),
+ exmpp_xml:attribute('name', Name),
+ exmpp_xml:attribute('value', Value)])).
+
-define(INPUTT(Type, Name, Value), ?INPUT(Type, Name, ?T(Value))).
-define(INPUTS(Type, Name, Value, Size),
- ?XA("input", [{"type", Type},
- {"name", Name},
- {"value", Value},
- {"size", Size}])).
+ ?XA('input', [exmpp_xml:attribute('type', Type),
+ exmpp_xml:attribute('name', Name),
+ exmpp_xml:attribute('value', Value),
+ exmpp_xml:attribute('size', Size)])).
-define(INPUTST(Type, Name, Value, Size), ?INPUT(Type, Name, ?T(Value), Size)).
--define(ACLINPUT(Text), ?XE("td", [?INPUT("text", "value" ++ ID, Text)])).
+-define(ACLINPUT(Text), ?XE('td', [?INPUT("text", "value" ++ ID, Text)])).
-define(TEXTAREA(Name, Rows, Cols, Value),
- ?XAC("textarea", [{"name", Name},
- {"rows", Rows},
- {"cols", Cols}],
+ ?XAC('textarea', [exmpp_xml:attribute('name', list_to_binary(Name)),
+ exmpp_xml:attribute('rows', list_to_binary(Rows)),
+ exmpp_xml:attribute('cols', list_to_binary(Cols))],
Value)).
%% Build an xmlelement for result
--define(XRES(Text), ?XAC("p", [{"class", "result"}], Text)).
+-define(XRES(Text), ?XAC('p', [exmpp_xml:attribute('class', <<"result">>)], Text)).
-define(XREST(Text), ?XRES(?T(Text))).
%% Guide Link
-define(GL(Ref, Title),
- ?XAE("div",
- [{"class", "guidelink"}],
- [?XAE("a",
- [{"href", "/admin/doc/guide.html#"++ Ref},
- {"target", "_blank"}],
+ ?XAE('div',
+ [exmpp_xml:attribute('class', <<"guidelink">>)],
+ [?XAE('a',
+ [exmpp_xml:attribute('href', list_to_binary("/admin/doc/guide.html#"++ Ref)),
+ exmpp_xml:attribute('target', <<"_blank">>)],
[?C("[Guide: " ++ Title ++ "]")])
])).
%% h1 with a Guide Link
--define(H1GL(Name, Ref, Title), [?XC("h1", Name), ?GL(Ref, Title)]).
+-define(H1GL(Name, Ref, Title), [?XC('h1', Name), ?GL(Ref, Title)]).
diff --git a/src/web/mod_http_fileserver.erl b/src/web/mod_http_fileserver.erl
index 36679bc2e..a5a021c00 100644
--- a/src/web/mod_http_fileserver.erl
+++ b/src/web/mod_http_fileserver.erl
@@ -66,12 +66,6 @@
headers
}).
--ifdef(SSL39).
--define(STRING2LOWER, string).
--else.
--define(STRING2LOWER, httpd_util).
--endif.
-
-record(state, {host, docroot, accesslog, accesslogfd, directory_indices,
default_content_type, content_types = []}).
@@ -217,7 +211,8 @@ try_open_log(FN, Host) ->
?ERROR_MSG("Cannot open access log file: ~p~nReason: ~p", [FN, Reason]),
undefined
end,
- ejabberd_hooks:add(reopen_log_hook, Host, ?MODULE, reopen_log, 50),
+ HostB = list_to_binary(Host),
+ ejabberd_hooks:add(reopen_log_hook, HostB, ?MODULE, reopen_log, 50),
FD.
%%--------------------------------------------------------------------
@@ -411,7 +406,7 @@ join([H | T], Separator) ->
lists:foldl(fun(E, Acc) -> lists:concat([Acc, Separator, E]) end, H, T).
content_type(Filename, DefaultContentType, ContentTypes) ->
- Extension = ?STRING2LOWER:to_lower(filename:extension(Filename)),
+ Extension = string:to_lower(filename:extension(Filename)),
case lists:keysearch(Extension, 1, ContentTypes) of
{value, {_, ContentType}} -> ContentType;
false -> DefaultContentType
@@ -427,4 +422,4 @@ ip_to_string(Address) when size(Address) == 4 ->
join(tuple_to_list(Address), ".");
ip_to_string(Address) when size(Address) == 8 ->
Parts = lists:map(fun (Int) -> io_lib:format("~.16B", [Int]) end, tuple_to_list(Address)),
- ?STRING2LOWER:to_lower(lists:flatten(join(Parts, ":"))).
+ string:to_lower(lists:flatten(join(Parts, ":"))).
diff --git a/src/win32/ejabberd.cfg b/src/win32/ejabberd.cfg
index 7ba191be0..a42b849d5 100644
--- a/src/win32/ejabberd.cfg
+++ b/src/win32/ejabberd.cfg
@@ -146,7 +146,6 @@
{mod_offline, []},
{mod_announce, [{access, announce}]},
{mod_private, []},
- {mod_irc, []},
% Default options for mod_muc:
% host: "conference." ++ ?MYNAME
% access: all
diff --git a/src/xml.erl b/src/xml.erl
deleted file mode 100644
index aeb085ea5..000000000
--- a/src/xml.erl
+++ /dev/null
@@ -1,246 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : xml.erl
-%%% Author : Alexey Shchepin
-%%% Purpose : XML utils
-%%% Created : 20 Nov 2002 by Alexey Shchepin
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2009 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(xml).
--author('alexey@process-one.net').
-
--export([element_to_string/1,
- crypt/1, make_text_node/1,
- remove_cdata/1,
- get_cdata/1, get_tag_cdata/1,
- get_attr/2, get_attr_s/2,
- get_tag_attr/2, get_tag_attr_s/2,
- get_subtag/2, get_subtag_cdata/2,
- append_subtags/2,
- get_path_s/2,
- replace_tag_attr/3]).
-
-%% Select at compile time how to escape characters in binary text
-%% nodes.
-%% Can be choosen with ./configure --enable-full-xml
--ifdef(FULL_XML_SUPPORT).
--define(ESCAPE_BINARY(CData), make_text_node(CData)).
--else.
--define(ESCAPE_BINARY(CData), crypt(CData)).
--endif.
-
-element_to_string(El) ->
- case catch element_to_string_nocatch(El) of
- {'EXIT', Reason} ->
- erlang:error({badxml, El, Reason});
- Result ->
- Result
- end.
-
-element_to_string_nocatch(El) ->
- case El of
- {xmlelement, Name, Attrs, Els} ->
- if
- Els /= [] ->
- [$<, Name, attrs_to_list(Attrs), $>,
- [element_to_string_nocatch(E) || E <- Els],
- $<, $/, Name, $>];
- true ->
- [$<, Name, attrs_to_list(Attrs), $/, $>]
- end;
- %% We do not crypt CDATA binary, but we enclose it in XML CDATA
- {xmlcdata, CData} when is_binary(CData) ->
- ?ESCAPE_BINARY(CData);
- %% We crypt list and possibly binaries if full XML usage is
- %% disabled unsupported (implies a conversion to list).
- {xmlcdata, CData} ->
- crypt(CData)
- end.
-
-attrs_to_list(Attrs) ->
- [attr_to_list(A) || A <- Attrs].
-
-attr_to_list({Name, Value}) ->
- [$\s, Name, $=, $', crypt(Value), $'].
-
-crypt(S) when is_list(S) ->
- [case C of
- $& -> "&";
- $< -> "<";
- $> -> ">";
- $" -> """;
- $' -> "'";
- _ -> C
- end || C <- S];
-crypt(S) when is_binary(S) ->
- crypt(binary_to_list(S)).
-
-%% Make a cdata_binary depending on what characters it contains
-make_text_node(CData) ->
- case cdata_need_escape(CData) of
- cdata ->
- CDATA1 = <<">,
- CDATA2 = <<"]]>">>,
- concat_binary([CDATA1, CData, CDATA2]);
- none ->
- CData;
- {cdata, EndTokens} ->
- EscapedCData = escape_cdata(CData, EndTokens),
- concat_binary(EscapedCData)
- end.
-
-%% Returns escape type needed for the text node
-%% none, cdata, {cdata, [Positions]}
-%% Positions is a list a integer containing positions of CDATA end
-%% tokens, so that they can be escaped
-cdata_need_escape(CData) ->
- cdata_need_escape(CData, 0, false, []).
-cdata_need_escape(<<>>, _, false, _) ->
- none;
-cdata_need_escape(<<>>, _, true, []) ->
- cdata;
-cdata_need_escape(<<>>, _, true, CDataEndTokens) ->
- {cdata, lists:reverse(CDataEndTokens)};
-cdata_need_escape(<<$],$],$>,Rest/binary>>, CurrentPosition,
- _XMLEscape, CDataEndTokens) ->
- NewPosition = CurrentPosition + 3,
- cdata_need_escape(Rest, NewPosition, true,
- [CurrentPosition+1|CDataEndTokens]);
-%% Only <, & need to be escaped in XML text node
-%% See reference: http://www.w3.org/TR/xml11/#syntax
-cdata_need_escape(<<$<,Rest/binary>>, CurrentPosition,
- _XMLEscape, CDataEndTokens) ->
- cdata_need_escape(Rest, CurrentPosition+1, true, CDataEndTokens);
-cdata_need_escape(<<$&,Rest/binary>>, CurrentPosition,
- _XMLEscape, CDataEndTokens) ->
- cdata_need_escape(Rest, CurrentPosition+1, true, CDataEndTokens);
-cdata_need_escape(<<_:8,Rest/binary>>, CurrentPosition,
- XMLEscape, CDataEndTokens) ->
- cdata_need_escape(Rest, CurrentPosition+1, XMLEscape,
- CDataEndTokens).
-
-%% escape cdata that contain CDATA end tokens
-%% EndTokens is a list of position of end tokens (integer)
-%% This is supposed to be a very rare case: You need to generate several
-%% fields, splitting it in the middle of the end token.
-%% See example: http://en.wikipedia.org/wiki/CDATA#Uses_of_CDATA_sections
-escape_cdata(CData, EndTokens) ->
- escape_cdata(CData, 0, EndTokens, []).
-escape_cdata(<<>>, _CurrentPosition, [], Acc) ->
- lists:reverse(Acc);
-escape_cdata(Rest, CurrentPosition, [], Acc) ->
- CDATA1 = <<">,
- CDATA2 = <<"]]>">>,
- escape_cdata(<<>>, CurrentPosition, [], [CDATA2, Rest, CDATA1|Acc]);
-escape_cdata(CData, Index, [Pos|Positions], Acc) ->
- CDATA1 = <<">,
- CDATA2 = <<"]]>">>,
- Split = Pos-Index,
- {Part, Rest} = split_binary(CData, Split+1),
- %% Note: We build the list in reverse to optimize construction
- escape_cdata(Rest, Pos+1, Positions, [CDATA2, Part, CDATA1|Acc]).
-
-remove_cdata_p({xmlelement, _Name, _Attrs, _Els}) -> true;
-remove_cdata_p(_) -> false.
-
-remove_cdata(L) -> [E || E <- L, remove_cdata_p(E)].
-
-get_cdata(L) ->
- binary_to_list(list_to_binary(get_cdata(L, ""))).
-
-get_cdata([{xmlcdata, CData} | L], S) ->
- get_cdata(L, [S, CData]);
-get_cdata([_ | L], S) ->
- get_cdata(L, S);
-get_cdata([], S) ->
- S.
-
-get_tag_cdata({xmlelement, _Name, _Attrs, Els}) ->
- get_cdata(Els).
-
-get_attr(AttrName, Attrs) ->
- case lists:keysearch(AttrName, 1, Attrs) of
- {value, {_, Val}} ->
- {value, Val};
- _ ->
- false
- end.
-
-get_attr_s(AttrName, Attrs) ->
- case lists:keysearch(AttrName, 1, Attrs) of
- {value, {_, Val}} ->
- Val;
- _ ->
- ""
- end.
-
-get_tag_attr(AttrName, {xmlelement, _Name, Attrs, _Els}) ->
- get_attr(AttrName, Attrs).
-
-get_tag_attr_s(AttrName, {xmlelement, _Name, Attrs, _Els}) ->
- get_attr_s(AttrName, Attrs).
-
-
-get_subtag({xmlelement, _, _, Els}, Name) ->
- get_subtag1(Els, Name).
-
-get_subtag1([El | Els], Name) ->
- case El of
- {xmlelement, Name, _, _} ->
- El;
- _ ->
- get_subtag1(Els, Name)
- end;
-get_subtag1([], _) ->
- false.
-
-get_subtag_cdata(Tag, Name) ->
- case get_subtag(Tag, Name) of
- false ->
- "";
- Subtag ->
- get_tag_cdata(Subtag)
- end.
-
-append_subtags({xmlelement, Name, Attrs, SubTags1}, SubTags2) ->
- {xmlelement, Name, Attrs, SubTags1 ++ SubTags2}.
-
-get_path_s(El, []) ->
- El;
-get_path_s(El, [{elem, Name} | Path]) ->
- case get_subtag(El, Name) of
- false ->
- "";
- SubEl ->
- get_path_s(SubEl, Path)
- end;
-get_path_s(El, [{attr, Name}]) ->
- get_tag_attr_s(Name, El);
-get_path_s(El, [cdata]) ->
- get_tag_cdata(El).
-
-
-replace_tag_attr(Attr, Value, {xmlelement, Name, Attrs, Els}) ->
- Attrs1 = lists:keydelete(Attr, 1, Attrs),
- Attrs2 = [{Attr, Value} | Attrs1],
- {xmlelement, Name, Attrs2, Els}.
-
-
diff --git a/src/xml_stream.erl b/src/xml_stream.erl
deleted file mode 100644
index 13295285b..000000000
--- a/src/xml_stream.erl
+++ /dev/null
@@ -1,190 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : xml_stream.erl
-%%% Author : Alexey Shchepin
-%%% Purpose : Parse XML streams
-%%% Created : 17 Nov 2002 by Alexey Shchepin
-%%%
-%%%
-%%% ejabberd, Copyright (C) 2002-2009 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(xml_stream).
--author('alexey@process-one.net').
-
--export([new/1,
- new/2,
- parse/2,
- close/1,
- parse_element/1]).
-
--define(XML_START, 0).
--define(XML_END, 1).
--define(XML_CDATA, 2).
--define(XML_ERROR, 3).
-
--define(PARSE_COMMAND, 0).
--define(PARSE_FINAL_COMMAND, 1).
-
--record(xml_stream_state, {callback_pid, port, stack, size, maxsize}).
-
-process_data(CallbackPid, Stack, Data) ->
- case Data of
- {?XML_START, {Name, Attrs}} ->
- if
- Stack == [] ->
- catch gen_fsm:send_event(CallbackPid,
- {xmlstreamstart, Name, Attrs});
- true ->
- ok
- end,
- [{xmlelement, Name, Attrs, []} | Stack];
- {?XML_END, EndName} ->
- case Stack of
- [{xmlelement, Name, Attrs, Els} | Tail] ->
- NewEl = {xmlelement, Name, Attrs, lists:reverse(Els)},
- case Tail of
- [] ->
- catch gen_fsm:send_event(CallbackPid,
- {xmlstreamend, EndName}),
- Tail;
- [_] ->
- catch gen_fsm:send_event(CallbackPid,
- {xmlstreamelement, NewEl}),
- Tail;
- [{xmlelement, Name1, Attrs1, Els1} | Tail1] ->
- [{xmlelement, Name1, Attrs1, [NewEl | Els1]} |
- Tail1]
- end
- end;
- {?XML_CDATA, CData} ->
- case Stack of
- [El] ->
- [El];
- %% Merge CDATA nodes if they are contiguous
- %% This does not change the semantic: the split in
- %% several CDATA nodes depends on the TCP/IP packet
- %% fragmentation
- [{xmlelement, Name, Attrs,
- [{xmlcdata, PreviousCData}|Els]} | Tail] ->
- [{xmlelement, Name, Attrs,
- [{xmlcdata, concat_binary([PreviousCData, CData])} | Els]} | Tail];
- %% No previous CDATA
- [{xmlelement, Name, Attrs, Els} | Tail] ->
- [{xmlelement, Name, Attrs, [{xmlcdata, CData} | Els]} |
- Tail];
- [] -> []
- end;
- {?XML_ERROR, Err} ->
- catch gen_fsm:send_event(CallbackPid, {xmlstreamerror, Err})
- end.
-
-
-new(CallbackPid) ->
- new(CallbackPid, infinity).
-
-new(CallbackPid, MaxSize) ->
- Port = open_port({spawn, expat_erl}, [binary]),
- #xml_stream_state{callback_pid = CallbackPid,
- port = Port,
- stack = [],
- size = 0,
- maxsize = MaxSize}.
-
-
-parse(#xml_stream_state{callback_pid = CallbackPid,
- port = Port,
- stack = Stack,
- size = Size,
- maxsize = MaxSize} = State, Str) ->
- StrSize = if
- is_list(Str) -> length(Str);
- is_binary(Str) -> size(Str)
- end,
- Res = port_control(Port, ?PARSE_COMMAND, Str),
- {NewStack, NewSize} =
- lists:foldl(
- fun(Data, {St, Sz}) ->
- NewSt = process_data(CallbackPid, St, Data),
- case NewSt of
- [_] -> {NewSt, 0};
- _ -> {NewSt, Sz}
- end
- end, {Stack, Size + StrSize}, binary_to_term(Res)),
- if
- NewSize > MaxSize ->
- catch gen_fsm:send_event(CallbackPid,
- {xmlstreamerror, "XML stanza is too big"});
- true ->
- ok
- end,
- State#xml_stream_state{stack = NewStack, size = NewSize}.
-
-close(#xml_stream_state{port = Port}) ->
- port_close(Port).
-
-
-parse_element(Str) ->
- Port = open_port({spawn, expat_erl}, [binary]),
- Res = port_control(Port, ?PARSE_FINAL_COMMAND, Str),
- port_close(Port),
- process_element_events(binary_to_term(Res)).
-
-process_element_events(Events) ->
- process_element_events(Events, []).
-
-process_element_events([], _Stack) ->
- {error, parse_error};
-process_element_events([Event | Events], Stack) ->
- case Event of
- {?XML_START, {Name, Attrs}} ->
- process_element_events(
- Events, [{xmlelement, Name, Attrs, []} | Stack]);
- {?XML_END, _EndName} ->
- case Stack of
- [{xmlelement, Name, Attrs, Els} | Tail] ->
- NewEl = {xmlelement, Name, Attrs, lists:reverse(Els)},
- case Tail of
- [] ->
- if
- Events == [] ->
- NewEl;
- true ->
- {error, parse_error}
- end;
- [{xmlelement, Name1, Attrs1, Els1} | Tail1] ->
- process_element_events(
- Events,
- [{xmlelement, Name1, Attrs1, [NewEl | Els1]} |
- Tail1])
- end
- end;
- {?XML_CDATA, CData} ->
- case Stack of
- [{xmlelement, Name, Attrs, Els} | Tail] ->
- process_element_events(
- Events,
- [{xmlelement, Name, Attrs, [{xmlcdata, CData} | Els]} |
- Tail]);
- [] ->
- process_element_events(Events, [])
- end;
- {?XML_ERROR, Err} ->
- {error, Err}
- end.
-
diff --git a/tools/captcha.sh b/tools/captcha.sh
old mode 100755
new mode 100644
|