Compare commits

...

301 Commits

Author SHA1 Message Date
Evgeny Khramtsov d2f92eecd4 Re-tag xmpp dep 2019-09-26 10:22:36 +03:00
Paweł Chmielowski 8918bfb55b Update deps in mix.exs/lock 2019-09-25 14:55:32 +02:00
Jerome Sautret ce8bd343de Bump version in mix.exs 2019-09-25 14:54:12 +02:00
Evgeny Khramtsov 2eaad21863 Don't log warning when an option is consulted for uknown vhost
Such warnings may be unappropriate in some situation, e.g.
when a virtual host is disabled in runtime but some packets
for this host are still in transit.

Fixes #3037
2019-09-25 13:58:05 +03:00
Paweł Chmielowski 9b2a44e750 Tag p1_acme and use that in deps 2019-09-25 12:46:22 +02:00
Evgeny Khramtsov aefe2fd640 Rename to p1_acme 2019-09-25 13:10:47 +03:00
Jerome Sautret a8f336421e Add 19.09 Changelog 2019-09-24 18:30:10 +02:00
Paweł Chmielowski f2e8754586 Update deps 2019-09-24 11:01:43 +02:00
Evgeny Khramtsov 5770946f03 Correctly handle unicode in log messages 2019-09-23 15:17:20 +03:00
Evgeny Khramtsov 2e1e128833 Fix unicode formatting in ACME module 2019-09-22 20:11:54 +03:00
Evgeny Khramtsov faefad746e Fix unicode processing in ejabberd.yml 2019-09-22 19:42:29 +03:00
Evgeny Khramtsov b7e296857c Don't call to xmpp_idna 2019-09-22 13:28:14 +03:00
Evgeny Khramtsov 75fe6f44d2 Fix IDNA support in ACME requests 2019-09-22 12:44:31 +03:00
Evgeny Khramtsov 30346a56de Don't forget to log an error message on IDNA failure 2019-09-22 11:30:20 +03:00
Evgeny Khramtsov a616cc04cb Support IDN hostnames in ACME requests 2019-09-22 11:04:38 +03:00
Evgeny Khramtsov d5e0ccb04a Don't attempt to create acme directory on ejabberd startup 2019-09-22 01:14:29 +03:00
Evgeny Khramtsov ea09497038 Slightly improve arg example 2019-09-22 01:03:08 +03:00
Evgeny Khramtsov f5156390bb Don't allow requesting certificates for localhost or IP-like domains 2019-09-22 00:53:03 +03:00
Evgeny Khramtsov 12691e738b Improve warning message 2019-09-22 00:21:12 +03:00
Evgeny Khramtsov 6d9be82e1b Avoid excessive quoting in request_handlers of example config 2019-09-21 22:20:20 +03:00
Evgeny Khramtsov fa00caced4 Bump acme version 2019-09-21 22:18:49 +03:00
Evgeny Khramtsov bacaae7873 Comment certfiles section in example config
Rely on ACME configuration instead
2019-09-20 16:12:15 +03:00
Evgeny Khramtsov 81ae691738 Use round/0 instead of ceil/0
Because ceil/0 was introduced in OTP20.0 only
2019-09-20 15:33:08 +03:00
Evgeny Khramtsov 9805b1a73a Fix typo 2019-09-20 14:04:00 +03:00
Evgeny Khramtsov 68ba109889 Remove unused file 2019-09-20 13:08:03 +03:00
Evgeny Khramtsov 4cdb4c2090 Don't auto request certificate for localhost and IP-like domains 2019-09-20 13:03:25 +03:00
Evgeny Khramtsov 1162137d5d Add listener for ACME challenge in example config 2019-09-20 12:52:28 +03:00
Evgeny Khramtsov e227940b85 Improve ACME implementation
Fixes #2487, fixes #2590, fixes #2638
2019-09-20 12:36:31 +03:00
Alexey Shchepin 0fe1e40a9d JWT-only authentication for some users (#3012) 2019-09-18 18:46:24 +03:00
Holger Weiss f48b4124b1 mod_jidprep: Don't call gen_mod functions directly 2019-09-18 17:39:40 +02:00
Badlop fd4c5edc23 Apply default role after revoking admin affiliation (#3023) 2019-09-17 12:31:14 +02:00
Holger Weiss d8433d1644 README.md: Clean up wording
The `gsfonts` package name is specific to some Linux distributions, so
just mention the dependency on "Ghostscript fonts".
2019-09-12 12:22:30 +02:00
Holger Weiss 0f864d97f6 Merge remote-tracking branch 'processone/pr/2995'
* processone/pr/2995:
  Added gsfonts for captcha
2019-09-12 12:20:59 +02:00
Holger Weiss b1c10d2a03 Add support for XEP-0328: JID Prep
The mod_jidprep module implements XEP-0328: JID Prep, version 0.1.
2019-09-12 09:26:45 +02:00
Evgeny Khramtsov 56b4d3902a Log Mnesia table type on creation 2019-09-10 21:57:51 +03:00
Evgeny Khramtsov 533a4eec96 Replicate Mnesia 'bosh' table when nodes are joined 2019-09-10 16:02:51 +03:00
Mickael Remond bd83bb0790 Merge branch 'master' of github.com:processone/ejabberd 2019-09-09 12:13:27 +02:00
Mickael Remond 7b79921734 Use email field type to avoid jid capitalization on iOS 2019-09-09 12:12:54 +02:00
Holger Weiss 017f60d33c Fix typos in issue template 2019-09-09 10:46:54 +02:00
Mickaël Rémond bf6fc75ada Update issue templates 2019-09-09 09:49:54 +02:00
Alexey Shchepin 6d83cbd1a8 Add missing ejabberd_auth_jwt:user_exists/2 function (#3012) 2019-09-09 00:57:55 +03:00
Alexey Shchepin 21aa344ed5 Fix BEGIN/COMMIT/ROLLBACK syntax for MSSQL (#2978) 2019-09-09 00:16:44 +03:00
Evgeny Khramtsov a8c6eec28c Fix certificate selection for s2s
The bug was introduced in c2cbb4d879
Fixes #3015
2019-09-06 22:20:07 +03:00
Paweł Chmielowski 6d08ecc41f Add ejabberd_oauth:verify_resowner_scope callback back
This fixes issue #2982
2019-09-06 16:47:22 +02:00
Evgeny Khramtsov 9a8245b8e6 Fix the regression introduced in dd57950
Fixes #3010
2019-09-04 10:31:09 +03:00
Badlop e50ecf9e96 Fix some links to Guide in WebAdmin and add new ones (#3003) 2019-08-27 15:41:37 +02:00
badlop e14f206615 Merge pull request #3004 from Slawutich/master
Custom exit message is not broadcast
2019-08-26 13:53:42 +02:00
Vyache c0f8e5d7c0 Custom exit message is not broadcast 2019-08-23 09:32:58 +03:00
Badlop 1fd75265d6 Use select fields to input host in WebAdmin Backup (#3000) 2019-08-22 18:35:43 +02:00
Badlop 94d50a447d Fix call to deprecated ejabberd_config:get_myhosts() (#3000) 2019-08-22 18:35:41 +02:00
Badlop 12c4dfd955 Provide meaningful error when adding non-local users to shared roster (#3000) 2019-08-22 17:13:18 +02:00
Badlop a51aa2bc44 Check account auth provided in WebAdmin is a local host (#3000) 2019-08-22 17:13:13 +02:00
ThUnD3r|Gr33n 4a9b1e94f3 Added gsfonts for captcha
This is needed to show Captcha .if not Captcha would be empty
2019-08-18 11:19:09 +02:00
Paweł Chmielowski 07ef1775cd Add another variant of transformation of offline_msg in mod_offline_mnesia 2019-08-16 18:34:42 +02:00
Evgeny Khramtsov 9ec69b8d62 Don't treat 'Host' header as a virtual XMPP host
Fixes #2989
2019-08-13 18:30:28 +03:00
Badlop 0bb14bdc0b Revert "Affiliations other than admin and owner cannot invite to members_only rooms"
This reverts commit b010a1a0a0.
More details in #2987
2019-08-13 14:55:37 +02:00
Badlop a157e22c2f When join new room with password, set pass and password_protected (#2668) 2019-08-13 11:37:32 +02:00
Badlop a1dfb7fbe6 Improve rooms_* commands to accept 'global' as MUC service argument (#2976) 2019-08-12 17:03:32 +02:00
Evgeny Khramtsov 8f8f53a595 Fix typo in type spec 2019-08-12 12:28:17 +03:00
Evgeny Khramtsov d796dcace5 Spawn SQL connections on demand only 2019-08-12 12:21:31 +03:00
Badlop dd8c468de3 Rename MUC command arguments from Host to Service (#2976) 2019-08-08 12:32:59 +02:00
Evgeny Khramtsov ced62e0df8 Don't use close/2: set stop_reason explicitly
Fixes #2984
2019-08-08 11:21:28 +03:00
Mickael Remond 28feb90175 Remove fast_yaml override 2019-08-06 15:47:58 +02:00
Evgeny Khramtsov 950c209310 Report connection error before waiting for resumption
In other words don't hide the reason why c2s connection has failed
2019-08-06 16:18:04 +03:00
Evgeny Khramtsov 77acbab965 Add tests for 'vcard' option 2019-08-06 14:03:23 +03:00
Evgeny Khramtsov 934392fd7e Implement reload/3 for mod_http_upload 2019-08-06 12:31:33 +03:00
Jerome Sautret 11d519677e Add 19.08 Changelog 2019-08-05 14:36:45 +02:00
Paweł Chmielowski e520a4c78d Adopt mix task to changes in ejabberd_config 2019-08-05 10:55:30 +02:00
Paweł Chmielowski c2d97854e3 Bump version in mix.exs 2019-08-05 10:15:06 +02:00
Paweł Chmielowski 1d2fba856e Update mix deps 2019-08-05 10:14:30 +02:00
Evgeny Khramtsov 2168489ddf Don't retain module option on gen_mod supervisor
When module's options were updated (e.g. by reloading ejabberd.yml)
and, later, the module's process crashed, gen_mod supervisor
restarts the process with outdated options. This is now fixed.
2019-08-04 21:46:18 +03:00
Paweł Chmielowski e8fb9ab303 Use tagged version for yconf as well 2019-08-02 16:06:19 +02:00
Paweł Chmielowski b50e7161ee Update deps to tagged versions 2019-08-02 15:12:38 +02:00
Evgeny Khramtsov 4dac9f1e6d Validate BINVAL values of vcard elements as Base64 2019-08-02 14:20:10 +03:00
Evgeny Khramtsov 5a976719fb Introduce 'vcard' option for the modules supporting vCards
The mapping between vCard's XML elements and YAML elements
of 'vcard' option is straightforward. For example, if you
want mod_muc to return the following vCard:
```
<vCard xmlns='vcard-temp'>
  <FN>Conferences</FN>
  <ADR>
    <WORK/>
    <STREET>Elm Street</STREET>
  </ADR>
</vCard>
```
you need to set the configuration as:
```
modules:
  ...
  mod_muc:
    vcard:
      fn: Conferences
      adr:
        -
          work: true
          street: Elm Street
  ...
```
2019-08-02 13:59:42 +03:00
Evgeny Khramtsov 2f51aae818 Bump pkix version 2019-08-01 12:56:23 +03:00
Badlop 66d2e6ca27 Explain requirements of the FROM argument of send_message command (#2959) 2019-08-01 11:29:42 +02:00
Evgeny Khramtsov 059cf8fed1 Don't call ejabberd_cluster from its submodules
Fixes #2971
2019-07-31 19:25:47 +03:00
Evgeny Khramtsov 465e1f5ee1 Fix db_type validation 2019-07-31 18:55:43 +03:00
Paweł Chmielowski aa0f110afe Add test that trigger get_only_item in pubsub 2019-07-31 13:11:27 +02:00
Paweł Chmielowski 51bf552c3f For pubsub items with max_item = 1 use order by in sql queries 2019-07-31 13:06:44 +02:00
Evgeny Khramtsov 48bed43902 Don't render CAPTCHA whitelist when CAPTCHA is not configured
Fixes #2970
2019-07-31 12:35:06 +03:00
Paweł Chmielowski a2fa52a192 Change type of server_host column in mysql.new.sql
Indexes are done only on 191 byte slice of that (to fit in index limits),
and since server_host could theoretically be bigger this causes mysql
engine don't use indexes in full potential.
2019-07-31 10:46:15 +02:00
Evgeny Khramtsov bbee13f970 Improve SQL timeouts handling
Also improve some formatting
2019-07-31 10:39:53 +03:00
Evgeny Khramtsov 651d69fb98 Also catch 'shutdown' exit reason 2019-07-30 23:17:10 +03:00
Evgeny Khramtsov 15f50f5331 Improve pattern matching 2019-07-30 20:57:32 +03:00
Evgeny Khramtsov 3e4d7a98af Implement read-repair for session pids 2019-07-30 20:57:09 +03:00
Evgeny Khramtsov 46cc6c66ec Remove dead code 2019-07-30 15:31:44 +03:00
Evgeny Khramtsov b4770815c0 Fix race condition when deleting c2s session record 2019-07-30 15:21:58 +03:00
Evgeny Khramtsov 209f5d32e1 Fix SQL connections leakage 2019-07-30 14:26:11 +03:00
Evgeny Khramtsov 81996b153a Fix previous commit 2019-07-30 13:40:40 +03:00
Evgeny Khramtsov 59adfcb8e0 Correctly report resume timeout 2019-07-30 12:50:31 +03:00
Evgeny Khramtsov 8a2b2668cf Expose access_model and publish_model in pubsub#metadata
Fixes #2931
2019-07-30 10:45:32 +03:00
Evgeny Khramtsov 949e4c1c59 Generate 'remote-server-not-found' stanza error for non-IDN domains
Fixes #2969
2019-07-29 22:45:38 +03:00
Evgeny Khramtsov d64951c2b2 Improve handling of errors in tree_action/3 2019-07-29 22:24:26 +03:00
Evgeny Khramtsov 2cd930b7d5 Appropriately abort pubsub transaction 2019-07-29 21:44:30 +03:00
Badlop 630cfe26b7 mod_multicast service discovery bugfix (thanks to McPo)(#2968) 2019-07-29 19:32:26 +02:00
Evgeny Khramtsov 2da168cf05 Improve handling of errors in pubsub code 2019-07-29 17:13:16 +03:00
Frank Diebolt cd88d342b9 Apply shaping to websocket connections 2019-07-29 14:54:25 +02:00
Evgeny Khramtsov 35576b4608 Improve hooks validator and fix bugs related to hooks registration 2019-07-29 10:46:20 +03:00
Evgeny Khramtsov 0aa004bafc Improve ejabberd halting procedure 2019-07-26 11:40:19 +03:00
Evgeny Khramtsov a54694684d Fix default value of resume_timeout 2019-07-25 13:57:43 +03:00
Evgeny Khramtsov 3b18e7cc00 Don't attempt to restart killed lager
This is not very robust and the call may hang forever
2019-07-24 19:47:14 +03:00
Evgeny Khramtsov ca0e53b3c5 Fix typo in log message 2019-07-24 18:56:44 +03:00
Evgeny Khramtsov ae135e57d9 Improve SQL pool logic
Avoid using ETS table for SQL workers: rely on processes names instead
2019-07-24 14:28:43 +03:00
Holger Weiss c3c8dffeab Revert "mod_privacy: Don't try to look up 'undefined' list"
This reverts commit 4218aecd1c.  The issue
was fixed in a0d3fb3b23 already.
2019-07-24 11:29:57 +02:00
Holger Weiss 4218aecd1c mod_privacy: Don't try to look up 'undefined' list
Don't crash if the <query/> element of an IQ of type 'set' contains
neither a <default/> nor an <active/> child.

This fixes a regression introduced in commit
8410a203ec.
2019-07-24 10:45:30 +02:00
Evgeny Khramtsov 9ef52f2b0f Fix UTF-8 support in translation files 2019-07-24 11:34:40 +03:00
Evgeny Khramtsov 052917961a Add 'certauth' command to extauth port 2019-07-24 10:13:51 +03:00
Holger Weiss 8ac4a5f792 mod_stream_mgmt: Allow flexible timeout format
Adjust mod_stream_mgmt and the related code in mod_push_keepalive to
support the flexible timeout format.
2019-07-23 00:15:40 +02:00
Christophe Romain c0dc95d529 Fix wrong virtual host in mod_pubsub:send_stanza (#2930) 2019-07-22 10:13:27 +02:00
Evgeny Khramtsov 4be98b5aef Log an error when JWT authentication is configured without jwt_key 2019-07-19 12:01:57 +03:00
Evgeny Khramtsov 55d42b9000 Fix typo 2019-07-18 22:35:16 +03:00
Evgeny Khramtsov 6d6e3e348d Improve robustness of reading jwt_key option 2019-07-18 22:31:08 +03:00
Evgeny Khramtsov 50ef982eff Get rid of useless code 2019-07-18 21:53:22 +03:00
Evgeny Khramtsov ad902c2e16 Don't forget to unregister route when the owning process is dead 2019-07-18 21:48:53 +03:00
Evgeny Khramtsov 3f7d9e3ad6 Remove Riak support
Reasons:
- Riak DB development is almost halted after Basho
- riak-erlang-client is abandoned and doesn't work
  correctly with OTP22
- Riak is slow in comparison to other databases
- Missing key ordering makes it impossible to implement range
  queries efficiently (e.g. MAM queries)
2019-07-18 19:31:12 +03:00
Mickaël Rémond 11e4b9d882 Mention about a few Riak tests being broken 2019-07-18 17:56:11 +02:00
Mickaël Rémond 179a9f4ca8 Explain how to kill stuck common test run 2019-07-18 17:24:13 +02:00
Mickaël Rémond f2fd087673 Update docker test README 2019-07-18 17:14:20 +02:00
Mickaël Rémond a351dfe0f8 Fix example on test data set deletion 2019-07-18 17:05:50 +02:00
Evgeny Khramtsov 478f69317b Report failures of changing net_ticktime 2019-07-18 13:02:13 +03:00
Evgeny Khramtsov 6397dc5d4c Reset net ticktime on config reload 2019-07-18 12:47:29 +03:00
Evgeny Khramtsov dd301306d3 Allow flexible timeout format in session_expiry option of mod_mqtt 2019-07-17 22:58:14 +03:00
Evgeny Khramtsov d718b35d46 Use econf:timeout() instead of econf:pos_int() wherever appropriate 2019-07-17 22:15:56 +03:00
Evgeny Khramtsov c5305c5f9a Improve RPC calls in mod_configure 2019-07-17 20:51:33 +03:00
Evgeny Khramtsov 38b2e099d5 Fix pending nodes retrieval for SQL backend
Thanks to Christophe Romain
2019-07-17 12:34:09 +03:00
Evgeny Khramtsov 2171abf5ae Allow more flexible timeout values in the configuration
Now all timeout values can be expanded with suffixes, e.g.
```
negotiation_timeout: 30s
s2s_timeout: 10 minutes
cache_life_time: 1 hour
```
If the suffix is not given, the timeout is assumed in *seconds*
2019-07-16 23:45:44 +03:00
Evgeny Khramtsov 554f4fc851 Change time unit of hibernation_timeout option to 'second'
This is done for the sake of consistency with other options
2019-07-16 23:42:38 +03:00
Evgeny Khramtsov 15b4b3fa1b Fix typos using codespell 2019-07-16 22:07:39 +03:00
Evgeny Khramtsov cc2f674805 Avoid record duplication 2019-07-16 18:34:05 +03:00
Evgeny Khramtsov a7a53f601e Add econf:string/2 validator 2019-07-16 18:10:45 +03:00
Evgeny Khramtsov 0e48adb1ed Fix opt_type.sh script and re-generate options 2019-07-16 18:06:51 +03:00
Evgeny Khramtsov 76d4c178a7 Use econf:timeout/2 2019-07-16 18:02:32 +03:00
Evgeny Khramtsov f85488583c Handle CAPTCHA forms using captcha_form codec 2019-07-16 17:51:51 +03:00
Paweł Chmielowski 6b3d0d154e Add code for hibernating inactive muc_room processes 2019-07-16 15:09:58 +02:00
Evgeny Khramtsov 4d877289fb Bump xmpp version and fix revealed bugs 2019-07-16 15:59:33 +03:00
Evgeny Khramtsov f10de6439b Fix 'get-pending' command form generation 2019-07-16 15:09:51 +03:00
Badlop 5ecbed5eae Remove very old useless comments in ejabberd_xmlrpc.erl 2019-07-16 12:56:41 +02:00
Badlop 7079634f18 Documentation of mod_http_api moved from source code to Docs page 2019-07-16 12:53:06 +02:00
Evgeny Khramtsov 5eeb95c74f Remove modules management from mod_configure 2019-07-15 17:08:41 +03:00
Evgeny Khramtsov e1f3526466 Don't hide errors using catch 2019-07-15 17:03:29 +03:00
Evgeny Khramtsov a00496a38f Compile some regexps as unicode 2019-07-15 15:26:47 +03:00
Evgeny Khramtsov 2419e00a26 Bump yconf version 2019-07-15 15:22:51 +03:00
Evgeny Khramtsov 061c754c68 Fix regexp matching 2019-07-15 15:07:56 +03:00
Evgeny Khramtsov 104c4093dc Only respond with occupants list to disco#items with empty node
Fixes #2942
2019-07-15 14:10:45 +03:00
Evgeny Khramtsov 4ec78736b9 Improve handling of unexpected iq in mod_muc_room
Don't crash on an iq-set/get containing unexpected tag within
expected namespace

This further improves PR #2900
2019-07-15 13:59:41 +03:00
Evgeny Khramtsov 04dab48794 ejabberd_s2s should start after its supervisors 2019-07-15 12:59:47 +03:00
Evgeny Khramtsov 295015a8cb Fix startup order of ejabberd_sup children 2019-07-15 12:53:26 +03:00
Evgeny Khramtsov e1eedd587d Remove processing of {wait, _} result in gen_mod
This is no longer needed
2019-07-15 12:43:55 +03:00
Evgeny Khramtsov a4e19b7108 Increase shutdown time to 5 seconds 2019-07-15 12:43:32 +03:00
Evgeny Khramtsov 87b8344ede Attach mod_muc_room processes to a supervisor 2019-07-15 12:43:05 +03:00
Evgeny Khramtsov 1fe1322bc1 Improve some validators 2019-07-15 09:59:07 +03:00
Holger Weiss cd36bb6eda mod_http_fileserver: Unregister 'reopen_log_hook'
Unregister the global 'reopen_log_hook' on termination if the module isn't
loaded for another host.
2019-07-14 15:16:13 +02:00
Evgeny Khramtsov 15dcff92e8 Use correct virtual host when consulting trusted_proxies 2019-07-13 12:20:06 +03:00
Evgeny Khramtsov 9c2392f6e9 Merge branch 'master' of github.com:processone/ejabberd 2019-07-13 10:35:06 +03:00
Evgeny Khramtsov 6013b4a3a6 Fix broken ejabberd_cluster:call/5 2019-07-13 10:34:59 +03:00
Paweł Chmielowski f0bbc05b7a Make sure that configure is run before pc:compile on rebar3 2019-07-12 15:00:12 +02:00
Paweł Chmielowski 948578b55b Downgrade jose to version that works with rebar2 and del warning_as_error from it's config 2019-07-12 14:55:01 +02:00
Paweł Chmielowski 5a927049ef Bump jose version 2019-07-12 13:02:10 +02:00
Evgeny Khramtsov f0c0e4a6fc Don't crash when attempt to get an option for unknown virtual host
Log a warning instead and retry with a global scope
2019-07-12 13:59:33 +03:00
Evgeny Khramtsov 696c64064b Add call/5 and multicall/5 to ejabberd_cluster 2019-07-12 13:58:46 +03:00
Evgeny Khramtsov 53dacb3825 Use ejabberd_cluster:call() instead of rpc:call() 2019-07-12 12:30:38 +03:00
Evgeny Khramtsov 6f5d99275b Process unexpected messages uniformly 2019-07-12 11:55:36 +03:00
Evgeny Khramtsov 19cbbf69b2 Improve previous commit 2019-07-11 00:13:39 +03:00
Evgeny Khramtsov 6fd736d496 Gracefully report invalid encoding of a translation file 2019-07-11 00:04:32 +03:00
Evgeny Khramtsov b0379db5a1 Fix formatting 2019-07-10 23:46:42 +03:00
Evgeny Khramtsov d1b5844d64 Merge pull request #2900 from aquarhead/protect-muc-owner
Protect against bad muc#owner requests
2019-07-10 23:46:08 +03:00
Evgeny Khramtsov 9dedbe30ba Make sure configuration file path always represented as binary()
Fixes #2936
2019-07-10 23:35:53 +03:00
Evgeny Khramtsov bfa3125a81 Fix Elixir modules detection in the configuration file
Fixes #2937
2019-07-10 23:17:53 +03:00
Evgeny Khramtsov 5700089187 Gracefully close inbound s2s connections 2019-07-10 12:15:58 +03:00
Evgeny Khramtsov 722864666d Add/improve type specs 2019-07-10 10:31:51 +03:00
Evgeny Khramtsov 691f9e0bf7 Improve error handling/reporting when loading language translations
Also speed up loading on multi-core machines
2019-07-10 10:30:11 +03:00
Evgeny Khramtsov 04ccba0347 Fall back to map/2 and foreach/2 on single-core machines 2019-07-10 10:28:37 +03:00
Evgeny Khramtsov 01f531b3d6 Add type specs for mod_adhoc 2019-07-09 17:02:54 +03:00
Evgeny Khramtsov f19b41fd19 Improve type specs for ejabberd_s2s
Also minor code cleanup
2019-07-09 16:42:24 +03:00
Evgeny Khramtsov 43da45cf67 Improve type specs of mod_muc_room 2019-07-09 15:21:17 +03:00
Evgeny Khramtsov 11fa02cd6c Improve type specs of mod_roster 2019-07-09 14:30:59 +03:00
Evgeny Khramtsov 590849e2c3 Avoid returning 'stopped' from ejabberd_hooks:run_fold() 2019-07-09 14:30:25 +03:00
Evgeny Khramtsov f7ad25108c Get rid of unused API functions in ejabberd_hooks
Also improve code formatting and type specs
2019-07-09 01:26:48 +03:00
Evgeny Khramtsov 3e88a0b0b4 Don't expose internal FSM API of ejabberd_c2s 2019-07-09 01:01:56 +03:00
Evgeny Khramtsov 9cbc0685db Don't expose internal FSM API of mod_muc_room 2019-07-09 00:47:54 +03:00
Evgeny Khramtsov cbe84eb50c Check virtual host before running the command 2019-07-08 23:14:31 +03:00
Evgeny Khramtsov 0545e0a797 Ignore late arrival of an already cancelled timer 2019-07-08 19:32:37 +03:00
Evgeny Khramtsov e8eb6bc2b4 Avoid crashing of ejabberd_iq process on invalid callback 2019-07-08 10:45:13 +03:00
Evgeny Khramtsov d4d352492c Debug hooks 2019-07-08 09:57:33 +03:00
Evgeny Khramtsov 83e6741117 Use maps instead of dict 2019-07-08 09:55:32 +03:00
Evgeny Khramtsov 92ab59a581 Use ets and maps instead of dict 2019-07-08 09:46:50 +03:00
Evgeny Khramtsov 80beb6d6f6 Improve formatting of exceptions 2019-07-07 22:12:14 +03:00
Evgeny Khramtsov 368858a744 Fix return type in try_set_password()
Fixes #2932
2019-07-07 12:16:04 +03:00
Evgeny Khramtsov fd8e5ffce7 Avoid routing packets through a single process 2019-07-06 12:30:57 +03:00
Evgeny Khramtsov 1663e78cf7 Fix validator of option ejabberd_service->hosts
Fixes #2929
2019-07-06 10:38:25 +03:00
Evgeny Khramtsov 61a58f6e67 Do not call the same function twice 2019-07-06 10:21:01 +03:00
Paweł Chmielowski 756adaba55 Restore room when receiving message or generic iq for not started room 2019-07-05 13:46:48 +02:00
Paweł Chmielowski d7e86d1d32 Limit number of rooms that we return for disco_items from muc
We will limit it to max_room_discoitems and return rsm that would allow
fetching more
2019-07-05 11:08:32 +02:00
Evgeny Khramtsov f82de80c66 Add forgotten file 2019-07-05 10:49:27 +03:00
Evgeny Khramtsov b3caade0a0 Distribute routing of MUC messages accross all CPU cores
Also relay as less stanzas as possible through mod_muc workers
2019-07-05 10:35:31 +03:00
Evgeny Khramtsov 05461d1686 Propagate max_fsm_queue to all modules started as gen_server 2019-07-04 10:26:59 +03:00
Evgeny Khramtsov d411e68a2e Make return type of sql_transaction() consistent 2019-07-04 09:27:51 +03:00
Evgeny Khramtsov 4658d478b4 Don't call ejabberd_option from ejabberd_options 2019-07-03 19:23:05 +03:00
Evgeny Khramtsov b7f6620166 Fix jwt_key option processing 2019-07-03 19:16:54 +03:00
Evgeny Khramtsov 0d0ad9d1d9 Use correct virtual host 2019-07-03 19:08:38 +03:00
Evgeny Khramtsov 8180bc22ee Fix formatting 2019-07-03 12:58:59 +03:00
Evgeny Khramtsov 6e2502ea7d Monitor routes
Clean route table from the process that died unexpectedly.
This usually may happen when the corresponding process
gets killed by OOM killer during overload.
2019-07-03 10:39:03 +03:00
Evgeny Khramtsov 0fc190e2ef Fix 'request_handlers' transformation
Fixes #2925
2019-07-03 09:54:56 +03:00
Evgeny Khramtsov 9f9e308241 Avoid using ! in ejabberd_router and mod_offline 2019-07-03 09:42:18 +03:00
Alexey Shchepin ff6884f313 Read jwt_key from file 2019-07-03 05:33:35 +03:00
Evgeny Khramtsov f68da70f3e Avoid last handled stanzas cache to grow indefinitely 2019-07-01 20:43:57 +03:00
Badlop 052894d608 Update Spanish and Catalan translations 2019-07-01 17:51:42 +02:00
Paweł Chmielowski 40c360c607 Invalidate proper cache when using mam for offline in pop_messages 2019-07-01 14:30:39 +02:00
Alexey Shchepin 8956b7d60d Fix a condition in ejabberd_auth_jwt 2019-07-01 14:44:28 +03:00
Paweł Chmielowski 3e8f3573a3 Make count_offline_messages cache work when offline uses mam for storage
This also replace existing cache for checking if spool is empty with this
cache.
2019-07-01 13:36:41 +02:00
Evgeny Khramtsov c5fde9d5af Get rid of useless dialyzer instructions 2019-07-01 10:36:20 +03:00
Evgeny Khramtsov 9912f981c0 Bump cache_tab version 2019-07-01 09:26:56 +03:00
Evgeny Khramtsov 3d82a5eee6 Fix ejabberd_auth_jwt return types and regenerate ejabberd_option.erl 2019-07-01 09:05:33 +03:00
Alexey Shchepin 3e5c0a1df8 Authentication using JWT tokens 2019-07-01 05:01:55 +03:00
Evgeny Khramtsov 4aebd2fd8e Cache number of offline messages 2019-06-30 21:14:37 +03:00
Evgeny Khramtsov 253ec13971 Use new ets_cache API in ejabberd_auth 2019-06-30 17:15:43 +03:00
Evgeny Khramtsov a2a061c1c8 Avoid using broad p1_queue:queue() type wherever possible 2019-06-28 22:16:29 +03:00
Evgeny Khramtsov 6011135d24 Use yconf validator for custom Mnesia schemas 2019-06-27 15:23:21 +03:00
Evgeny Khramtsov 39cf8d86d6 Avoid using broad map() type wherever possible 2019-06-27 15:22:27 +03:00
Evgeny Khramtsov 6b684c866b Use correct rr_type() 2019-06-27 11:35:56 +03:00
Evgeny Khramtsov 2abca350e0 Fix type specs 2019-06-27 11:32:54 +03:00
Evgeny Khramtsov 4e5daf4d72 Make sure queue bouncing doesn't yield into infinite recursion 2019-06-26 11:56:25 +03:00
Evgeny Khramtsov ffe1c722e0 Deprecate 'route_subdomains' option
This option was introduced to fulfill requirement of RFC3920 10.3,
but in practice it was very inconvenient and many admins were
forced to change its value to 's2s' (i.e. to behaviour that
violates the RFC). Also, it seems like in RFC6120 this requirement
no longer presents.

Those admins who used this option to block s2s with their subdomains
can use 's2s_access' option for the same purpose.
2019-06-26 10:45:58 +03:00
Evgeny Khramtsov b479fe5315 Use correct stacktrace in logging macros
By calling erlang:get_stacktrace() inside a lager function
we obtain actually a stacktrace of the lager function, not
the one we got during exception. This is not a problem for
newest Erlang versions though.
2019-06-26 00:05:41 +03:00
Evgeny Khramtsov 6697a3e3f1 Use proper loglevel to log resumption failures 2019-06-25 20:42:54 +03:00
Paweł Chmielowski 7b35690bc9 Store muc_subscribers in process dict if get_subscribed_rooms not available 2019-06-25 16:41:47 +02:00
Evgeny Khramtsov 8b300d734b Don't propagate downstream already handled message 2019-06-25 14:36:17 +03:00
Evgeny Khramtsov 28b1d88772 Call ejabberd_s2s:allow_host/2 with correct virtual host 2019-06-24 21:18:57 +03:00
Evgeny Khramtsov 49214d9cc5 Report invalid translation strings 2019-06-24 21:09:29 +03:00
Evgeny Khramtsov a3e0cbbdd8 Make logging messages more consistent 2019-06-24 20:32:34 +03:00
Evgeny Khramtsov 370226417a Check if mod_last is loaded before calling its functions 2019-06-24 18:47:51 +03:00
Evgeny Khramtsov 2e35252aed Use "begin ... end" in logging macros 2019-06-24 18:47:19 +03:00
Evgeny Khramtsov db9e8220ec Deprecated access_commands option 2019-06-24 17:20:29 +03:00
Evgeny Khramtsov 1d239ec6fb Make ejabberd_xmlrpc working as a listening module again
Fixes #2915
2019-06-24 17:13:34 +03:00
Evgeny Khramtsov d0b65a3c95 Don't crash on empty avatar data 2019-06-24 17:00:51 +03:00
Evgeny Khramtsov c2cbb4d879 Use correct virtual host for s2s options 2019-06-23 19:37:54 +03:00
Evgeny Khramtsov 4b65fcab62 Avoid code duplication in gen_mod 2019-06-23 17:06:53 +03:00
Evgeny Khramtsov deee194522 Let it crash on unspecified option 2019-06-23 16:54:01 +03:00
Evgeny Khramtsov abbf8dad6b Update Russian msg file 2019-06-23 14:19:57 +03:00
Evgeny Khramtsov 523a65b711 Update Russian PO file 2019-06-23 14:19:15 +03:00
Evgeny Khramtsov 83c291c064 Respond with 'Bad Request' to unexpected 'Host' header
Where "unexpected" means the host in 'Host' header is not
a registered route. The rationale is to avoid propagation
of uknown "Host" further in the code, which may lead to
nasty errors related to reading configuration values, calling
functions from ejabberd_router.erl, etc.
2019-06-23 13:12:00 +03:00
Evgeny Khramtsov e477a8c220 Validate and set 'version' option at an earlier stage 2019-06-23 12:23:22 +03:00
Evgeny Khramtsov e31373a86c Run "make translations" 2019-06-22 18:15:35 +03:00
Evgeny Khramtsov e788592a88 Generate paths for poedit 2019-06-22 18:07:36 +03:00
Evgeny Khramtsov 1ca61821c6 Update extract-tr.sh script 2019-06-22 17:24:15 +03:00
Evgeny Khramtsov 00f2a736eb Improve extraction of translated strings
Now every such string MUST be encapsulated into ?T() macro.
The macro itself is defined in include/translate.hrl.
Example:

-module(foo).
-export([bar/1]).
-include("translate.hrl").

bar(Lang) ->
    translate:translate(Lang, ?T("baz")).
2019-06-22 17:08:45 +03:00
Evgeny Khramtsov 2d158671c8 Change Travis OTP platform from 19.1 to 19.3
Seems like Travis has problems with OTPs below 19.3
2019-06-22 13:15:11 +03:00
Evgeny Khramtsov 9d64e706f8 Disable Elixir in Travis tests 2019-06-22 11:03:29 +03:00
Evgeny Khramtsov 4f69325e3c Fix shaper selection in ejabberd_c2s 2019-06-22 10:19:17 +03:00
Evgeny Khramtsov e9a78d0de7 Make option 'validate_stream' global 2019-06-21 21:06:32 +03:00
Evgeny Khramtsov a0d3fb3b23 Don't attempt to query 'undefined' active list
Also code formatting was improved
2019-06-21 19:37:47 +03:00
Evgeny Khramtsov 72572d990a Allow multiple definitions of host_config and append_host_config 2019-06-21 15:37:51 +03:00
Evgeny Khramtsov f3d5916236 Correct mod_mix_pam protocol version
Fixes #2913
2019-06-21 14:47:10 +03:00
Evgeny Khramtsov be35350b9c Fix usage of TLS in mod_mqtt
Fixes #2919
2019-06-21 14:39:46 +03:00
Holger Weiss 026540f7e6 mod_pubsub: Check access_model when publishing PEP
Don't just adhere to the node's access_model when delivering the last
PEP item but also when a new item is published.

Many thanks to Philipp Hrist for spotting this.
2019-06-20 18:18:14 +02:00
Evgeny Khramtsov 27a1771deb Fix creation of type spec for map() options 2019-06-20 19:09:36 +03:00
Badlop c318b5f8a2 Rename remaining command arguments from Server to Host (#2908) 2019-06-19 09:31:12 +02:00
Badlop fb77e2e8c0 Add support for backwards compatibility in command argument names (#2908) 2019-06-19 09:30:53 +02:00
Badlop ad98d4a515 Fix support for nonexistent or empty access_commands in ejabberd_xmlrpc 2019-06-19 09:19:32 +02:00
Evgeny Khramtsov 5a5f188767 Require opt_type/1 callback 2019-06-17 20:51:04 +03:00
Evgeny Khramtsov ef3753aa86 Generate more readable exception 2019-06-17 20:49:43 +03:00
Evgeny Khramtsov 794e19aaf1 Set yconf version in mix.exs explicitly 2019-06-17 19:50:44 +03:00
Evgeny Khramtsov 91d9d076f9 Synchronize macros from rebar.config with mix.exs 2019-06-17 19:30:25 +03:00
Evgeny Khramtsov b6f037ced6 Add yconf application to mix.exs 2019-06-17 19:19:27 +03:00
Evgeny Khramtsov 0c4818daca Reflect recent pubsub changes in configuration transformer 2019-06-17 13:42:58 +03:00
Christophe Romain 4fe995c272 Add helper to check xep implementations and versions 2019-06-17 12:02:23 +02:00
Evgeny Khramtsov 21d9bd8325 Bump supported version of XEP-0355 2019-06-17 12:53:15 +03:00
Christophe Romain e2c954b2e0 Remote obsolete pubsub config from tests 2019-06-17 11:39:46 +02:00
Evgeny Khramtsov 50af436fad Fix component routes unregistration
Fixes #2910
2019-06-17 12:29:04 +03:00
Christophe Romain c9d3beb9eb Remove deprecated pubsub plugins 2019-06-17 11:19:28 +02:00
Evgeny Khramtsov e84391a6a9 Use list_to_existing_atom/1 wherever possible 2019-06-15 15:14:45 +03:00
Evgeny Khramtsov 31050f5b09 Add PostgreSQL to Travis services 2019-06-15 13:41:13 +03:00
Evgeny Khramtsov a205ebad2b Get rid of "well-known" type 2019-06-15 12:53:16 +03:00
Evgeny Khramtsov 67fbbe7a0b Remove default_db/1 and add default_db/3
Same for default_ram_db/1 and default_ram_db/3
2019-06-15 12:10:35 +03:00
Evgeny Khramtsov ea76b87461 Ignore beams compiled by Elixir 2019-06-14 23:35:51 +03:00
Evgeny Khramtsov 56a0e736c7 Accept output argument in tools/opt_types.sh 2019-06-14 23:19:08 +03:00
Evgeny Khramtsov cfaed70fe3 Warn about 'service_url' option during config transformation 2019-06-14 17:38:55 +03:00
Evgeny Khramtsov 9e2e590061 Fix exception formatting on old Erlang 2019-06-14 16:58:39 +03:00
Evgeny Khramtsov 377748b688 Fix validator of mod_avatar 2019-06-14 16:42:22 +03:00
Evgeny Khramtsov d85cf7780c Introduce option 'captcha_url'
Option 'captcha_host' is now deprecated in favor of 'captcha_url'.
However, it's not replaced automatically at startup, i.e. both options
are supported with 'captcha_url' being the preferred one.
2019-06-14 16:06:04 +03:00
Evgeny Khramtsov a589843abd Remove mod_echo module 2019-06-14 14:47:46 +03:00
Holger Weiss 6fb8ae4d2f Travis CI: Ensure MySQL is started
It seems MySQL isn't always fully started before 'mysql_upgrade' is
called.
2019-06-14 13:08:46 +02:00
Evgeny Khramtsov 9e158a3835 Add forgotten header file 2019-06-14 13:36:28 +03:00
Paweł Chmielowski b952c4f294 Use commit id instead of branch name to specify deps in rebar.config 2019-06-14 12:16:13 +02:00
Evgeny Khramtsov a02cff0e78 Use new configuration validator 2019-06-14 12:33:26 +03:00
Paweł Chmielowski d48c067681 Return jid_malformed error when sending presence without nick to conference 2019-06-13 18:42:02 +02:00
badlop b48b6dbda5 Merge pull request #2651 from Iperity/fix-privacy-race-condition
Fix mod_privacy race condition
2019-06-13 09:34:58 +02:00
Mickaël Rémond 267ce0dde0 Debug log to help troubleshoot delegation ACLs 2019-06-11 18:52:44 +02:00
Christophe Romain 88a3e1b510 Revert "Fix pubsub compliance XEP-0060 § 7.1.3.6 (#2864)"
This reverts commit 2fff4d1ea6.
This commit broke the XEP compliance. more details here
https://xmpp.org/extensions/xep-0060.html#events
2019-06-11 10:18:36 +02:00
Nathan Bruning 8410a203ec Refactor mod_privacy patch; move logic user_receive_packet to
user_send_packet.
2019-06-10 14:10:37 +02:00
Nathan Bruning aa489c5a8b Fix user_send_packet in mod_privacy; was failing on newly created users 2019-06-10 12:49:39 +02:00
Nathan Bruning 570800a540 Fix mod_privacy race condition
mod_privacy updates the c2s state in user_receive_packet, which
tracks the *result* of the IQ set for active privacy lists.

When a second stanza is sent directly after a privacy list request,
the second stanza will be processed using the old privacy list,
because the IQ result has not yet been routed.
2019-06-10 12:49:39 +02:00
Mickaël Rémond 34794b3c68 lock.yml defines locking policy for old issues 2019-06-09 11:47:18 +02:00
Evgeny Khramtsov 80b7d50628 Use system_time/1 instead of monotonic_time/1
The value of monotonic_time/1 may differ significantly between
nodes in a cluster due to different erlang:time_offset/0 values.

Thanks to Christoph Scholz for spotting this
2019-06-06 21:26:50 +03:00
LOU Xun 8d6455460d Protect against bad muc#owner requests 2019-06-06 15:40:13 +00:00
Holger Weiss 6c0d6f0774 mod_register_web: Don't crash if user exists
Since commit 633b68db11,
ejabberd_auth:try_register/3 returns {error, exists} rather than
{atomic, exists}.

Thanks to Thomas Leister for reporting the issue.
2019-06-05 18:28:35 +02:00
Paweł Chmielowski cd10d87a9c Change indentation in ejabberd.yml.example to more consistant 2019-06-04 14:51:39 +02:00
Badlop ed1cbc2c31 Fix example argument in private_set, don't include Query element 2019-05-29 19:41:36 +02:00
Holger Weiss 274a507590 mod_stream_mgmt: Drop unused code
Revert the changes applied to mod_stream_mgmt in commit
b76f90fe39, as the new implementation of
mod_offline's 'use_mam_for_storage' feature doesn't need them.
2019-05-29 00:30:59 +02:00
404 changed files with 42679 additions and 42526 deletions
+18 -9
View File
@@ -1,21 +1,30 @@
Environment
-----------
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: Kind:Bug
assignees: ''
---
## Environment
- ejabberd version: 18.09
- Erlang version: `erl +V`
- OS: Linux (Debian)
- Installed from: source | distro package | official deb/rpm | official binary installer | other
Configuration (only if needed): grep -Ev '^$|^\s*#' ejabberd.yml
---------------------------------------------------------------------------
## Configuration (only if needed): grep -Ev '^$|^\s*#' ejabberd.yml
```yaml
loglevel: 4
...
```
Errors from error.log/crash.log
-------------------------------
## Errors from error.log/crash.log
No errors
Bug description
---------------
Nothing works, plz halp :(
## Bug description
Please, give us a precise description (what does not work, what is expected, etc.)
+3 -1
View File
@@ -1,7 +1,9 @@
---
name: Feature request
about: Suggest an idea for this project
labels:
title: ''
labels: Kind:Feature
assignees: ''
---
+38
View File
@@ -0,0 +1,38 @@
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 365
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: false
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
exemptLabels: []
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: >
This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue for
related bugs.
# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: true
# Limit to only `issues` or `pulls`
# only: issues
# Optionally, specify configuration settings just for `issues` or `pulls`
# issues:
# exemptLabels:
# - help-wanted
# lockLabel: outdated
# pulls:
# daysUntilLock: 30
# Repository to extend settings from
# _extends: repo
+4 -2
View File
@@ -1,12 +1,13 @@
language: erlang
otp_release:
- 19.1
- 19.3
- 20.3
- 21.2
services:
- redis-server
- postgresql
before_install:
#
@@ -21,6 +22,7 @@ before_install:
- sudo add-apt-repository 'deb http://repo.mysql.com/apt/ubuntu/ precise mysql-5.6'
- sudo apt-get -qq update
- sudo apt-get -qq -o Dpkg::Options::=--force-confold install mysql-server
- sudo service mysql start
- sudo mysql_upgrade
# /END MYSQL 5.6
- pip install --user coveralls-merge
@@ -42,7 +44,7 @@ before_script:
script:
- ./autogen.sh
- ./configure --prefix=/tmp/ejabberd --enable-all --disable-odbc --disable-riak
- ./configure --prefix=/tmp/ejabberd --enable-all --disable-odbc --disable-elixir
- make
- make install -s
- make xref
+97 -1
View File
@@ -1,4 +1,100 @@
# Version NEXT
# Version 19.09
* Admin
- The minimum required Erlang/OTP version is now 19.3
- Fix API call using OAuth (#2982)
- Rename MUC command arguments from Host to Service (#2976)
* Webadmin
- Don't treat 'Host' header as a virtual XMPP host (#2989)
- Fix some links to Guide in WebAdmin and add new ones (#3003)
- Use select fields to input host in WebAdmin Backup (#3000)
- Check account auth provided in WebAdmin is a local host (#3000)
* ACME
- Improve ACME implementation
- Fix IDA support in ACME requests
- Fix unicode formatting in ACME module
- Log an error message on IDNA failure
- Support IDN hostnames in ACME requests
- Don't attempt to create ACME directory on ejabberd startup
- Don't allow requesting certificates for localhost or IP-like domains
- Don't auto request certificate for localhost and IP-like domains
- Add listener for ACME challenge in example config
* Authentication
- JWT-only authentication for some users (#3012)
* MUC
- Apply default role after revoking admin affiliation (#3023)
- Custom exit message is not broadcast (#3004)
- Revert "Affiliations other than admin and owner cannot invite to members_only rooms" (#2987)
- When join new room with password, set pass and password_protected (#2668)
- Improve rooms_* commands to accept 'global' as MUC service argument (#2976)
- Rename MUC command arguments from Host to Service (#2976)
* SQL
- Fix transactions for Microsoft SQL Server (#2978)
- Spawn SQL connections on demand only
* Misc
- Add support for XEP-0328: JID Prep
- Added gsfonts for captcha
- Log Mnesia table type on creation
- Replicate Mnesia 'bosh' table when nodes are joined
- Fix certificate selection for s2s (#3015)
- Provide meaningful error when adding non-local users to shared roster (#3000)
- Websocket: don't treat 'Host' header as a virtual XMPP host (#2989)
- Fix sm ack related c2s error (#2984)
- Don't hide the reason why c2s connection has failed
- Unicode support
- Correctly handle unicode in log messages
- Fix unicode processing in ejabberd.yml
# Version 19.08
* Administration
- Improve ejabberd halting procedure
- Process unexpected erlang messages uniformly: logging a warning
- mod_configure: Remove modules management
* Configuration
- Use new configuration validator
- ejabberd_http: Use correct virtual host when consulting trusted_proxies
- Fix Elixir modules detection in the configuration file
- Make option 'validate_stream' global
- Allow multiple definitions of host_config and append_host_config
- Introduce option 'captcha_url'
- mod_stream_mgmt: Allow flexible timeout format
- mod_mqtt: Allow flexible timeout format in session_expiry option
* Misc
- Fix SQL connections leakage
- New authentication method using JWT tokens
- extauth: Add 'certauth' command
- Improve SQL pool logic
- Add and improve type specs
- Improve extraction of translated strings
- Improve error handling/reporting when loading language translations
- Improve hooks validator and fix bugs related to hooks registration
- Gracefully close inbound s2s connections
- mod_mqtt: Fix usage of TLS
- mod_offline: Make count_offline_messages cache work when using mam for storage
- mod_privacy: Don't attempt to query 'undefined' active list
- mod_privacy: Fix race condition
* MUC
- Add code for hibernating inactive muc_room processes
- Improve handling of unexpected iq in mod_muc_room
- Attach mod_muc_room processes to a supervisor
- Restore room when receiving message or generic iq for not started room
- Distribute routing of MUC messages accross all CPU cores
* PubSub
- Fix pending nodes retrieval for SQL backend
- Check access_model when publishing PEP
- Remove deprecated pubsub plugins
- Expose access_model and publish_model in pubsub#metadata
# Version 19.05
+8 -3
View File
@@ -119,6 +119,11 @@ update:
xref: all
$(REBAR) skip_deps=true xref
hooks: all
tools/hook_deps.sh ebin
options: all
tools/opt_types.sh ejabberd_option ebin
translations:
tools/prepare-tr.sh
@@ -335,8 +340,8 @@ dialyzer/erlang.plt:
@mkdir -p dialyzer
@dialyzer --build_plt --output_plt dialyzer/erlang.plt \
-o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
public_key ssl mnesia inets odbc tools compiler erts \
runtime_tools asn1 observer xmerl et gs wx syntax_tools; \
public_key ssl mnesia inets odbc compiler erts \
os_mon asn1 syntax_tools; \
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
dialyzer/deps.plt:
@@ -377,4 +382,4 @@ test:
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean rel \
install uninstall uninstall-binary uninstall-all translations deps test \
quicktest erlang_plt deps_plt ejabberd_plt
quicktest erlang_plt deps_plt ejabberd_plt xref hooks options
+2 -1
View File
@@ -111,7 +111,8 @@ To compile ejabberd you need:
- OpenSSL ≥ 1.0.0.
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138). Optional.
- PAM library. Optional. For Pluggable Authentication Modules (PAM).
- ImageMagick's Convert program. Optional. For CAPTCHA challenges.
- ImageMagick's Convert program and Ghostscript fonts. Optional. For CAPTCHA
challenges.
If your system splits packages in libraries and development headers, you must
install the development packages also.
+4 -13
View File
@@ -109,10 +109,10 @@ AC_ARG_ENABLE(mssql,
esac],[db_type=generic])
AC_ARG_ENABLE(all,
[AC_HELP_STRING([--enable-all], [same as --enable-odbc --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-riak --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-tools (useful for Dialyzer checks, default: no)])],
[AC_HELP_STRING([--enable-all], [same as --enable-odbc --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-tools (useful for Dialyzer checks, default: no)])],
[case "${enableval}" in
yes) odbc=true mysql=true pgsql=true sqlite=true pam=true zlib=true riak=true redis=true elixir=true stun=true sip=true debug=true tools=true ;;
no) odbc=false mysql=false pgsql=false sqlite=false pam=false zlib=false riak=false redis=false elixir=false stun=false sip=false debug=false tools=false ;;
yes) odbc=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true tools=true ;;
no) odbc=false mysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false tools=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;;
esac],[])
@@ -172,14 +172,6 @@ AC_ARG_ENABLE(zlib,
*) AC_MSG_ERROR(bad value ${enableval} for --enable-zlib) ;;
esac],[if test "x$zlib" = "x"; then zlib=true; fi])
AC_ARG_ENABLE(riak,
[AC_HELP_STRING([--enable-riak], [enable Riak support (default: no)])],
[case "${enableval}" in
yes) riak=true ;;
no) riak=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-riak) ;;
esac],[if test "x$riak" = "x"; then riak=false; fi])
AC_ARG_ENABLE(redis,
[AC_HELP_STRING([--enable-redis], [enable Redis support (default: no)])],
[case "${enableval}" in
@@ -275,7 +267,7 @@ if test "$sqlite" = "true"; then
fi
enabled_backends=""
for backend in odbc mysql pgsql sqlite riak redis; do
for backend in odbc mysql pgsql sqlite redis; do
if eval test x\${$backend} = xtrue; then
if test "x$enabled_backends" = "x"; then
enabled_backends=$backend
@@ -296,7 +288,6 @@ AC_SUBST(pgsql)
AC_SUBST(sqlite)
AC_SUBST(pam)
AC_SUBST(zlib)
AC_SUBST(riak)
AC_SUBST(redis)
AC_SUBST(elixir)
AC_SUBST(stun)
+44 -54
View File
@@ -12,22 +12,10 @@
### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******
### *******************************************************
### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
### However, ejabberd treats different literals as different types:
###
### - unquoted or single-quoted strings. They are called "atoms".
### Example: dog, 'Jupiter', '3.14159', YELLOW
###
### - numeric literals. Example: 3, -45.0, .0
###
### - quoted or folded strings.
### Examples of quoted string: "Lizzard", "orange".
### Example of folded string:
### > Art thou not Romeo,
### and a Montague?
###
hosts:
- "localhost"
- localhost
loglevel: 4
log_rotate_size: 10485760
@@ -35,9 +23,10 @@ log_rotate_date: ""
log_rotate_count: 1
log_rate_limit: 100
certfiles:
- "/etc/letsencrypt/live/localhost/fullchain.pem"
- "/etc/letsencrypt/live/localhost/privkey.pem"
## If you already have certificates, list them here
# certfiles:
# - /etc/letsencrypt/live/domain.tld/fullchain.pem
# - /etc/letsencrypt/live/domain.tld/privkey.pem
listen:
-
@@ -59,18 +48,19 @@ listen:
module: ejabberd_http
tls: true
request_handlers:
"/admin": ejabberd_web_admin
"/api": mod_http_api
"/bosh": mod_bosh
"/captcha": ejabberd_captcha
"/upload": mod_http_upload
"/ws": ejabberd_http_ws
/admin: ejabberd_web_admin
/api: mod_http_api
/bosh: mod_bosh
/captcha: ejabberd_captcha
/upload: mod_http_upload
/ws: ejabberd_http_ws
-
port: 5280
ip: "::"
module: ejabberd_http
request_handlers:
"/admin": ejabberd_web_admin
/admin: ejabberd_web_admin
/.well-known/acme-challenge: ejabberd_acme
-
port: 1883
ip: "::"
@@ -84,25 +74,25 @@ acl:
user_regexp: ""
loopback:
ip:
- "127.0.0.0/8"
- "::1/128"
- 127.0.0.0/8
- ::1/128
access_rules:
local:
- allow: local
allow: local
c2s:
- deny: blocked
- allow
deny: blocked
allow: all
announce:
- allow: admin
allow: admin
configure:
- allow: admin
allow: admin
muc_create:
- allow: local
allow: local
pubsub_createnode:
- allow: local
allow: local
trusted_network:
- allow: loopback
allow: loopback
api_permissions:
"console commands":
@@ -112,26 +102,26 @@ api_permissions:
what: "*"
"admin access":
who:
- access:
- allow:
- acl: loopback
- acl: admin
- oauth:
- scope: "ejabberd:admin"
- access:
- allow:
- acl: loopback
- acl: admin
access:
allow:
acl: loopback
acl: admin
oauth:
scope: "ejabberd:admin"
access:
allow:
acl: loopback
acl: admin
what:
- "*"
- "!stop"
- "!start"
"public commands":
who:
- ip: "127.0.0.1/8"
ip: 127.0.0.1/8
what:
- "status"
- "connected_users_number"
- status
- connected_users_number
shaper:
normal: 1000
@@ -140,11 +130,11 @@ shaper:
shaper_rules:
max_user_sessions: 10
max_user_offline_messages:
- 5000: admin
- 100
5000: admin
100: all
c2s_shaper:
- none: admin
- normal
none: admin
normal: all
s2s_shaper: fast
modules:
@@ -163,7 +153,7 @@ modules:
mod_fail2ban: {}
mod_http_api: {}
mod_http_upload:
put_url: "https://@HOST@:5443/upload"
put_url: https://@HOST@:5443/upload
mod_last: {}
mod_mam:
## Mnesia is limited to 2GB, better to use an SQL backend
@@ -196,11 +186,11 @@ modules:
mod_pubsub:
access_createnode: pubsub_createnode
plugins:
- "flat"
- "pep"
- flat
- pep
force_node_config:
## Avoid buggy clients to make their bookmarks public
"storage:bookmarks":
storage:bookmarks:
access_model: whitelist
mod_push: {}
mod_push_keepalive: {}
-53
View File
@@ -1,53 +0,0 @@
-record(challenge, {
type = <<"http-01">> :: bitstring(),
status = pending :: pending | valid | invalid,
uri = "" :: url(),
token = <<"">> :: bitstring()
}).
-record(data_acc, {
id :: list(),
ca_url :: url(),
key :: jose_jwk:key()
}).
-type data_acc() :: #data_acc{}.
-record(data_cert, {
domain :: bitstring(),
pem :: pem(),
path :: string()
}).
-type data_cert() :: #data_cert{}.
%%
%% Types
%%
%% Acme configuration
-type acme_config() :: [{ca_url, url()} | {contact, bitstring()}].
%% The main data type that ejabberd_acme keeps
-type acme_data() :: proplist().
%% The list of certificates kept in data
-type data_certs() :: proplist(bitstring(), data_cert()).
%% The certificate saved in pem format
-type pem() :: bitstring().
-type nonce() :: string().
-type url() :: string().
-type proplist() :: [{_, _}].
-type proplist(X,Y) :: [{X,Y}].
-type dirs() :: #{string() => url()}.
-type jws() :: map().
-type handle_resp_fun() :: fun(({ok, proplist(), proplist()}) -> {ok, _, nonce()}).
-type acme_challenge() :: #challenge{}.
%% Options
-type account_opt() :: string().
-type verbose_opt() :: string().
-type domains_opt() :: string().
+1
View File
@@ -59,6 +59,7 @@
%% access is: [accessRuleName] or [{Module, AccessOption, DefaultAccessRuleName}]
access = [] :: [{atom(),atom(),atom()}|atom()],
result = {res, rescode} :: rterm() | '_' | '$2',
args_rename = [] :: [{atom(),atom()}],
args_desc = none :: none | [string()] | '_',
result_desc = none :: none | string() | '_',
args_example = none :: none | [any()] | '_',
+1 -1
View File
@@ -23,7 +23,7 @@
path = [] :: [binary()],
q = [] :: [{binary() | nokey, binary()}],
us = {<<>>, <<>>} :: {binary(), binary()},
auth :: {binary(), binary()} | {oauth, binary(), []} | undefined,
auth :: {binary(), binary()} | {oauth, binary(), []} | undefined | invalid,
lang = <<"">> :: binary(),
data = <<"">> :: binary(),
ip :: {inet:ip_address(), inet:port_number()},
+3 -3
View File
@@ -2,7 +2,7 @@
-type local_hint() :: integer() | {apply, atom(), atom()}.
-record(route, {domain :: binary() | '_',
server_host :: binary() | '_',
-record(route, {domain :: binary(),
server_host :: binary(),
pid :: undefined | pid(),
local_hint :: local_hint() | undefined | '_'}).
local_hint :: local_hint() | undefined}).
+1 -1
View File
@@ -30,7 +30,7 @@
-type info() :: [{conn, atom()} | {ip, ip()} | {node, atom()}
| {oor, boolean()} | {auth_module, atom()}
| {num_stanzas_in, non_neg_integer()}
| offline].
| {atom(), term()}].
-type prio() :: undefined | integer().
-endif.
+41
View File
@@ -0,0 +1,41 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2019 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.,
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%%%
%%%----------------------------------------------------------------------
-define(SQL_MARK, sql__mark_).
-define(SQL(SQL), ?SQL_MARK(SQL)).
-define(SQL_UPSERT_MARK, sql_upsert__mark_).
-define(SQL_UPSERT(Host, Table, Fields),
ejabberd_sql:sql_query(Host, ?SQL_UPSERT_MARK(Table, Fields))).
-define(SQL_UPSERT_T(Table, Fields),
ejabberd_sql:sql_query_t(?SQL_UPSERT_MARK(Table, Fields))).
-define(SQL_INSERT_MARK, sql_insert__mark_).
-define(SQL_INSERT(Table, Fields), ?SQL_INSERT_MARK(Table, Fields)).
-record(sql_query, {hash :: binary(),
format_query :: fun(),
format_res :: fun(),
args :: fun(),
loc :: {module(), pos_integer()}}).
-record(sql_escape, {string :: fun((binary()) -> binary()),
integer :: fun((integer()) -> binary()),
boolean :: fun((boolean()) -> binary()),
in_array_string :: fun((binary()) -> binary())}).
+2 -16
View File
@@ -17,19 +17,5 @@
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%%%
%%%----------------------------------------------------------------------
-define(SQL_MARK, sql__mark_).
-define(SQL(SQL), ?SQL_MARK(SQL)).
-define(SQL_UPSERT_MARK, sql_upsert__mark_).
-define(SQL_UPSERT(Host, Table, Fields),
ejabberd_sql:sql_query(Host, ?SQL_UPSERT_MARK(Table, Fields))).
-define(SQL_UPSERT_T(Table, Fields),
ejabberd_sql:sql_query_t(?SQL_UPSERT_MARK(Table, Fields))).
-define(SQL_INSERT_MARK, sql_insert__mark_).
-define(SQL_INSERT(Table, Fields), ?SQL_INSERT_MARK(Table, Fields)).
-record(sql_query, {hash, format_query, format_res, args, loc}).
-record(sql_escape, {string, integer, boolean, in_array_string}).
-compile([{parse_transform, ejabberd_sql_pt}]).
-include("ejabberd_sql.hrl").
+7 -9
View File
@@ -37,14 +37,12 @@
-define(XAC(Name, Attrs, Text),
?XAE(Name, Attrs, [?C(Text)])).
-define(T(Text), translate:translate(Lang, Text)).
-define(CT(Text), ?C((translate:translate(Lang, Text)))).
-define(CT(Text), ?C((?T(Text)))).
-define(XCT(Name, Text), ?XC(Name, (?T(Text)))).
-define(XCT(Name, Text), ?XC(Name, (translate:translate(Lang, Text)))).
-define(XACT(Name, Attrs, Text),
?XAC(Name, Attrs, (?T(Text)))).
?XAC(Name, Attrs, (translate:translate(Lang, Text)))).
-define(LI(Els), ?XE(<<"li">>, Els)).
@@ -53,7 +51,7 @@
-define(AC(URL, Text), ?A(URL, [?C(Text)])).
-define(ACT(URL, Text), ?AC(URL, (?T(Text)))).
-define(ACT(URL, Text), ?AC(URL, (translate:translate(Lang, Text)))).
-define(P, ?X(<<"p">>)).
@@ -65,7 +63,7 @@
{<<"value">>, Value}])).
-define(INPUTT(Type, Name, Value),
?INPUT(Type, Name, (?T(Value)))).
?INPUT(Type, Name, (translate:translate(Lang, Value)))).
-define(INPUTS(Type, Name, Value, Size),
?XA(<<"input">>,
@@ -73,7 +71,7 @@
{<<"value">>, Value}, {<<"size">>, Size}])).
-define(INPUTST(Type, Name, Value, Size),
?INPUT(Type, Name, (?T(Value)), Size)).
?INPUT(Type, Name, (translate:translate(Lang, Value)), Size)).
-define(ACLINPUT(Text),
?XE(<<"td">>,
@@ -90,7 +88,7 @@
?XAC(<<"p">>, [{<<"class">>, <<"result">>}], Text)).
%% Guide Link
-define(XREST(Text), ?XRES((?T(Text)))).
-define(XREST(Text), ?XRES((translate:translate(Lang, Text)))).
-define(GL(Ref, Title),
?XAE(<<"div">>, [{<<"class">>, <<"guidelink">>}],
+16
View File
@@ -44,6 +44,7 @@
attributes = [] :: [{binary(), [binary()]}]}).
-type tlsopts() :: [{encrypt, tls | starttls | none} |
{tls_certfile, binary() | undefined} |
{tls_cacertfile, binary() | undefined} |
{tls_depth, non_neg_integer() | undefined} |
{tls_verify, hard | soft | false}].
@@ -61,3 +62,18 @@
-type eldap_config() :: #eldap_config{}.
-type eldap_search() :: #eldap_search{}.
-type eldap_entry() :: #eldap_entry{}.
-define(eldap_config(M, H),
#eldap_config{
servers = M:ldap_servers(H),
backups = M:ldap_backups(H),
tls_options = [{encrypt, M:ldap_encrypt(H)},
{tls_verify, M:ldap_tls_verify(H)},
{tls_certfile, M:ldap_tls_certfile(H)},
{tls_cacertfile, M:ldap_tls_cacertfile(H)},
{tls_depth, M:ldap_tls_depth(H)}],
port = M:ldap_port(H),
dn = M:ldap_rootdn(H),
password = M:ldap_password(H),
base = M:ldap_base(H),
deref_aliases = M:ldap_deref_aliases(H)}).
+5 -5
View File
@@ -22,19 +22,19 @@
-compile([{parse_transform, lager_transform}]).
-define(DEBUG(Format, Args),
lager:debug(Format, Args)).
begin lager:debug(Format, Args), ok end).
-define(INFO_MSG(Format, Args),
lager:info(Format, Args)).
begin lager:info(Format, Args), ok end).
-define(WARNING_MSG(Format, Args),
lager:warning(Format, Args)).
begin lager:warning(Format, Args), ok end).
-define(ERROR_MSG(Format, Args),
lager:error(Format, Args)).
begin lager:error(Format, Args), ok end).
-define(CRITICAL_MSG(Format, Args),
lager:critical(Format, Args)).
begin lager:critical(Format, Args), ok end).
%% Use only when trying to troubleshoot test problem with ExUnit
-define(EXUNIT_LOG(Format, Args),
+6 -6
View File
@@ -19,12 +19,12 @@
%%%----------------------------------------------------------------------
-record(archive_msg,
{us = {<<"">>, <<"">>} :: {binary(), binary()} | '$2',
id = <<>> :: binary() | '_',
timestamp = erlang:timestamp() :: erlang:timestamp() | '_' | '$1',
peer = {<<"">>, <<"">>, <<"">>} :: ljid() | '_' | '$3' | undefined,
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid() | '_' | '$3',
packet = #xmlel{} :: xmlel() | message() | '_',
{us = {<<"">>, <<"">>} :: {binary(), binary()},
id = <<>> :: binary(),
timestamp = erlang:timestamp() :: erlang:timestamp(),
peer = {<<"">>, <<"">>, <<"">>} :: ljid() | undefined,
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid(),
packet = #xmlel{} :: xmlel() | message(),
nick = <<"">> :: binary(),
type = chat :: chat | groupchat}).
+24 -14
View File
@@ -24,11 +24,13 @@
-record(lqueue,
{
queue :: p1_queue:queue(),
max = 0 :: integer()
queue = p1_queue:new() :: p1_queue:queue(lqueue_elem()),
max = 0 :: integer()
}).
-type lqueue() :: #lqueue{}.
-type lqueue_elem() :: {binary(), message(), boolean(),
erlang:timestamp(), non_neg_integer()}.
-record(config,
{
@@ -63,7 +65,7 @@
captcha_whitelist = (?SETS):empty() :: gb_sets:set(),
mam = false :: boolean(),
pubsub = <<"">> :: binary(),
lang = ejabberd_config:get_mylang() :: binary()
lang = ejabberd_option:language() :: binary()
}).
-type config() :: #config{}.
@@ -89,8 +91,8 @@
{
message_time = 0 :: integer(),
presence_time = 0 :: integer(),
message_shaper = none :: shaper:shaper(),
presence_shaper = none :: shaper:shaper(),
message_shaper = none :: ejabberd_shaper:shaper(),
presence_shaper = none :: ejabberd_shaper:shaper(),
message :: message() | undefined,
presence :: {binary(), presence()} | undefined
}).
@@ -103,18 +105,26 @@
access = {none,none,none,none,none} :: {atom(), atom(), atom(), atom(), atom()},
jid = #jid{} :: jid(),
config = #config{} :: config(),
users = #{} :: map(),
subscribers = #{} :: map(),
subscriber_nicks = #{} :: map(),
users = #{} :: users(),
subscribers = #{} :: subscribers(),
subscriber_nicks = #{} :: subscriber_nicks(),
last_voice_request_time = treap:empty() :: treap:treap(),
robots = #{} :: map(),
nicks = #{} :: map(),
affiliations = #{} :: map(),
history :: lqueue(),
robots = #{} :: robots(),
nicks = #{} :: nicks(),
affiliations = #{} :: affiliations(),
history = #lqueue{} :: lqueue(),
subject = [] :: [text()],
subject_author = <<"">> :: binary(),
just_created = erlang:system_time(microsecond) :: true | integer(),
activity = treap:empty() :: treap:treap(),
room_shaper = none :: shaper:shaper(),
room_queue :: p1_queue:queue() | undefined
room_shaper = none :: ejabberd_shaper:shaper(),
room_queue :: p1_queue:queue({message | presence, jid()}) | undefined,
hibernate_timer = none :: reference() | none | hibernating
}).
-type users() :: #{ljid() => #user{}}.
-type robots() :: #{jid() => {binary(), stanza()}}.
-type nicks() :: #{binary() => [ljid()]}.
-type affiliations() :: #{ljid() => affiliation() | {affiliation(), binary()}}.
-type subscribers() :: #{ljid() => #subscriber{}}.
-type subscriber_nicks() :: #{binary() => [ljid()]}.
+3 -3
View File
@@ -26,7 +26,7 @@
-define(MAXITEMS, 10).
%% this is currently a hard limit.
%% Would be nice to have it configurable.
%% Would be nice to have it configurable.
-define(MAX_PAYLOAD_SIZE, 250000).
%% -------------------------------
@@ -58,7 +58,7 @@
%% note: pos_integer() should always be used, but we allow anything else coded
%% as binary, so one can have a custom implementation of nodetree with custom
%% indexing (see nodetree_virtual). this also allows to use any kind of key for
%% indexing nodes, as this can be usefull with external backends such as sql.
%% indexing nodes, as this can be useful with external backends such as sql.
-type(itemId() :: binary()).
%% @type itemId() = string().
@@ -84,7 +84,7 @@
Value::binary() | [binary()] | boolean()
}).
-type(subOptions() :: [mod_pubsub:subOption(),...]).
-type(subOptions() :: [mod_pubsub:subOption()]).
-type(pubOption() ::
{Option::binary(),
+1 -1
View File
@@ -15,7 +15,7 @@ defmodule Mix.Tasks.Ejabberd.Deps.Tree do
# First we need to start manually the store to be available
# during the compilation of the config file.
Ejabberd.Config.Store.start_link
Ejabberd.Config.init(:ejabberd_config.get_ejabberd_config_path())
Ejabberd.Config.init(:ejabberd_config.path())
Mix.shell.info "ejabberd modules"
+10 -10
View File
@@ -3,7 +3,7 @@ defmodule Ejabberd.Mixfile do
def project do
[app: :ejabberd,
version: "19.5.0",
version: "19.9.0",
description: description(),
elixir: "~> 1.4",
elixirc_paths: ["lib"],
@@ -29,7 +29,8 @@ defmodule Ejabberd.Mixfile do
included_applications: [:lager, :mnesia, :inets, :p1_utils, :cache_tab,
:fast_tls, :stringprep, :fast_xml, :xmpp, :mqtree,
:stun, :fast_yaml, :esip, :jiffy, :p1_oauth2,
:eimp, :base64url, :jose, :pkix, :os_mon]
:eimp, :base64url, :jose, :pkix, :os_mon, :yconf,
:p1_acme, :idna]
++ cond_apps()]
end
@@ -55,10 +56,7 @@ defmodule Ejabberd.Mixfile do
includes = ["include"] ++ deps_include(["fast_xml", "xmpp", "p1_utils"])
[:debug_info, {:d, :ELIXIR_ENABLED}] ++ cond_options() ++ Enum.map(includes, fn(path) -> {:i, path} end) ++
if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
if_function_exported(:crypto, :strong_rand_bytes, 1, [{:d, :STRONG_RAND_BYTES}]) ++
if_function_exported(:rand, :uniform, 1, [{:d, :RAND_UNIFORM}]) ++
if_function_exported(:gb_sets, :iterator_from, 2, [{:d, :GB_SETS_ITERATOR_FROM}]) ++
if_function_exported(:public_key, :short_name_hash, 1, [{:d, :SHORT_NAME_HASH}])
if_function_exported(:erl_error, :format_exception, 6, [{:d, :HAVE_ERL_ERROR}])
end
defp cond_options do
@@ -74,7 +72,7 @@ defmodule Ejabberd.Mixfile do
[{:lager, "~> 3.6.0"},
{:p1_utils, "~> 1.0"},
{:fast_xml, "~> 1.1"},
{:xmpp, "~> 1.3.0"},
{:xmpp, "~> 1.4.0"},
{:cache_tab, "~> 1.0"},
{:stringprep, "~> 1.0"},
{:fast_yaml, "~> 1.0"},
@@ -84,14 +82,17 @@ defmodule Ejabberd.Mixfile do
{:p1_mysql, "~> 1.0"},
{:mqtree, "~> 1.0"},
{:p1_pgsql, "~> 1.1"},
{:jiffy, "~> 0.14.7"},
{:jiffy, "~> 1.0"},
{:p1_oauth2, "~> 0.6.1"},
{:distillery, "~> 2.0"},
{:pkix, "~> 1.0"},
{:ex_doc, ">= 0.0.0", only: :dev},
{:eimp, "~> 1.0"},
{:base64url, "~> 0.0.1"},
{:jose, "~> 1.8"}]
{:yconf, "~> 1.0"},
{:jose, "~> 1.8"},
{:idna, "~> 6.0"},
{:p1_acme, "~> 1.0"}]
++ cond_deps()
end
@@ -109,7 +110,6 @@ defmodule Ejabberd.Mixfile do
defp cond_deps do
for {:true, dep} <- [{config(:sqlite), {:sqlite3, "~> 1.1"}},
{config(:riak), {:riakc, "~> 2.4"}},
{config(:redis), {:eredis, "~> 1.0"}},
{config(:zlib), {:ezlib, "~> 1.0"}},
{config(:pam), {:epam, "~> 1.0"}},
+24 -23
View File
@@ -1,37 +1,38 @@
%{
"artificery": {:hex, :artificery, "0.4.2", "3ded6e29e13113af52811c72f414d1e88f711410cac1b619ab3a2666bbd7efd4", [:mix], [], "hexpm"},
"base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
"cache_tab": {:hex, :cache_tab, "1.0.19", "9409b890b9526afbfeeea1cd191dec5bb9d4b0089af3684f58cbb7fd88457546", [:rebar3], [{:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"distillery": {:hex, :distillery, "2.0.14", "25fc1cdad06282334dbf4a11b6e869cc002855c4e11825157498491df2eed594", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm"},
"earmark": {:hex, :earmark, "1.3.2", "b840562ea3d67795ffbb5bd88940b1bed0ed9fa32834915125ea7d02e35888a5", [:mix], [], "hexpm"},
"eimp": {:hex, :eimp, "1.0.11", "40d11f0dca444a8c5601ac4aaee4e89a1fade721f66527093fa6baecd2e6e119", [:rebar3], [{:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"cache_tab": {:hex, :cache_tab, "1.0.20", "00a09975fa6d7ad30407b551ca62f0e901bf36cf4e18bd24cd8c1c517d25b5d4", [:rebar3], [{:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"distillery": {:hex, :distillery, "2.1.1", "f9332afc2eec8a1a2b86f22429e068ef35f84a93ea1718265e740d90dd367814", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm"},
"earmark": {:hex, :earmark, "1.4.1", "07bb382826ee8d08d575a1981f971ed41bd5d7e86b917fd012a93c51b5d28727", [:mix], [], "hexpm"},
"eimp": {:hex, :eimp, "1.0.12", "c00cdc0ef7159f07e8ec50826d1de9bd051a9538bac772e455927d7f6165abb4", [:rebar3], [{:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"epam": {:hex, :epam, "1.0.6", "6e57e1f5a330fa02a08ee0d4b16d9161f95177351e48c6dfede2f89b7e2f589f", [:rebar3], [], "hexpm"},
"eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm"},
"esip": {:hex, :esip, "1.0.29", "fc710d5858e14a32933bb83803b0419113761a00ecd888c5c1ab2b9057df600b", [:rebar3], [{:fast_tls, "1.1.1", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.28", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.20.2", "1bd0dfb0304bade58beb77f20f21ee3558cc3c753743ae0ddbb0fd7ba2912331", [:mix], [{:earmark, "~> 1.3", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
"esip": {:hex, :esip, "1.0.30", "23d020270590cd6e2785fb33c8bb954e992ed3d469a5b668ceccb56c703888db", [:rebar3], [{:fast_tls, "1.1.2", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.29", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
"ezlib": {:hex, :ezlib, "1.0.6", "d43a3377006f91c853f65d5efd563d61bbc289f0115a311657c728f5e6e8c39f", [:rebar3], [], "hexpm"},
"fast_tls": {:hex, :fast_tls, "1.1.1", "eb73c12d0659ec3c8e294962a23b2a912b20b08a59bee9271fee100521032d0d", [:rebar3], [{:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"fast_xml": {:hex, :fast_xml, "1.1.36", "535d5fe79a8856491eef1902c2d56fe7df50c212b5a650a9e86df18b2d27f56a", [:rebar3], [{:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"fast_yaml": {:hex, :fast_yaml, "1.0.19", "9953d71ed0dc176621834f2cfc6c99569a1e730acaa1ea2c2c0d43a184791b7c", [:rebar3], [{:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"fast_tls": {:hex, :fast_tls, "1.1.2", "ec3b5ba9c5e87f66190196ee8cedffe8f02b9c5b76bb5bc6e81f93d00013ae3a", [:rebar3], [{:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"fast_xml": {:hex, :fast_xml, "1.1.37", "e5276cd18d5ce5b179da34b6a1232805956f3057ee45833a0d62a9e414c86e07", [:rebar3], [{:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"fast_yaml": {:hex, :fast_yaml, "1.0.21", "3aea577eb57fbb62df79e7c406a453d54d450d35626a19998830e37c767eda67", [:rebar3], [{:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm"},
"hamcrest": {:hex, :basho_hamcrest, "0.4.1", "fb7b2c92d252a1e9db936750b86089addaebeb8f87967fb4bbdda61e8863338e", [:make, :mix, :rebar3], [], "hexpm"},
"jiffy": {:hex, :jiffy, "0.14.13", "225a9a35e26417832c611526567194b4d3adc4f0dfa5f2f7008f4684076f2a01", [:rebar3], [], "hexpm"},
"jose": {:hex, :jose, "1.9.0", "4167c5f6d06ffaebffd15cdb8da61a108445ef5e85ab8f5a7ad926fdf3ada154", [:mix, :rebar3], [{:base64url, "~> 0.0.1", [hex: :base64url, repo: "hexpm", optional: false]}], "hexpm"},
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
"jiffy": {:hex, :jiffy, "1.0.1", "4f25639772ca41202f41ba9c8f6ca0933554283dd4742c90651e03471c55e341", [:rebar3], [], "hexpm"},
"jose": {:hex, :jose, "1.8.4", "7946d1e5c03a76ac9ef42a6e6a20001d35987afd68c2107bcd8f01a84e75aa73", [:mix, :rebar3], [{:base64url, "~> 0.0.1", [hex: :base64url, repo: "hexpm", optional: false]}], "hexpm"},
"lager": {:hex, :lager, "3.6.10", "6172b43ab720ac33914ccd0aeb21fdbdf88213847707d4b91e6af57b2ae5c4d2", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm"},
"luerl": {:hex, :luerl, "0.3.1", "5412807630aac1aaf59ffe5a1bc09259c447b4faeb1d3fe2d4ef41b87676cb04", [:rebar3], [], "hexpm"},
"makeup": {:hex, :makeup, "0.8.0", "9cf32aea71c7fe0a4b2e9246c2c4978f9070257e5c9ce6d4a28ec450a839b55f", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
"makeup_elixir": {:hex, :makeup_elixir, "0.13.0", "be7a477997dcac2e48a9d695ec730b2d22418292675c75aa2d34ba0909dcdeda", [:mix], [{:makeup, "~> 0.8", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"},
"mqtree": {:hex, :mqtree, "1.0.3", "f90212159632055811613efece8e3a28580e168ac967caed297720cad254ab47", [:rebar3], [{:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm"},
"makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"},
"mqtree": {:hex, :mqtree, "1.0.5", "9448fd262ac5fd6b502c30abac00978779ae402558c7934b36cad481b2b7ebcd", [:rebar3], [{:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.5.1", "c90796ecee0289dbb5ad16d3ad06f957b0cd1199769641c961cfe0b97db190e0", [:mix], [], "hexpm"},
"p1_acme": {:hex, :p1_acme, "1.0.1", "c67acfa201b77de1eac47e4ed54308a3046da221ae63ba2eff6ecfb0340a5272", [:rebar3], [{:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.0.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.8.4", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.1", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm"},
"p1_mysql": {:hex, :p1_mysql, "1.0.11", "ae20e1daa2c0634bb61c1529d8401b08b855297b1c7d9af980b2e063d8b58482", [:rebar3], [], "hexpm"},
"p1_oauth2": {:hex, :p1_oauth2, "0.6.5", "a39db41de0287d4d1af3190beaa80edf17335b20f1d0ccace6c09580e0853987", [:rebar3], [], "hexpm"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.7", "ef64d34adbbe08258cc10b1532649446d8c086ff8663d44f430d837ec31a89f8", [:rebar3], [], "hexpm"},
"p1_utils": {:hex, :p1_utils, "1.0.15", "731f76ae1f31f4554afb2ae629cb5589d53bd13efc72b11f5a7c3b1242f91046", [:rebar3], [], "hexpm"},
"pkix": {:hex, :pkix, "1.0.2", "f618455c4edbcc7ebf8be5e655b269876fa36e890b806d18d8b2b708dfb1e583", [:rebar3], [], "hexpm"},
"riak_pb": {:hex, :riak_pb, "2.3.2", "48ffbf66dbb3f136ab9a7134bac4e496754baa5ef58c4f50a61326736d996390", [:make, :mix, :rebar3], [{:hamcrest, "~> 0.4.1", [hex: :basho_hamcrest, repo: "hexpm", optional: false]}], "hexpm"},
"riakc": {:hex, :riakc, "2.5.3", "6132d9e687a0dfd314b2b24c4594302ca8b55568a5d733c491d8fb6cd4004763", [:make, :mix, :rebar3], [{:riak_pb, "~> 2.3", [hex: :riak_pb, repo: "hexpm", optional: false]}], "hexpm"},
"p1_utils": {:hex, :p1_utils, "1.0.16", "05b5d4fb1f002d827b0d0d344eecdb4208b535bf95264d44f588affec644212b", [:rebar3], [], "hexpm"},
"pkix": {:hex, :pkix, "1.0.4", "81d552f736b1cadb278069a332cc94891a1c3095eb6281b340969ee455bd6fea", [:rebar3], [], "hexpm"},
"sqlite3": {:hex, :sqlite3, "1.1.6", "4ea71af0b45908b5f02c9b09e4c87177039ef404f20accb35049cd8924cc417c", [:rebar3], [], "hexpm"},
"stringprep": {:hex, :stringprep, "1.0.16", "5a7e617cabba5791aed45b394307d46b9f22ac2eef3bbcf6a4b639637079c84d", [:rebar3], [{:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"stun": {:hex, :stun, "1.0.28", "ee81bc075f955f529679213157f76c3d3355a1dec4625108a62872006c3db8a0", [:rebar3], [{:fast_tls, "1.1.1", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"xmpp": {:hex, :xmpp, "1.3.4", "28f213bdf82510111b883897581037874bb771147847ab5c742aed6ac987c55f", [:rebar3], [{:ezlib, "1.0.6", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.1", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.36", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.15", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.16", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm"},
"stringprep": {:hex, :stringprep, "1.0.17", "bf962fe2a4d01298d220b6474689755103f703942a043908ca6cd323e8fa0947", [:rebar3], [{:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"stun": {:hex, :stun, "1.0.29", "9678aa90302bda43af86949a6253b82c84535bd1aacdd8de7f052b68234f91b3", [:rebar3], [{:fast_tls, "1.1.2", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"},
"xmpp": {:hex, :xmpp, "1.4.2", "7a41bbeaebaceadcc16128449e1b6d535bb1b9479739064288abbe93f8870170", [:rebar3], [{:ezlib, "1.0.6", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.2", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.37", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.16", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.17", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm"},
"yconf": {:hex, :yconf, "1.0.1", "970fbbe53df7113914488909943abbbe788fff94166b4e39afaebc3e73f2a4f7", [:rebar3], [{:fast_yaml, "1.0.21", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm"},
}
+7
View File
@@ -9,6 +9,11 @@ override_opts(add, Config, Opts) ->
lists:foldl(fun({Opt, Value}, Conf) ->
V = rebar_config:get_local(Conf, Opt, []),
rebar_config:set(Conf, Opt, V ++ Value)
end, Config, Opts);
override_opts(del, Config, Opts) ->
lists:foldl(fun({Opt, Value}, Conf) ->
V = rebar_config:get_local(Conf, Opt, []),
rebar_config:set(Conf, Opt, V -- Value)
end, Config, Opts).
preprocess(Config, _Dirs) ->
@@ -24,6 +29,8 @@ preprocess(Config, _Dirs) ->
lists:foldl(fun({Type, AppName2, Opts}, Conf1) when
AppName2 == AppName ->
override_opts(Type, Conf1, Opts);
({Type, Opts}, Conf1a) ->
override_opts(Type, Conf1a, Opts);
(_, Conf2) ->
Conf2
end, C, TopOverrides);
+48 -30
View File
@@ -1,12 +1,10 @@
%% -*- coding: latin-1 -*-
%% -*- coding: utf-8 -*-
{" (Add * to the end of field to match substring)"," (Afegix * al final d'un camp per a buscar subcadenes)"}.
{" has set the subject to: "," ha posat l'assumpte: "}.
{"A password is required to enter this room","Es necessita contrasenya per a entrar en aquesta sala"}.
{"Accept","Acceptar"}.
{"Access Configuration","Configuració d'accesos"}.
{"Access Control List Configuration","Configuració de la Llista de Control d'Accés"}.
{"Access Control Lists","Llista de Control d'Accés"}.
{"Access denied by service policy","Accés denegat per la política del servei"}.
{"Access Rules","Regles d'Accés"}.
{"Account doesn't exist","El compte no existeix"}.
{"Action on user","Acció en l'usuari"}.
{"Add Jabber ID","Afegir Jabber ID"}.
{"Add New","Afegir nou"}.
@@ -75,9 +73,11 @@
{"Database","Base de dades"}.
{"December","Decembre"}.
{"Default users as participants","Els usuaris són participants per defecte"}.
{"Delete content","Eliminar contingut"}.
{"Delete message of the day on all hosts","Elimina el missatge del dis de tots els hosts"}.
{"Delete message of the day","Eliminar el missatge del dia"}.
{"Delete Selected","Eliminar els seleccionats"}.
{"Delete table","Eliminar taula"}.
{"Delete User","Eliminar Usuari"}.
{"Description:","Descripció:"}.
{"Disc only copy","Còpia sols en disc"}.
@@ -89,11 +89,11 @@
{"Edit Properties","Editar propietats"}.
{"Either approve or decline the voice request.","Aprova o denega la petició de veu."}.
{"ejabberd MUC module","mòdul ejabberd MUC"}.
{"ejabberd Multicast service","Servei de Multicast d'ejabberd"}.
{"ejabberd Publish-Subscribe module","Mòdul ejabberd Publicar-Subscriure"}.
{"ejabberd Multicast service","ejabberd - servei de Multicast"}.
{"ejabberd Publish-Subscribe module","ejabberd - Mòdul Publicar-Subscriure"}.
{"ejabberd SOCKS5 Bytestreams module","mòdul ejabberd SOCKS5 Bytestreams"}.
{"ejabberd vCard module","Mòdul ejabberd vCard"}.
{"ejabberd Web Admin","Web d'administració del ejabberd"}.
{"ejabberd vCard module","ejabberd mòdul vCard"}.
{"ejabberd Web Admin","ejabberd Web d'administració"}.
{"ejabberd","ejabberd"}.
{"Elements","Elements"}.
{"Email","Email"}.
@@ -123,13 +123,14 @@
{"Family Name","Cognom"}.
{"February","Febrer"}.
{"File larger than ~w bytes","El fitxer es més gran que ~w bytes"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Emplena el formulari per a buscar usuaris Jabber. Afegix * al final d'un camp per a buscar subcadenes."}.
{"Fill in the form to search for any matching Jabber User","Emplena camps per a buscar usuaris Jabber que concorden"}.
{"Friday","Divendres"}.
{"From ~s","De ~s"}.
{"From","De"}.
{"Full Name","Nom complet"}.
{"Get Number of Online Users","Obtenir Número d'Usuaris Connectats"}.
{"Get Number of Registered Users","Obtenir Número d'Usuaris Registrats"}.
{"Get Pending","Obtenir Pendents"}.
{"Get User Last Login Time","Obtenir la última connexió d'Usuari"}.
{"Get User Password","Obtenir Contrasenya d'usuari"}.
{"Get User Statistics","Obtenir Estadístiques d'Usuari"}.
@@ -164,11 +165,12 @@
{"Incorrect value of 'action' in data form","Valor incorrecte de 'action' al formulari de dades"}.
{"Incorrect value of 'path' in data form","Valor incorrecte de 'path' al formulari de dades"}.
{"Insufficient privilege","Privilegi insuficient"}.
{"Internal server error","Error intern del servidor"}.
{"Invalid 'from' attribute in forwarded message","Atribut 'from' invàlid al missatge reenviat"}.
{"Invalid node name","Nom de node no vàlid"}.
{"Invalid 'previd' value","Valor no vàlid de 'previd'"}.
{"Invitations are not allowed in this conference","Les invitacions no estan permeses en aquesta sala de conferència"}.
{"IP addresses","Adreça IP"}.
{"IP","IP"}.
{"is now known as","ara es conegut com"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","No està permés enviar missatges d'error a la sala. El participant (~s) ha enviat un missatge d'error (~s) i ha sigut expulsat de la sala"}.
{"It is not allowed to send private messages of type \"groupchat\"","No està permés enviar missatges del tipus \"groupchat\""}.
@@ -187,8 +189,6 @@
{"leaves the room","surt de la sala"}.
{"List of modules to start","Llista de mòduls a iniciar"}.
{"List of rooms","Llista de sales"}.
{"Listened Ports at ","Ports a la escolta en "}.
{"Listened Ports","Ports a l'escolta"}.
{"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"}.
@@ -198,6 +198,7 @@
{"Make room persistent","Crear una sala persistent"}.
{"Make room public searchable","Crear una sala pública"}.
{"Malformed username","Nom d'usuari mal format"}.
{"MAM preference modification denied by service policy","Se t'ha denegat la modificació de la preferència de MAM per política del servei"}.
{"March","Març"}.
{"Maximum Number of Occupants","Número màxim d'ocupants"}.
{"May","Maig"}.
@@ -212,8 +213,6 @@
{"Moderator privileges required","Es necessita tenir privilegis de moderador"}.
{"Modified modules","Mòduls modificats"}.
{"Module failed to handle the query","El modul ha fallat al gestionar la petició"}.
{"Module","Mòdul"}.
{"Modules at ~p","Mòduls en ~p"}.
{"Modules","Mòduls"}.
{"Monday","Dilluns"}.
{"Multicast","Multicast"}.
@@ -225,11 +224,12 @@
{"Neither 'role' nor 'affiliation' attribute found","No s'han trobat els atributs 'role' ni 'affiliation'"}.
{"Never","Mai"}.
{"New Password:","Nova Contrasenya:"}.
{"Nickname can't be empty","El sobrenom no pot estar buit"}.
{"Nickname Registration at ","Registre del sobrenom en "}.
{"Nickname ~s does not exist in the room","El sobrenom ~s no existeix a la sala"}.
{"Nickname","Sobrenom"}.
{"No 'access' found in data form","No s'ha trobat 'access' al formulari de dades"}.
{"No 'acls' found in data form","No s'ha trobat 'acls' al formulari de dades"}.
{"No address elements found","No s'han trobat elements d'adreces ('address')"}.
{"No addresses element found","No s'ha trobat l'element d'adreces ('addresses')"}.
{"No 'affiliation' attribute found","No s'ha trobat l'atribut 'affiliation'"}.
{"No available resource found","No s'ha trobat un recurs disponible"}.
{"No body provided for announce message","No hi ha proveedor per al missatge anunci"}.
@@ -242,6 +242,7 @@
{"No info about last activity found","No s'ha trobat informació de l'ultima activitat"}.
{"No 'item' element found","No s'ha trobat cap element 'item'"}.
{"No items found in this query","En aquesta petició no s'ha trobat cap element"}.
{"No limit","Sense Llímit"}.
{"No module is handling this query","Cap element està manegant esta petició"}.
{"No 'modules' found in data form","No s'ha trobat 'modules' al formulari de dades"}.
{"No node specified","No s'ha especificat node"}.
@@ -262,6 +263,7 @@
{"Nodeprep has failed","Ha fallat Nodeprep"}.
{"Nodes","Nodes"}.
{"None","Cap"}.
{"Not allowed","No permès"}.
{"Not Found","No Trobat"}.
{"Not subscribed","No subscrit"}.
{"November","Novembre"}.
@@ -284,12 +286,12 @@
{"Only occupants are allowed to send messages to the conference","Sols els ocupants poden enviar missatges a la sala"}.
{"Only occupants are allowed to send queries to the conference","Sols els ocupants poden enviar sol·licituds a la sala"}.
{"Only service administrators are allowed to send service messages","Sols els administradors del servei tenen permís per a enviar missatges de servei"}.
{"Options","Opcions"}.
{"Organization Name","Nom de la organizació"}.
{"Organization Unit","Unitat de la organizació"}.
{"Outgoing s2s Connections:","Connexions d'eixida s2s:"}.
{"Outgoing s2s Connections","Connexions s2s d'eixida"}.
{"Owner privileges required","Es requerixen privilegis de propietari de la sala"}.
{"Packet relay is denied by service policy","S'ha denegat el reenviament del paquet per política del servei"}.
{"Packet","Paquet"}.
{"Parse failed","El processat ha fallat"}.
{"Password Verification","Verificació de la Contrasenya"}.
@@ -305,11 +307,13 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Recorda que aquestes opcions només fan còpia de seguretat de la base de dades Mnesia. Si estàs utilitzant el mòdul d'ODBC també deus de fer una còpia de seguretat de la base de dades de SQL a part."}.
{"Please, wait for a while before sending new voice request","Si us plau, espera una mica abans d'enviar una nova petició de veu"}.
{"Pong","Pong"}.
{"Port","Port"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Processar l'atribut 'ask' no està permès per RFC6121"}.
{"Previous session not found","No s'ha trobat la sessió prèvia"}.
{"Previous session PID has been killed","El procés de la sessió prèvia ha sigut matat"}.
{"Previous session PID has exited","El procés de la sessió prèvia ha sortit"}.
{"Previous session PID is dead","El procés de la sessió prèvia està mort"}.
{"Previous session timed out","La sessió prèvia ha caducat"}.
{"private, ","privat, "}.
{"Protocol","Protocol"}.
{"Publishing items to collection node is not allowed","Publicar elements en una col·lecció de nodes no està permès"}.
{"Publish-Subscribe","Publicar-subscriure't"}.
{"PubSub subscriber request","Petició de subscriptor PubSub"}.
{"Push record not found","No s'ha trobat l'element Push"}.
@@ -317,7 +321,6 @@
{"Query to another users is forbidden","Enviar peticions a altres usuaris no està permès"}.
{"RAM and disc copy","Còpia en RAM i disc"}.
{"RAM copy","Còpia en RAM"}.
{"Raw","En format text"}.
{"Really delete message of the day?","Segur que vols eliminar el missatge del dia?"}.
{"Recipient is not in the conference room","El receptor no està en la sala de conferència"}.
{"Register a Jabber account","Registrar un compte Jabber"}.
@@ -342,6 +345,7 @@
{"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 terminates","La sala està terminant"}.
{"Room title","Títol de la sala"}.
{"Roster module has failed","El modul de Roster ha fallat"}.
{"Roster of ","Llista de contactes de "}.
@@ -349,20 +353,20 @@
{"Roster","Llista de contactes"}.
{"RPC Call Error","Error de cridada RPC"}.
{"Running Nodes","Nodes funcionant"}.
{"~s access rule configuration","Configuració de les Regles d'Accés ~s"}.
{"~s invites you to the room ~s","~s et convida a la sala ~s"}.
{"Saturday","Dissabte"}.
{"Scan failed","L'escanejat ha fallat"}.
{"Script check","Comprovar script"}.
{"Search Results for ","Resultats de la búsqueda "}.
{"Search users in ","Cerca usuaris en "}.
{"Select All","Seleccionar Tots"}.
{"Send announcement to all online users on all hosts","Enviar anunci a tots els usuaris connectats a tots els hosts"}.
{"Send announcement to all online users","Enviar anunci a tots els usuaris connectats"}.
{"Send announcement to all users on all hosts","Enviar anunci a tots els usuaris de tots els hosts"}.
{"Send announcement to all users","Enviar anunci a tots els usuaris"}.
{"September","Setembre"}.
{"Server connections to local subdomains are forbidden","Les connexions de servidor a subdominis locals estan prohibides"}.
{"Server:","Servidor:"}.
{"Session state copying timed out","La copia del estat de la sessió ha caducat"}.
{"Set message of the day and send to online users","Configurar el missatge del dia i enviar a tots els usuaris"}.
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i enviar-ho als usuaris connectats"}.
{"Shared Roster Groups","Grups de contactes compartits"}.
@@ -374,7 +378,6 @@
{"~s's Offline Messages Queue","~s's cua de missatges offline"}.
{"Start Modules at ","Iniciar mòduls en "}.
{"Start Modules","Iniciar mòduls"}.
{"Start","Iniciar"}.
{"Statistics of ~p","Estadístiques de ~p"}.
{"Statistics","Estadístiques"}.
{"Stop Modules at ","Detindre mòduls en "}.
@@ -392,18 +395,24 @@
{"Subscriptions are not allowed","Les subscripcions no estan permeses"}.
{"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"}.
{"That nickname is already in use by another occupant","El sobrenom ja l'està utilitzant una altra persona"}.
{"That nickname is registered by another person","El sobrenom ja està registrat per una altra persona"}.
{"The account already exists","El compte ha existeix"}.
{"The account was not deleted","El compte no ha sigut esborrat"}.
{"The CAPTCHA is valid.","El CAPTCHA es vàlid."}.
{"The CAPTCHA verification has failed","La verificació CAPTCHA ha fallat"}.
{"The captcha you entered is wrong","El CAPTCHA que has proporcionat és incorrecte"}.
{"The feature requested is not supported by the conference","La característica sol·licitada no està suportada per la sala de conferència"}.
{"The password contains unacceptable characters","La contrasenya conté caràcters inacceptables"}.
{"The password is too weak","La contrasenya és massa simple"}.
{"the password is","la contrasenya és"}.
{"The password of your Jabber account was successfully changed.","La contrasenya del teu compte Jabber s'ha canviat correctament."}.
{"The password was not changed","La contrasenya no ha sigut canviada"}.
{"The passwords are different","Les contrasenyes son diferents"}.
{"The query is only allowed from local users","La petició està permesa només d'usuaris locals"}.
{"The query must not contain <item/> elements","La petició no pot contenir elements <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquet DEU contindre només un element <active/>, un element <default/>, o un element <list/>"}.
{"The username is not valid","El nom d'usuari no es vàlid"}.
{"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}.
{"There was an error creating the account: ","Hi ha hagut un error creant el compte: "}.
{"There was an error deleting the account: ","Hi ha hagut un error esborrant el compte: "}.
@@ -411,6 +420,7 @@
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Aquesta pàgina permet crear un compte Jabber en aquest servidor Jabber. El teu JID (Jabber IDentifier; Identificador Jabber) tindrà aquesta forma: usuari@servidor. Si us plau, llegeix amb cura les instruccions per emplenar correctament els camps."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Aquesta pàgina permet anul·lar el registre d'un compte Jabber en aquest servidor Jabber."}.
{"This room is not anonymous","Aquesta sala no és anònima"}.
{"This service can not process the address: ~s","Este servei no pot processar la direcció: ~s"}.
{"Thursday","Dijous"}.
{"Time delay","Temps de retard"}.
{"Timed out waiting for stream resumption","Massa temps esperant que es resumisca la connexió"}.
@@ -423,6 +433,8 @@
{"Too many child elements","N'hi ha massa subelements"}.
{"Too many <item/> elements","N'hi ha massa elements <item/>"}.
{"Too many <list/> elements","N'hi ha massa elements <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Massa autenticacions (~p) han fallat des d'aquesta adreça IP (~s). L'adreça serà desbloquejada en ~s UTC"}.
{"Too many receiver fields were specified","S'han especificat massa camps de receptors"}.
{"Too many unacked stanzas","Massa missatges sense haver reconegut la seva recepció"}.
{"Too many users in this conference","N'hi ha massa usuaris en esta sala de conferència"}.
{"To","Per a"}.
@@ -437,8 +449,10 @@
{"Unable to register route on existing local domain","No s'ha pogut registrar la ruta al domini local existent"}.
{"Unauthorized","No autoritzat"}.
{"Unexpected action","Acció inesperada"}.
{"Unexpected error condition: ~p","Condició d'error inesperada: ~p"}.
{"Unregister a Jabber account","Anul·lar el registre d'un compte Jabber"}.
{"Unregister","Anul·lar el registre"}.
{"Unselect All","Deseleccionar tots"}.
{"Unsupported <index/> element","Element <index/> no soportat"}.
{"Unsupported version","Versió no suportada"}.
{"Update message of the day (don't send)","Actualitzar el missatge del dia (no enviar)"}.
@@ -451,7 +465,7 @@
{"User already exists","El usuari ja existeix"}.
{"User (jid)","Usuari (jid)"}.
{"User Management","Gestió d'Usuaris"}.
{"User part of JID in 'from' is empty","La part d'usuari del JID a 'from' està buida"}.
{"User removed","Usuari borrat"}.
{"User session not found","Sessió d'usuari no trobada"}.
{"User session terminated","Sessió d'usuari terminada"}.
{"User ~s","Usuari ~s"}.
@@ -466,13 +480,17 @@
{"Value of '~s' should be datetime string","El valor de '~s' deuria ser una data"}.
{"Value of '~s' should be integer","El valor de '~s' deuria ser un numero enter"}.
{"Value 'set' of 'type' attribute is not allowed","El valor 'set' a l'atribut 'type' no és permès"}.
{"vCard User Search","Recerca de vCard d'usuari"}.
{"vCard User Search","vCard recerca d'usuari"}.
{"Virtual Hosting","Hosts virtuals"}.
{"Virtual Hosts","Hosts virtuals"}.
{"Visitors are not allowed to change their nicknames in this room","Els visitants no tenen permés canviar el seus Nicknames en esta sala"}.
{"Visitors are not allowed to send messages to all occupants","Els visitants no poden enviar missatges a tots els ocupants"}.
{"Voice request","Petició de veu"}.
{"Voice requests are disabled in this conference","Les peticions de veu es troben desactivades en aquesta conferència"}.
{"Wednesday","Dimecres"}.
{"Wrong parameters in the web formulary","Paràmetres incorrectes en el formulari web"}.
{"Wrong xmlns","El xmlns ès incorrecte"}.
{"You are being removed from the room because of a system shutdown","Has sigut expulsat de la sala perquè el sistema va a apagar-se"}.
{"You are not joined to the channel","No t'has unit al canal"}.
{"You can later change your password using a Jabber client.","Podràs canviar la teva contrasenya més endavant utilitzant un client Jabber."}.
{"You have been banned from this room","Has sigut bloquejat en aquesta sala"}.
@@ -485,5 +503,5 @@
{"Your contact offline message queue is full. The message has been discarded.","La teua cua de missatges offline és plena. El missatge ha sigut descartat."}.
{"Your Jabber account was successfully created.","El teu compte Jabber ha sigut creat correctament."}.
{"Your Jabber account was successfully deleted.","El teu compte Jabber ha sigut esborrat correctament."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Els teus missatges per ~s s'estan bloquejant. Per desbloquejar-los, visita ~s"}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","La teua petició de subscripció i/o missatges a ~s han sigut bloquejats. Per a desbloquejar-los, visita ~s"}.
{"You're not allowed to create nodes","No tens permís per a crear nodes"}.
+777 -678
View File
File diff suppressed because it is too large Load Diff
+43 -62
View File
@@ -1,21 +1,14 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," změnil(a) téma na: "}.
{"A password is required to enter this room","Pro vstup do místnosti musíte zadat heslo"}.
%% -*- coding: utf-8 -*-
{"Accept","Přijmout"}.
{"Access Configuration","Konfigurace přístupů"}.
{"Access Control List Configuration","Konfigurace seznamu přístupových práv (ACL)"}.
{"Access Control Lists","Seznamy přístupových práv (ACL)"}.
{"Access denied by service policy","Přístup byl zamítnut nastavením služby"}.
{"Access Rules","Pravidla přístupů"}.
{"Action on user","Akce aplikovaná na uživatele"}.
{"Add Jabber ID","Přidat Jabber ID"}.
{"Add New","Přidat nový"}.
{"Add User","Přidat uživatele"}.
{"Administration of ","Administrace "}.
{"Administration","Administrace"}.
{"Administration of ","Administrace "}.
{"Administrator privileges required","Potřebujete práva administrátora"}.
{"All activity","Všechny aktivity"}.
{"All Users","Všichni uživatelé"}.
{"Allow users to change the subject","Povolit uživatelům měnit téma místnosti"}.
{"Allow users to query other users","Povolit uživatelům odesílat požadavky (query) ostatním uživatelům"}.
{"Allow users to send invites","Povolit uživatelům posílání pozvánek"}.
@@ -23,7 +16,9 @@
{"Allow visitors to change nickname","Povolit návštěvníkům měnit přezdívku"}.
{"Allow visitors to send private messages to","Povolit návštěvníkům odesílat soukromé zprávy"}.
{"Allow visitors to send status text in presence updates","Povolit návštěvníkům posílat stavové zprávy ve statusu"}.
{"All Users","Všichni uživatelé"}.
{"Announcements","Oznámení"}.
{"A password is required to enter this room","Pro vstup do místnosti musíte zadat heslo"}.
{"April",". dubna"}.
{"August",". srpna"}.
{"Automatic node creation is not enabled","Automatické vytváření uzlů není povoleno"}.
@@ -56,15 +51,15 @@
{"City","Město"}.
{"Commands","Příkazy"}.
{"Conference room does not exist","Místnost neexistuje"}.
{"Configuration of room ~s","Konfigurace místnosti ~s"}.
{"Configuration","Konfigurace"}.
{"Configuration of room ~s","Konfigurace místnosti ~s"}.
{"Connected Resources:","Připojené zdroje:"}.
{"Country","Země"}.
{"CPU Time:","Čas procesoru:"}.
{"Database","Databáze"}.
{"Database failure","Chyba databáze"}.
{"Database Tables at ~p","Databázové tabulky na ~p"}.
{"Database Tables Configuration at ","Konfigurace databázových tabulek "}.
{"Database","Databáze"}.
{"December",". prosince"}.
{"Default users as participants","Uživatelé jsou implicitně členy"}.
{"Delete message of the day on all hosts","Smazat zprávu dne na všech hostitelích"}.
@@ -114,10 +109,9 @@
{"Family Name","Příjmení"}.
{"February",". února"}.
{"File larger than ~w bytes","Soubor větší než ~w bytů"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Pro vyhledání uživatele Jabberu vyplňte formulář (na konec přidejte znak * pro vyhledání podřetězce)"}.
{"Friday","Pátek"}.
{"From ~s","Od ~s"}.
{"From","Od"}.
{"From ~s","Od ~s"}.
{"Full Name","Celé jméno"}.
{"Get Number of Online Users","Získat počet online uživatelů"}.
{"Get Number of Registered Users","Získat počet registrovaných uživatelů"}.
@@ -128,12 +122,13 @@
{"Group ","Skupina "}.
{"Groups","Skupiny"}.
{"has been banned","byl(a) zablokován(a)"}.
{"has been kicked because of a system shutdown","byl(a) vyhozen(a), protože dojde k vypnutí systému"}.
{"has been kicked because of an affiliation change","byl(a) vyhozen(a) kvůli změně přiřazení"}.
{"has been kicked because of a system shutdown","byl(a) vyhozen(a), protože dojde k vypnutí systému"}.
{"has been kicked because the room has been changed to members-only","byl(a) vyhozen(a), protože mísnost je nyní pouze pro členy"}.
{"has been kicked","byl(a) vyhozen(a) z místnosti"}.
{"Host unknown","Neznámý hostitel"}.
{" has set the subject to: "," změnil(a) téma na: "}.
{"Host","Hostitel"}.
{"Host unknown","Neznámý hostitel"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Pokud zde nevidíte obrázek CAPTCHA, přejděte na webovou stránku."}.
{"Import Directory","Import adresáře"}.
{"Import File","Import souboru"}.
@@ -156,12 +151,11 @@
{"Invalid 'from' attribute in forwarded message","Nesprávný atribut 'from' v přeposlané zprávě"}.
{"Invitations are not allowed in this conference","Pozvánky nejsou povoleny v této místnosti"}.
{"IP addresses","IP adresy"}.
{"IP","IP"}.
{"is now known as","se přejmenoval(a) na"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Není povoleno posílat chybové zprávy do místnosti. Účastník (~s) odeslal chybovou zprávu (~s) a byl vyhozen z místnosti"}.
{"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 v této místnosti"}.
{"It is not allowed to send private messages","Je zakázáno posílat soukromé zprávy"}.
{"Jabber Account Registration","Registrace účtu Jabberu"}.
{"Jabber ID","Jabber ID"}.
{"January",". ledna"}.
@@ -175,8 +169,6 @@
{"leaves the room","opustil(a) místnost"}.
{"List of modules to start","Seznam modulů, které mají být spuštěné"}.
{"List of rooms","Seznam místností"}.
{"Listened Ports at ","Otevřené porty na "}.
{"Listened Ports","Otevřené porty"}.
{"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"}.
@@ -199,8 +191,6 @@
{"Moderator privileges required","Potřebujete práva moderátora"}.
{"Modified modules","Aktualizované moduly"}.
{"Module failed to handle the query","Modul chyboval při zpracování dotazu"}.
{"Module","Modul"}.
{"Modules at ~p","Moduly v ~p"}.
{"Modules","Moduly"}.
{"Monday","Pondělí"}.
{"Multicast","Multicast"}.
@@ -212,23 +202,29 @@
{"Neither 'role' nor 'affiliation' attribute found","Nebyl nalezen atribut 'role' ani 'affiliation'"}.
{"Never","Nikdy"}.
{"New Password:","Nové heslo:"}.
{"Nickname","Přezdívka"}.
{"Nickname Registration at ","Registrace přezdívky na "}.
{"Nickname ~s does not exist in the room","Přezdívka ~s v místnosti neexistuje"}.
{"Nickname","Přezdívka"}.
{"No 'access' found in data form","Chybějící atribut 'access' v datovém formuláři"}.
{"No 'acls' found in data form","Chybějící atribut 'acls' v datovém formuláři"}.
{"No 'affiliation' attribute found","Chybějící atribut 'affiliation'"}.
{"No available resource found","Nebyl nalezen žádný dostupný zdroj"}.
{"No body provided for announce message","Zpráva neobsahuje text"}.
{"No data form found","Nebyl nalezen datový formulář"}.
{"No Data","Žádná data"}.
{"Node already exists","Uzel již existuje"}.
{"Node index not found","Index uzlu nebyl nalezen"}.
{"Node not found","Uzel nenalezen"}.
{"Nodeprep has failed","Nodeprep chyboval"}.
{"Node ~p","Uzel ~p"}.
{"Nodes","Uzly"}.
{"No features available","Žádné funce nejsou dostupné"}.
{"No hook has processed this command","Žádný hook nebyl zpracován tímto příkazem"}.
{"No info about last activity found","Nebyla žádná informace o poslední aktivitě"}.
{"No 'item' element found","Element 'item' nebyl nalezen"}.
{"No items found in this query","Žádné položky nebyly nalezeny v tomto dotazu"}.
{"No limit","Bez limitu"}.
{"No module is handling this query","Žádný modul neobsluhuje tento dotaz"}.
{"No 'modules' found in data form","Chybějící atribut 'modules' v datovém formuláři"}.
{"None","Nic"}.
{"No node specified","Žádný uzel nebyl specifikován"}.
{"No 'password' found in data form","Chybějící atribut 'password' v datovém formuláři"}.
{"No 'password' found in this query","Chybějící atribut 'password' v tomto dotazu"}.
@@ -239,15 +235,8 @@
{"No running node found","Nebyl nalezen žádný běžící uzel"}.
{"No services available","Žádné služby nejsou dostupné"}.
{"No statistics found for this item","Nebyly nalezeny statistiky pro uvedenou položku"}.
{"No 'to' attribute found in the invitation","Chybějící atribut 'to' v pozvánce"}.
{"Node already exists","Uzel již existuje"}.
{"Node index not found","Index uzlu nebyl nalezen"}.
{"Node not found","Uzel nenalezen"}.
{"Node ~p","Uzel ~p"}.
{"Nodeprep has failed","Nodeprep chyboval"}.
{"Nodes","Uzly"}.
{"None","Nic"}.
{"Not Found","Nenalezeno"}.
{"No 'to' attribute found in the invitation","Chybějící atribut 'to' v pozvánce"}.
{"Not subscribed","Není odebíráno"}.
{"November",". listopadu"}.
{"Number of online users","Počet online uživatelů"}.
@@ -257,9 +246,9 @@
{"Offline Messages:","Offline zprávy:"}.
{"OK","OK"}.
{"Old Password:","Současné heslo:"}.
{"Online","Online"}.
{"Online Users","Připojení uživatelé"}.
{"Online Users:","Připojení uživatelé:"}.
{"Online","Online"}.
{"Only <enable/> or <disable/> tags are allowed","Pouze značky <enable/> nebo <disable/>jsou povoleny"}.
{"Only <list/> element is allowed in this query","Pouze element <list/> je povolen v tomto dotazu"}.
{"Only members may query archives of this room","Pouze moderátoři mají povoleno měnit téma místnosti"}.
@@ -269,7 +258,6 @@
{"Only occupants are allowed to send messages to the conference","Jen členové mají povolené zasílat zprávy do místnosti"}.
{"Only occupants are allowed to send queries to the conference","Jen členové mohou odesílat požadavky (query) do místnosti"}.
{"Only service administrators are allowed to send service messages","Pouze správci služby smí odesílat servisní zprávy"}.
{"Options","Nastavení"}.
{"Organization Name","Název firmy"}.
{"Organization Unit","Oddělení"}.
{"Outgoing s2s Connections","Odchozí s2s spojení"}.
@@ -277,31 +265,27 @@
{"Owner privileges required","Jsou vyžadována práva vlastníka"}.
{"Packet","Paket"}.
{"Parse failed","Došlo k chybě při parsování"}.
{"Password Verification","Ověření hesla"}.
{"Password Verification:","Ověření hesla:"}.
{"Password","Heslo"}.
{"Password:","Heslo:"}.
{"Password Verification","Ověření hesla"}.
{"Password Verification:","Ověření hesla:"}.
{"Path to Dir","Cesta k adresáři"}.
{"Path to File","Cesta k souboru"}.
{"Pending","Čekající"}.
{"Period: ","Čas: "}.
{"Ping query is incorrect","Ping dotaz je nesprávný"}.
{"Ping","Ping"}.
{"Ping query is incorrect","Ping dotaz je nesprávný"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Podotýkáme, že tato nastavení budou zálohována do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat svoji SQL databázi samostatně."}.
{"Please, wait for a while before sending new voice request","Prosím, počkejte chvíli před posláním nové žádosti o voice práva"}.
{"Pong","Pong"}.
{"Port","Port"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Atribut 'ask' není povolen dle RFC6121"}.
{"private, ","soukromá, "}.
{"Protocol","Protokol"}.
{"Publishing items to collection node is not allowed","Publikování položek do collection uzlu není povoleno"}.
{"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 místnosti nejsou v této místnosti povolené"}.
{"Query to another users is forbidden","Dotaz na jiné uživatele je zakázán"}.
{"RAM and disc copy","Kopie RAM a disku"}.
{"RAM copy","Kopie RAM"}.
{"Raw","Zdroj"}.
{"Really delete message of the day?","Skutečně smazat zprávu dne?"}.
{"Recipient is not in the conference room","Příjemce se nenachází v místnosti"}.
{"Register a Jabber account","Zaregistrujte si účet Jabberu"}.
@@ -310,17 +294,17 @@
{"Register","Zaregistrovat se"}.
{"Remote copy","Vzdálená kopie"}.
{"Remove All Offline Messages","Odstranit všechny offline zprávy"}.
{"Remove User","Odstranit uživatele"}.
{"Remove","Odstranit"}.
{"Remove User","Odstranit uživatele"}.
{"Replaced by new connection","Nahrazeno novým spojením"}.
{"Resources","Zdroje"}.
{"Restart Service","Restartovat službu"}.
{"Restart","Restart"}.
{"Restart Service","Restartovat službu"}.
{"Restore Backup from File at ","Obnovit zálohu ze souboru na "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Obnovit binární zálohu při následujícím restartu ejabberd (vyžaduje méně paměti):"}.
{"Restore binary backup immediately:","Okamžitě obnovit binární zálohu:"}.
{"Restore plain text backup immediately:","Okamžitě obnovit zálohu z textového souboru:"}.
{"Restore","Obnovit"}.
{"Restore plain text backup immediately:","Okamžitě obnovit zálohu z textového souboru:"}.
{"Room Configuration","Nastavení místnosti"}.
{"Room creation is denied by service policy","Pravidla služby nepovolují vytvořit místnost"}.
{"Room description","Popis místnosti"}.
@@ -328,21 +312,19 @@
{"Room title","Název místnosti"}.
{"Roster module has failed","Modul Roster chyboval"}.
{"Roster of ","Seznam kontaktů "}.
{"Roster size","Velikost seznamu kontaktů"}.
{"Roster","Seznam kontaktů"}.
{"Roster size","Velikost seznamu kontaktů"}.
{"RPC Call Error","Chyba RPC volání"}.
{"Running Nodes","Běžící uzly"}.
{"~s access rule configuration","~s konfigurace pravidla přístupu"}.
{"~s invites you to the room ~s","~s vás zve do místnosti ~s"}.
{"Saturday","Sobota"}.
{"Scan failed","Při skenování došlo k chybě"}.
{"Script check","Kontrola skriptu"}.
{"Search Results for ","Výsledky hledání pro "}.
{"Search users in ","Hledat uživatele v "}.
{"Send announcement to all online users on all hosts","Odeslat oznámení všem online uživatelům na všech hostitelích"}.
{"Send announcement to all online users","Odeslat oznámení všem online uživatelům"}.
{"Send announcement to all users on all hosts","Odeslat oznámení všem uživatelům na všech hostitelích"}.
{"Send announcement to all online users on all hosts","Odeslat oznámení všem online uživatelům na všech hostitelích"}.
{"Send announcement to all users","Odeslat oznámení všem uživatelům"}.
{"Send announcement to all users on all hosts","Odeslat oznámení všem uživatelům na všech hostitelích"}.
{"September",". září"}.
{"Server connections to local subdomains are forbidden","Serverová spojení k lokálním subdoménám je zakázáno"}.
{"Server:","Server:"}.
@@ -352,11 +334,11 @@
{"Show Integral Table","Zobrazit kompletní tabulku"}.
{"Show Ordinary Table","Zobrazit běžnou tabulku"}.
{"Shut Down Service","Vypnout službu"}.
{"~s invites you to the room ~s","~s vás zve do místnosti ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Někteří klienti umí uložit vaše heslo na disk počítače. Tuto funkci používejte, pouze pokud věříte zabezpečení svého počítače."}.
{"~s's Offline Messages Queue","Fronta offline zpráv uživatele ~s"}.
{"Start Modules at ","Spustit moduly na "}.
{"Start Modules","Spustit moduly"}.
{"Start","Start"}.
{"Statistics of ~p","Statistiky ~p"}.
{"Statistics","Statistiky"}.
{"Stop Modules at ","Zastavit moduly na "}.
@@ -378,32 +360,33 @@
{"The CAPTCHA verification has failed","Ověření CAPTCHA se nezdařilo"}.
{"The feature requested is not supported by the conference","Požadovaná vlastnost není podporována touto místností"}.
{"The password contains unacceptable characters","Heslo obsahuje nepovolené znaky"}.
{"The password is too weak","Heslo je příliš slabé"}.
{"the password is","heslo je"}.
{"The password is too weak","Heslo je příliš slabé"}.
{"The password of your Jabber account was successfully changed.","Heslo vašeho účtu Jabberu bylo úspěšně změněno."}.
{"The query is only allowed from local users","Dotaz je povolen pouze pro místní uživatele"}.
{"The query must not contain <item/> elements","Dotaz nesmí obsahovat elementy <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Stanza MUSÍ obsahovat pouze jeden element <active/>, jeden element <default/> nebo jeden element <list/>"}.
{"There was an error changing the password: ","Při změně hesla došlo k chybě: "}.
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě:"}.
{"There was an error deleting the account: ","Při mazání účtu došlo k chybě: "}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Stanza MUSÍ obsahovat pouze jeden element <active/>, jeden element <default/> nebo jeden element <list/>"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Zde nezáleží na velikosti písmen: macbeth je stejný jako MacBeth a Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Na této stránce si můžete vytvořit účet na tomto serveru Jabberu. Vaše JID (Jabber IDentifikátor) bude mít tvar: uživatelskéjméno@server. Přečtěte si prosím pozorně instrukce pro vyplnění údajů."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Zde můžete zrušit registraci účtu na tomto serveru Jabberu."}.
{"This room is not anonymous","Tato místnost není anonymní"}.
{"Thursday","Čtvrtek"}.
{"Time delay","Časový posun"}.
{"Time","Čas"}.
{"To register, visit ~s","Pokud se chcete zaregistrovat, navštivte ~s"}.
{"To ~s","Pro ~s"}.
{"Time delay","Časový posun"}.
{"Token TTL","Token TTL"}.
{"Too many active bytestreams","Příliš mnoho aktivních bytestreamů"}.
{"Too many CAPTCHA requests","Přiliš mnoho CAPTCHA žádostí"}.
{"Too many <item/> elements","Příliš mnoho elementů <item/>"}.
{"Too many <list/> elements","Přilíš mnoho elementů <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Příliš mnoho (~p) chybných pokusů o přihlášení z této IP adresy (~s). Adresa bude zablokována do ~s UTC"}.
{"Too many unacked stanzas","Příliš mnoho nepotvrzených stanz"}.
{"Too many users in this conference","Přiliš mnoho uživatelů v této místnosti"}.
{"To","Pro"}.
{"To register, visit ~s","Pokud se chcete zaregistrovat, navštivte ~s"}.
{"To ~s","Pro ~s"}.
{"Total rooms","Celkem místností"}.
{"Traffic rate limit is exceeded","Byl překročen limit"}.
{"Transactions Aborted:","Transakcí zrušených:"}.
@@ -418,24 +401,23 @@
{"Unregister a Jabber account","Zrušte registraci účtu Jabberu"}.
{"Unregister","Zrušit registraci"}.
{"Unsupported <index/> element","Nepodporovaný <index/> element"}.
{"Update","Aktualizovat"}.
{"Update message of the day (don't send)","Aktualizovat zprávu dne (neodesílat)"}.
{"Update message of the day on all hosts (don't send)","Aktualizovat zprávu dne pro všechny hostitele (neodesílat)"}.
{"Update ~p","Aktualizovat ~p"}.
{"Update plan","Aktualizovat plán"}.
{"Update script","Aktualizované skripty"}.
{"Update","Aktualizovat"}.
{"Uptime:","Čas běhu:"}.
{"User already exists","Uživatel již existuje"}.
{"User (jid)","Uživatel (JID)"}.
{"User Management","Správa uživatelů"}.
{"User part of JID in 'from' is empty","Uživatelská část Jabber ID v elementu 'from' je prázdná"}.
{"User session not found","Sezení uživatele nebylo nalezeno"}.
{"User session terminated","Sezení uživatele bylo ukončeno"}.
{"User ~s","Uživatel ~s"}.
{"Username:","Uživatelské jméno:"}.
{"Users are not allowed to register accounts so quickly","Je zakázáno registrovat účty v tak rychlém sledu"}.
{"User session not found","Sezení uživatele nebylo nalezeno"}.
{"User session terminated","Sezení uživatele bylo ukončeno"}.
{"Users Last Activity","Poslední aktivita uživatele"}.
{"Users","Uživatelé"}.
{"User ~s","Uživatel ~s"}.
{"User","Uživatel"}.
{"Validate","Ověřit"}.
{"Value 'get' of 'type' attribute is not allowed","Hodnota 'get' atrubutu 'type' není povolena"}.
@@ -459,7 +441,6 @@
{"You need an x:data capable client to search","K vyhledávání potřebujete klienta podporujícího x:data"}.
{"Your active privacy list has denied the routing of this stanza.","Vaše nastavení soukromí znemožnilo směrování této stance."}.
{"Your contact offline message queue is full. The message has been discarded.","Fronta offline zpráv pro váš kontakt je plná. Zpráva byla zahozena."}.
{"You're not allowed to create nodes","Nemáte povoleno vytvářet uzly"}.
{"Your Jabber account was successfully created.","Váš účet Jabberu byl úspěšně vytvořen."}.
{"Your Jabber account was successfully deleted.","Váš účet Jabberu byl úspěšně smazán."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Nesmíte posílat zprávy na ~s. Pro povolení navštivte ~s"}.
{"You're not allowed to create nodes","Nemáte povoleno vytvářet uzly"}.
+791 -664
View File
File diff suppressed because it is too large Load Diff
+41 -60
View File
@@ -1,12 +1,6 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," hat das Thema geändert auf: "}.
{"A password is required to enter this room","Sie brauchen ein Passwort um diesen Raum zu betreten"}.
%% -*- coding: utf-8 -*-
{"Accept","Akzeptieren"}.
{"Access Configuration","Zugangskonfiguration"}.
{"Access Control List Configuration","Konfiguration der Zugangskontrolllisten"}.
{"Access Control Lists","Zugangskontrolllisten (ACL)"}.
{"Access denied by service policy","Zugang aufgrund der Dienstrichtlinien verweigert"}.
{"Access Rules","Zugangsregeln"}.
{"Action on user","Aktion auf Benutzer"}.
{"Add Jabber ID","Jabber-ID hinzufügen"}.
{"Add New","Neue(n) hinzufügen"}.
@@ -15,7 +9,6 @@
{"Administration","Verwaltung"}.
{"Administrator privileges required","Administratorenrechte benötigt"}.
{"All activity","Alle Aktivitäten"}.
{"All Users","Alle Benutzer"}.
{"Allow users to change the subject","Erlaube Benutzern das Thema zu ändern"}.
{"Allow users to query other users","Erlaube Benutzern Informationen über andere Benutzer abzufragen"}.
{"Allow users to send invites","Erlaube Benutzern Einladungen zu senden"}.
@@ -23,14 +16,16 @@
{"Allow visitors to change nickname","Erlaube Besuchern ihren Benutzernamen zu ändern"}.
{"Allow visitors to send private messages to","Erlaube Besuchern das Senden von privaten Nachrichten an"}.
{"Allow visitors to send status text in presence updates","Erlaube Besuchern einen Text bei Statusänderung zu senden"}.
{"All Users","Alle Benutzer"}.
{"Announcements","Ankündigungen"}.
{"A password is required to enter this room","Sie brauchen ein Passwort um diesen Raum zu betreten"}.
{"April","April"}.
{"August","August"}.
{"Automatic node creation is not enabled","Automatische Knoten-Erstellung ist nicht aktiviert"}.
{"Backup","Datensicherung"}.
{"Backup Management","Datensicherungsverwaltung"}.
{"Backup of ~p","Sicherung von ~p"}.
{"Backup to File at ","Datensicherung in die Datei "}.
{"Backup","Datensicherung"}.
{"Bad format","Ungültiges Format"}.
{"Birthday","Geburtsdatum"}.
{"Both the username and the resource are required","Sowohl der Benutzername als auch die Ressource werden benötigt"}.
@@ -56,19 +51,19 @@
{"City","Stadt"}.
{"Commands","Befehle"}.
{"Conference room does not exist","Konferenzraum existiert nicht"}.
{"Configuration of room ~s","Konfiguration für Raum ~s"}.
{"Configuration","Konfiguration"}.
{"Configuration of room ~s","Konfiguration für Raum ~s"}.
{"Connected Resources:","Verbundene Ressourcen:"}.
{"Country","Land"}.
{"CPU Time:","CPU-Zeit:"}.
{"Database","Datenbank"}.
{"Database failure","Datenbankfehler"}.
{"Database Tables at ~p","Datenbanktabellen auf ~p"}.
{"Database Tables Configuration at ","Datenbanktabellen-Konfiguration auf "}.
{"Database","Datenbank"}.
{"December","Dezember"}.
{"Default users as participants","Benutzer werden standardmäßig vollwertige Teilnehmer"}.
{"Delete message of the day on all hosts","Lösche Nachricht des Tages auf allen Hosts"}.
{"Delete message of the day","Lösche Nachricht des Tages"}.
{"Delete message of the day on all hosts","Lösche Nachricht des Tages auf allen Hosts"}.
{"Delete Selected","Markierte löschen"}.
{"Delete User","Benutzer löschen"}.
{"Description:","Beschreibung:"}.
@@ -114,7 +109,6 @@
{"Family Name","Nachname"}.
{"February","Februar"}.
{"File larger than ~w bytes","Datei größer als ~w Bytes"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Füllen sie die Felder aus, um nach passenden Jabber-Benutzern zu suchen (beenden Sie ein Feld mit *, um auch nach Teilzeichenketten zu suchen)"}.
{"Friday","Freitag"}.
{"From ~s","Von ~s"}.
{"From","Von"}.
@@ -128,12 +122,13 @@
{"Group ","Gruppe "}.
{"Groups","Gruppen"}.
{"has been banned","wurde gebannt"}.
{"has been kicked because of a system shutdown","wurde wegen einer Systemabschaltung gekickt"}.
{"has been kicked because of an affiliation change","wurde wegen Änderung des Mitgliederstatus gekickt"}.
{"has been kicked because of a system shutdown","wurde wegen einer Systemabschaltung gekickt"}.
{"has been kicked because the room has been changed to members-only","wurde gekickt weil der Raum auf Nur-Mitglieder umgestellt wurde"}.
{"has been kicked","wurde gekickt"}.
{"Host unknown","Host unbekannt"}.
{" has set the subject to: "," hat das Thema geändert auf: "}.
{"Host","Host"}.
{"Host unknown","Host unbekannt"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Wenn Sie das CAPTCHA-Bild nicht sehen, besuchen Sie bitte die Webseite."}.
{"Import Directory","Verzeichnis importieren"}.
{"Import File","Datei importieren"}.
@@ -156,12 +151,11 @@
{"Invalid 'from' attribute in forwarded message","Ungültiges 'from'-Attribut in weitergeleiteter Nachricht"}.
{"Invitations are not allowed in this conference","Einladungen sind in dieser Konferenz nicht erlaubt"}.
{"IP addresses","IP-Adressen"}.
{"IP","IP"}.
{"is now known as","ist nun bekannt als"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Es ist nicht erlaubt Fehlermeldungen an den Raum zu senden. Der Teilnehmer (~s) hat eine Fehlermeldung (~s) gesendet und wurde aus dem Raum gekickt"}.
{"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"}.
{"It is not allowed to send private messages","Es ist nicht erlaubt private Nachrichten zu senden"}.
{"Jabber Account Registration","Jabber-Konto-Anmeldung"}.
{"Jabber ID","Jabber-ID"}.
{"January","Januar"}.
@@ -175,8 +169,6 @@
{"leaves the room","verlässt den Raum"}.
{"List of modules to start","Liste der zu startenden Module"}.
{"List of rooms","Liste von Chaträumen"}.
{"Listened Ports at ","Aktive Ports bei"}.
{"Listened Ports","Aktive Ports"}.
{"Low level update script","Low-Level-Aktualisierungsscript"}.
{"Make participants list public","Teilnehmerliste öffentlich machen"}.
{"Make room CAPTCHA protected","Raum mittels CAPTCHA schützen"}.
@@ -199,8 +191,6 @@
{"Moderator privileges required","Moderatorrechte benötigt"}.
{"Modified modules","Geänderte Module"}.
{"Module failed to handle the query","Modul konnte die Anfrage nicht verarbeiten"}.
{"Module","Modul"}.
{"Modules at ~p","Module bei ~p"}.
{"Modules","Module"}.
{"Monday","Montag"}.
{"Multicast","Multicast"}.
@@ -212,23 +202,29 @@
{"Neither 'role' nor 'affiliation' attribute found","Weder 'role'- noch 'affiliation'-Attribut gefunden"}.
{"Never","Nie"}.
{"New Password:","Neues Passwort:"}.
{"Nickname","Benutzername"}.
{"Nickname Registration at ","Registrieren des Benutzernames auf "}.
{"Nickname ~s does not exist in the room","Der Benutzername ~s existiert im Raum nicht"}.
{"Nickname","Benutzername"}.
{"No 'access' found in data form","Kein 'access' in Datenformular gefunden"}.
{"No 'acls' found in data form","Kein 'acls' in Datenformular gefunden"}.
{"No 'affiliation' attribute found","Kein 'affiliation'-Attribut gefunden"}.
{"No available resource found","Keine verfügbare Ressource gefunden"}.
{"No body provided for announce message","Kein Text für die Ankündigungsnachricht angegeben"}.
{"No data form found","Kein Datenformular gefunden"}.
{"No Data","Keine Daten"}.
{"Node already exists","Knoten existiert bereits"}.
{"Node index not found","Knotenindex nicht gefunden"}.
{"Node not found","Knoten nicht gefunden"}.
{"Node ~p","Knoten ~p"}.
{"Nodeprep has failed","Nodeprep schlug fehl"}.
{"Nodes","Knoten"}.
{"No features available","Keine Eigenschaften verfügbar"}.
{"No hook has processed this command","Kein Hook hat diesen Befehl verarbeitet"}.
{"No info about last activity found","Keine Informationen über letzte Aktivität gefunden"}.
{"No 'item' element found","Kein 'item'-Element gefunden"}.
{"No items found in this query","Keine Elemente in dieser Anfrage gefunden"}.
{"No limit","Keine Begrenzung"}.
{"No module is handling this query","Kein Modul verarbeitet diese Anfrage"}.
{"No 'modules' found in data form","Kein 'modules' in Datenformular gefunden"}.
{"None","Keine"}.
{"No node specified","Kein Knoten angegeben"}.
{"No 'password' found in data form","Kein 'password' in Datenformular gefunden"}.
{"No 'password' found in this query","Kein 'password' in dieser Anfrage gefunden"}.
@@ -239,15 +235,8 @@
{"No running node found","Kein laufender Knoten gefunden"}.
{"No services available","Keine Dienste verfügbar"}.
{"No statistics found for this item","Keine Statistiken für dieses Element gefunden"}.
{"No 'to' attribute found in the invitation","Kein 'to'-Attribut in der Einladung gefunden"}.
{"Node already exists","Knoten existiert bereits"}.
{"Node index not found","Knotenindex nicht gefunden"}.
{"Node not found","Knoten nicht gefunden"}.
{"Node ~p","Knoten ~p"}.
{"Nodeprep has failed","Nodeprep schlug fehl"}.
{"Nodes","Knoten"}.
{"None","Keine"}.
{"Not Found","Nicht gefunden"}.
{"No 'to' attribute found in the invitation","Kein 'to'-Attribut in der Einladung gefunden"}.
{"Not subscribed","Nicht abonniert"}.
{"November","November"}.
{"Number of online users","Anzahl der angemeldeten Benutzer"}.
@@ -257,9 +246,9 @@
{"Offline Messages:","Offline-Nachrichten:"}.
{"OK","OK"}.
{"Old Password:","Altes Passwort:"}.
{"Online","Angemeldet"}.
{"Online Users","Angemeldete Benutzer"}.
{"Online Users:","Angemeldete Benutzer:"}.
{"Online","Angemeldet"}.
{"Only <enable/> or <disable/> tags are allowed","Nur <enable/>- oder <disable/>-Tags sind erlaubt"}.
{"Only <list/> element is allowed in this query","Nur <list/>-Elemente sind in dieser Anfrage erlaubt"}.
{"Only members may query archives of this room","Nur Mitglieder dürfen den Verlauf dieses Raumes abrufen"}.
@@ -269,7 +258,6 @@
{"Only occupants are allowed to send messages to the conference","Nur Teilnehmer dürfen Nachrichten an die Konferenz schicken"}.
{"Only occupants are allowed to send queries to the conference","Nur Teilnehmer sind berechtigt Anfragen an die Konferenz zu senden"}.
{"Only service administrators are allowed to send service messages","Nur Service-Administratoren sind berechtigt, Servicenachrichten zu versenden"}.
{"Options","Optionen"}.
{"Organization Name","Name der Organisation"}.
{"Organization Unit","Abteilung"}.
{"Outgoing s2s Connections","Ausgehende s2s-Verbindungen"}.
@@ -277,31 +265,27 @@
{"Owner privileges required","Besitzerrechte benötigt"}.
{"Packet","Paket"}.
{"Parse failed","Parsen fehlgeschlagen"}.
{"Password Verification","Passwort bestätigen"}.
{"Password Verification:","Passwort bestätigen:"}.
{"Password","Passwort"}.
{"Password:","Passwort:"}.
{"Password Verification","Passwort bestätigen"}.
{"Password Verification:","Passwort bestätigen:"}.
{"Path to Dir","Pfad zum Verzeichnis"}.
{"Path to File","Pfad zur Datei"}.
{"Pending","Ausstehend"}.
{"Period: ","Zeitraum: "}.
{"Ping query is incorrect","Ping-Anfrage ist falsch"}.
{"Ping","Ping"}.
{"Ping query is incorrect","Ping-Anfrage ist falsch"}.
{"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, dass diese Optionen nur die eingebaute Mnesia-Datenbank sichern. Wenn sie das ODBC-Modul verwenden, müssen Sie auch die SQL-Datenbank separat sichern."}.
{"Please, wait for a while before sending new voice request","Bitte warten Sie ein wenig, bevor Sie eine weitere Anfrage für Sprachrechte senden"}.
{"Pong","Pong"}.
{"Port","Port"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Ein 'ask'-Attribut zu besitzen ist laut RFC6121 nicht erlaubt"}.
{"private, ","privat, "}.
{"Protocol","Protokoll"}.
{"Publishing items to collection node is not allowed","Es ist nicht erlaubt Elemente auf dem Sammelknoten zu veröffentlichen"}.
{"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"}.
{"Query to another users is forbidden","Anfrage an andere Benutzer ist verboten"}.
{"RAM and disc copy","RAM und Festplatte"}.
{"RAM copy","Nur RAM"}.
{"Raw","Unformatiert"}.
{"Really delete message of the day?","Die Nachricht des Tages wirklich löschen?"}.
{"Recipient is not in the conference room","Der Empfänger ist nicht im Raum"}.
{"Register a Jabber account","Jabber-Konto registrieren"}.
@@ -310,12 +294,12 @@
{"Registered Users:","Registrierte Benutzer:"}.
{"Remote copy","Fernkopie"}.
{"Remove All Offline Messages","Alle Offline-Nachrichten löschen"}.
{"Remove User","Benutzer löschen"}.
{"Remove","Entfernen"}.
{"Remove User","Benutzer löschen"}.
{"Replaced by new connection","Durch neue Verbindung ersetzt"}.
{"Resources","Ressourcen"}.
{"Restart Service","Dienst neustarten"}.
{"Restart","Neustart"}.
{"Restart Service","Dienst neustarten"}.
{"Restore Backup from File at ","Datenwiederherstellung aus der Datei "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Stelle binäre Sicherung beim nächsten ejabberd-Neustart wieder her (benötigt weniger Speicher):"}.
{"Restore binary backup immediately:","Stelle binäre Sicherung sofort wieder her:"}.
@@ -326,14 +310,12 @@
{"Room description","Raumbeschreibung"}.
{"Room Occupants","Teilnehmer in diesem Raum"}.
{"Room title","Raumname"}.
{"Roster","Kontaktliste"}.
{"Roster module has failed","Roster-Modul schlug fehl"}.
{"Roster of ","Kontaktliste von "}.
{"Roster size","Kontaktlistengröße"}.
{"Roster","Kontaktliste"}.
{"RPC Call Error","Fehler bei RPC-Aufruf"}.
{"Running Nodes","Aktive Knoten"}.
{"~s access rule configuration","~s Zugangsregel-Konfiguration"}.
{"~s invites you to the room ~s","~s lädt Sie in den Raum ~s ein"}.
{"Saturday","Samstag"}.
{"Scan failed","Scan fehlgeschlagen"}.
{"Script check","Script-Überprüfung"}.
@@ -352,11 +334,11 @@
{"Show Integral Table","Integral-Tabelle anzeigen"}.
{"Show Ordinary Table","Gewöhnliche Tabelle anzeigen"}.
{"Shut Down Service","Dienst herunterfahren"}.
{"~s invites you to the room ~s","~s lädt Sie in den Raum ~s ein"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Einige Jabber-Clients speichern Ihr Passwort auf dem Computer. Aus Sicherheitsgründen sollten Sie das nur auf Ihrem persönlichen Computer tun."}.
{"~s's Offline Messages Queue","~ss Offline-Nachrichten-Warteschlange"}.
{"Start Modules at ","Starte Module auf "}.
{"Start Modules","Module starten"}.
{"Start","Starten"}.
{"Statistics of ~p","Statistiken von ~p"}.
{"Statistics","Statistiken"}.
{"Stop Modules at ","Stoppe Module auf "}.
@@ -378,15 +360,15 @@
{"The CAPTCHA verification has failed","Die CAPTCHA-Verifizierung schlug fehl"}.
{"The feature requested is not supported by the conference","Die gewünschte Eigenschaft wird von der Konferenz nicht unterstützt"}.
{"The password contains unacceptable characters","Das Passwort enthält ungültige Zeichen"}.
{"The password is too weak","Das Passwort ist zu schwach"}.
{"the password is","das Passwort lautet"}.
{"The password is too weak","Das Passwort ist zu schwach"}.
{"The password of your Jabber account was successfully changed.","Das Passwort von Ihrem Jabber-Konto wurde geändert."}.
{"The query is only allowed from local users","Die Anfrage ist nur von lokalen Benutzern erlaubt"}.
{"The query must not contain <item/> elements","Die Anfrage darf keine <item/>-Elemente enthalten"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Das Stanza darf nur ein <active/>-Element, ein <default/>-Element oder ein <list/>-Element enthalten."}.
{"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passworts auf: "}.
{"There was an error creating the account: ","Es trat ein Fehler beim Erstellen des Kontos auf: "}.
{"There was an error deleting the account: ","Es trat ein Fehler beim Löschen des Kontos auf: "}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Das Stanza darf nur ein <active/>-Element, ein <default/>-Element oder ein <list/>-Element enthalten."}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Groß-/Kleinschreibung spielt hierbei keine Rolle: macbeth ist gleich MacBeth und Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Diese Seite erlaubt das Anlegen eines Jabber-Kontos auf diesem Jabber-Server. Ihre JID (Jabber IDentifier) setzt sich folgend zusammen: benutzername@server. Bitte lesen sie die Hinweise genau durch, um die Felder korrekt auszufüllen."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Diese Seite erlaubt es, ein Jabber-Konto von diesem Server zu entfernen."}.
@@ -394,16 +376,17 @@
{"Thursday","Donnerstag"}.
{"Time delay","Zeitverzögerung"}.
{"Time","Zeit"}.
{"To register, visit ~s","Um sich anzumelden, besuchen Sie ~s"}.
{"To ~s","An ~s"}.
{"To","An"}.
{"Token TTL","Token TTL"}.
{"Too many active bytestreams","Zu viele aktive Bytestreams"}.
{"Too many CAPTCHA requests","Zu viele CAPTCHA-Anfragen"}.
{"Too many <item/> elements","Zu viele <item/>-Elemente"}.
{"Too many <list/> elements","Zu viele <list/>-Elemente"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Zu viele (~p) fehlgeschlagene Anmeldeversuche von dieser IP Adresse (~s). Die Adresse wird bis ~s UTC blockiert."}.
{"Too many unacked stanzas","Zu viele unbestätigte Stanzas"}.
{"Too many users in this conference","Zu viele Benutzer in dieser Konferenz"}.
{"To register, visit ~s","Um sich anzumelden, besuchen Sie ~s"}.
{"To ~s","An ~s"}.
{"Total rooms","Alle Chaträume"}.
{"Traffic rate limit is exceeded","Datenratenlimit wurde überschritten"}.
{"Transactions Aborted:","Abgebrochene Transaktionen:"}.
@@ -415,28 +398,27 @@
{"Unable to register route on existing local domain","Konnte Route auf existierender lokaler Domain nicht registrieren"}.
{"Unauthorized","Nicht berechtigt"}.
{"Unexpected action","Unerwartete Aktion"}.
{"Unregister a Jabber account","Jabber-Konto entfernen"}.
{"Unregister","Abmelden"}.
{"Unregister a Jabber account","Jabber-Konto entfernen"}.
{"Unsupported <index/> element","Nicht unterstütztes <index/>-Element"}.
{"Update","Aktualisieren"}.
{"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 ~p","Aktualisierung ~p"}.
{"Update plan","Aktualisierungsplan"}.
{"Update script","Aktualisierungsscript"}.
{"Update","Aktualisieren"}.
{"Uptime:","Betriebszeit:"}.
{"User already exists","Benutzer existiert bereits"}.
{"User","Benutzer"}.
{"User (jid)","Benutzer (JID)"}.
{"User Management","Benutzerverwaltung"}.
{"User part of JID in 'from' is empty","Benutzerteil der JID in 'from' ist leer"}.
{"Username:","Benutzername:"}.
{"Users are not allowed to register accounts so quickly","Benutzer dürfen Konten nicht so schnell registrieren"}.
{"Users","Benutzer"}.
{"User ~s","Benutzer ~s"}.
{"User session not found","Benutzersitzung nicht gefunden"}.
{"User session terminated","Benutzersitzung beendet"}.
{"User","Benutzer"}.
{"Username:","Benutzername:"}.
{"Users are not allowed to register accounts so quickly","Benutzer dürfen Konten nicht so schnell registrieren"}.
{"Users Last Activity","Letzte Benutzeraktivität"}.
{"Users","Benutzer"}.
{"Validate","Validieren"}.
{"Value 'get' of 'type' attribute is not allowed","Wert 'get' des 'type'-Attributs ist nicht erlaubt"}.
{"Value of '~s' should be boolean","Wert von '~s' sollte boolesch sein"}.
@@ -459,7 +441,6 @@
{"You need an x:data capable client to search","Sie benötigen einen Client, der x:data unterstützt, um die Suche verwenden zu können"}.
{"Your active privacy list has denied the routing of this stanza.","Ihre aktive Privacy-Liste hat die Weiterleitung des Stanzas unterbunden."}.
{"Your contact offline message queue is full. The message has been discarded.","Ihre Offline-Nachrichten-Warteschlange ist voll. Die Nachricht wurde verworfen."}.
{"You're not allowed to create nodes","Es ist Ihnen nicht erlaubt Knoten zu erstellen"}.
{"Your Jabber account was successfully created.","Ihr Jabber Konto wurde erfolgreich erstellt."}.
{"Your Jabber account was successfully deleted.","Ihr Jabber Konto wurde erfolgreich gelöscht."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ihre Nachrichten an ~s werden blockiert. Um dies zu ändern, besuchen Sie ~s"}.
{"You're not allowed to create nodes","Es ist Ihnen nicht erlaubt Knoten zu erstellen"}.
+792 -664
View File
File diff suppressed because it is too large Load Diff
+692 -635
View File
File diff suppressed because it is too large Load Diff
+23 -43
View File
@@ -1,12 +1,6 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," έχει θέσει το θέμα σε: "}.
{"A password is required to enter this room","Απαιτείται κωδικός πρόσβασης για είσοδο σε αυτή την αίθουσα"}.
%% -*- coding: utf-8 -*-
{"Accept","Αποδοχή"}.
{"Access Configuration","Διαμόρφωση Πρόσβασης"}.
{"Access Control List Configuration","Διαχείριση στις Λίστες Ελέγχου Πρόσβασης"}.
{"Access Control Lists","Λίστες Ελέγχου Πρόσβασης"}.
{"Access denied by service policy","Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"}.
{"Access Rules","Κανόνες Πρόσβασης"}.
{"Action on user","Eνέργεια για το χρήστη"}.
{"Add Jabber ID","Προσθήκη Jabber Ταυτότητας"}.
{"Add New","Προσθήκη νέου"}.
@@ -15,7 +9,6 @@
{"Administration","Διαχείριση"}.
{"Administrator privileges required","Aπαιτούνται προνόμια διαχειριστή"}.
{"All activity","Όλες οι δραστηριότητες"}.
{"All Users","Όλοι οι χρήστες"}.
{"Allow users to change the subject","Επιτρέψετε στους χρήστες να αλλάζουν το θέμα"}.
{"Allow users to query other users","Επιτρέπστε στους χρήστες να ερωτούν άλλους χρήστες"}.
{"Allow users to send invites","Επιτρέψετε στους χρήστες να αποστέλλουν προσκλήσεις"}.
@@ -23,7 +16,9 @@
{"Allow visitors to change nickname","Επιτρέψετε στους επισκέπτες να αλλάζου ψευδώνυμο"}.
{"Allow visitors to send private messages to","Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα σε"}.
{"Allow visitors to send status text in presence updates","Επιτρέψτε στους επισκέπτες να αποστέλλουν κατάσταση στις ενημερώσεις παρουσίας"}.
{"All Users","Όλοι οι χρήστες"}.
{"Announcements","Ανακοινώσεις"}.
{"A password is required to enter this room","Απαιτείται κωδικός πρόσβασης για είσοδο σε αυτή την αίθουσα"}.
{"April","Απρίλιος"}.
{"August","Αύγουστος"}.
{"Automatic node creation is not enabled","Η αυτόματη δημιουργία κόμβων δεν είναι ενεργοποιημένη"}.
@@ -114,7 +109,6 @@
{"Family Name","Επώνυμο"}.
{"February","Φεβρουάριος"}.
{"File larger than ~w bytes","Αρχείο μεγαλύτερο από ~w bytes"}.
{"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","Από"}.
@@ -125,13 +119,14 @@
{"Get User Password","Έκθεση Κωδικού Πρόσβασης Χρήστη"}.
{"Get User Statistics","Έκθεση Στατιστικών Χρήστη"}.
{"Given Name","Ονομα"}.
{"Group ","Ομάδα "}.
{"Groups","Ομάδες"}.
{"Group ","Ομάδα "}.
{"has been banned","έχει απαγορευθεί"}.
{"has been kicked because of a system shutdown","αποβλήθηκε λόγω τερματισμού συστήματος"}.
{"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 unknown","Ο κεντρικός διακομιστής είναι άγνωστος"}.
{"Host","Κεντρικός Υπολογιστής"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Εάν δεν βλέπετε την εικόνα CAPTCHA εδώ, επισκεφθείτε την ιστοσελίδα."}.
@@ -156,7 +151,6 @@
{"Invalid 'from' attribute in forwarded message","Μη έγκυρο χαρακτηριστικό 'από' στο προωθούμενο μήνυμα"}.
{"Invitations are not allowed in this conference","Οι προσκλήσεις δεν επιτρέπονται σε αυτή τη διάσκεψη"}.
{"IP addresses","Διευθύνσεις IP"}.
{"IP","IP"}.
{"is now known as","είναι τώρα γνωστή ως"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Δεν επιτρέπεται η αποστολή μηνυμάτων σφάλματος στο δωμάτιο. Ο συμμετέχων (~ s) έχει στείλει ένα μήνυμα σφάλματος (~ s) και έχει πέταχτεί έξω από την αίθουσα"}.
{"It is not allowed to send private messages of type \"groupchat\"","Δεν επιτρέπεται να στείλει προσωπικά μηνύματα του τύπου \"groupchat\""}.
@@ -175,8 +169,6 @@
{"leaves the room","εγκαταλείπει την αίθουσα"}.
{"List of modules to start","Λίστα των Module για Εκκίνηση"}.
{"List of rooms","Κατάλογος αιθουσών"}.
{"Listened Ports at ","Παρακολουθούμενες Θύρες στο "}.
{"Listened Ports","Παρακολουθούμενες Θύρες"}.
{"Low level update script","Προγράμα ενημέρωσης χαμηλού επίπεδου"}.
{"Make participants list public","Κάντε κοινό τον κατάλογο συμμετεχόντων"}.
{"Make room CAPTCHA protected","Κάντε την αίθουσα CAPTCHA προστατεύονομενη"}.
@@ -199,8 +191,6 @@
{"Moderator privileges required","Aπαιτούνται προνόμια συντονιστή"}.
{"Modified modules","Τροποποιημένα modules"}.
{"Module failed to handle the query","Το μodule απέτυχε να χειριστεί το ερώτημα"}.
{"Module","Module"}.
{"Modules at ~p","Modules στο ~p"}.
{"Modules","Modules"}.
{"Monday","Δευτέρα"}.
{"Multicast","Multicast"}.
@@ -215,20 +205,26 @@
{"Nickname Registration at ","Εγγραφή με Ψευδώνυμο στο "}.
{"Nickname ~s does not exist in the room","Ψευδώνυμο ~s δεν υπάρχει σε αυτή την αίθουσα"}.
{"Nickname","Ψευδώνυμο"}.
{"No 'access' found in data form","Δεν υπάρχει 'access' στη φόρμα δεδομένων"}.
{"No 'acls' found in data form","Δεν υπάρχει 'acls' στη φόρμα δεδομένων"}.
{"No 'affiliation' attribute found","Δεν βρέθηκε χαρακτηριστικό 'affiliation'"}.
{"No available resource found","Δεν βρέθηκε διαθέσιμος πόρος"}.
{"No body provided for announce message","Δεν προμηθεύτικε περιεχόμενο ανακοινώσης"}.
{"No data form found","Δεν βρέθηκε φόρμα δεδομένων"}.
{"No Data","Κανένα στοιχείο"}.
{"Node already exists","Ο κόμβος υπάρχει ήδη"}.
{"Node index not found","Ο δείκτης κόμβου δεν βρέθηκε"}.
{"Node not found","Κόμβος δεν βρέθηκε"}.
{"Nodeprep has failed","Το Nodeprep απέτυχε"}.
{"Node ~p","Κόμβος ~p"}.
{"Nodes","Κόμβοι"}.
{"No features available","Δεν υπάρχουν διαθέσιμες λειτουργίες"}.
{"No hook has processed this command","Κανένα άγκιστρο δεν έχει επεξεργαστεί αυτήν την εντολή"}.
{"No info about last activity found","Δεν βρέθηκαν πληροφορίες για την τελευταία δραστηριότητα"}.
{"No 'item' element found","Δεν βρέθηκε στοιχείο 'item'"}.
{"No items found in this query","Δεν βρέθηκαν στοιχεία σε αυτό το ερώτημα"}.
{"No limit","Χωρίς όριο"}.
{"No module is handling this query","Καμνένα module δεν χειρίζεται αυτό το ερώτημα"}.
{"No 'modules' found in data form","Δεν υπάρχει 'modules' στη φόρμα δεδομένων"}.
{"None","Κανένα"}.
{"No node specified","Δεν καθορίστηκε κόμβος"}.
{"No 'password' found in data form","Δεν υπάρχει 'password' στη φόρμα δεδομένων"}.
{"No 'password' found in this query","Δεν βρέθηκε \"password\" σε αυτό το ερώτημα"}.
@@ -239,15 +235,8 @@
{"No running node found","Δεν βρέθηκε ενεργός κόμβος"}.
{"No services available","Δεν υπάρχουν διαθέσιμες υπηρεσίες"}.
{"No statistics found for this item","Δεν βρέθηκαν στατιστικά στοιχεία για αυτό το στοιχείο"}.
{"No 'to' attribute found in the invitation","Δεν υπάρχει χαρακτηριστικό 'to' που βρέθηκε στην πρόσκληση"}.
{"Node already exists","Ο κόμβος υπάρχει ήδη"}.
{"Node index not found","Ο δείκτης κόμβου δεν βρέθηκε"}.
{"Node not found","Κόμβος δεν βρέθηκε"}.
{"Node ~p","Κόμβος ~p"}.
{"Nodeprep has failed","Το Nodeprep απέτυχε"}.
{"Nodes","Κόμβοι"}.
{"None","Κανένα"}.
{"Not Found","Δεν Βρέθηκε"}.
{"No 'to' attribute found in the invitation","Δεν υπάρχει χαρακτηριστικό 'to' που βρέθηκε στην πρόσκληση"}.
{"Not subscribed","Δεν έχετε εγγραφεί"}.
{"November","Νοέμβριος"}.
{"Number of online users","Αριθμός συνδεδεμένων χρηστών"}.
@@ -269,7 +258,6 @@
{"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 Συνδέσεις"}.
@@ -290,18 +278,14 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Παρακαλώ σημειώστε ότι οι επιλογές αυτές θα αποθήκευσουν Αντιγράφο Ασφαλείας μόνο της ενσωματωμένης βάσης δεδομένων Mnesia. Εάν χρησιμοποιείτε το module ODBC, θα πρέπει επίσης να κάνετε χωριστά Αντιγράφο Ασφαλείας της SQL βάση δεδομένων σας ."}.
{"Please, wait for a while before sending new voice request","Παρακαλώ, περιμένετε για λίγο πριν την αποστολή νέου αιτήματος φωνής"}.
{"Pong","Pong"}.
{"Port","Θύρα"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Η ιδιότητα 'ask' δεν επιτρέπεται από το RFC6121"}.
{"private, ","ιδιωτικό, "}.
{"Protocol","Πρωτόκολλο"}.
{"Publishing items to collection node is not allowed","Η δημοσίευση στοιχείων σε κόμβους συλλογής δεν επιτρέπεται"}.
{"Publish-Subscribe","Δημοσίευση-Εγγραφή"}.
{"PubSub subscriber request","Αίτηση συνδρομητή Δημοσίευσης-Εγγραφής"}.
{"Queries to the conference members are not allowed in this room","Ερωτήματα πρώς τα μέλη της διασκέψεως δεν επιτρέπονται σε αυτήν την αίθουσα"}.
{"Query to another users is forbidden","Το ερώτημα σε άλλους χρήστες είναι απαγορευμένο"}.
{"RAM and disc copy","Αντίγραφο μόνο σε RAM καί δίσκο"}.
{"RAM copy","Αντίγραφο σε RAM"}.
{"Raw","Ακατέργαστο"}.
{"Really delete message of the day?","Πραγματικά να διαγράψετε το μήνυμα της ημέρας;"}.
{"Recipient is not in the conference room","Παραλήπτης δεν είναι στην αίθουσα συνεδριάσεων"}.
{"Register a Jabber account","Καταχωρήστε έναν λογαριασμό Jabber"}.
@@ -332,8 +316,6 @@
{"Roster","Καταλόγος Επαφών"}.
{"RPC Call Error","Σφάλμα RPC Κλήσης"}.
{"Running Nodes","Ενεργοί Κόμβοι"}.
{"~s access rule configuration","~s διαμόρφωση κανόνα πρόσβασης"}.
{"~s invites you to the room ~s","~s σας προσκαλεί στην αίθουσα ~s"}.
{"Saturday","Σάββατο"}.
{"Scan failed","Η σάρωση απέτυχε"}.
{"Script check","Script ελέγχου"}.
@@ -352,11 +334,11 @@
{"Show Integral Table","Δείτε Ολοκληρωτικό Πίνακα"}.
{"Show Ordinary Table","Δείτε Κοινό Πίνακα"}.
{"Shut Down Service","Κλείσιμο Υπηρεσίας"}.
{"~s invites you to the room ~s","~s σας προσκαλεί στην αίθουσα ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Μερικοί πελάτες Jabber μπορεί να αποθηκεύσουν τον κωδικό πρόσβασής σας στον υπολογιστή σας. Χρησιμοποιήστε αυτό το χαρακτηριστικό μόνο εάν εμπιστεύεστε την ασφάλεια του υπολογιστή σας."}.
{"~s's Offline Messages Queue","Η Σειρά Χωρίς Σύνδεση Μηνύματων τού ~s"}.
{"Start Modules at ","Εκκίνηση Modules στο "}.
{"Start Modules","Εκκίνηση Modules"}.
{"Start","Εκκίνηση"}.
{"Statistics of ~p","Στατιστικές του ~p"}.
{"Statistics","Στατιστικές"}.
{"Stop Modules at ","Παύση Modules στο "}.
@@ -383,10 +365,10 @@
{"The password of your Jabber account was successfully changed.","Ο κωδικός πρόσβασης του Jabber λογαριασμού σας έχει αλλάξει επιτυχώς."}.
{"The query is only allowed from local users","Το ερώτημα επιτρέπεται μόνο από τοπικούς χρήστες"}.
{"The query must not contain <item/> elements","Το ερώτημα δεν πρέπει να περιέχει στοιχείο <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Η stanza ΠΡΕΠΕΙ να περιέχει μόνο ένα στοιχείο <active />, ένα στοιχείο <default /> ή ένα στοιχείο <list />"}.
{"There was an error changing the password: ","Υπήρξε ένα σφάλμα κατά την αλλαγή του κωδικού πρόσβασης: "}.
{"There was an error creating the account: ","Υπήρξε ένα σφάλμα κατά τη δημιουργία του λογαριασμού: "}.
{"There was an error deleting the account: ","Υπήρξε ένα σφάλμα κατά τη διαγραφή του λογαριασμού: "}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Η stanza ΠΡΕΠΕΙ να περιέχει μόνο ένα στοιχείο <active />, ένα στοιχείο <default /> ή ένα στοιχείο <list />"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Ανεξαρτήτως με πεζά ή κεφαλαία: 'μιαλεξη' είναι το ίδιο με 'ΜιαΛέξη' και 'Μιαλέξη'."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Αυτή η σελίδα σας επιτρέπει να δημιουργήσετε ένα λογαριασμό Jabber σε αυτόν το διακομιστή Jabber. JID σας (Jabber Identifier) θα είναι της μορφής: όνομα_χρήστη@διακομιστής_Jabber. Παρακαλώ διαβάστε προσεκτικά τις οδηγίες για να συμπληρώσετε σωστά τα πεδία."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Η σελίδα αυτή δίνει τη δυνατότητα να καταργήσετε την καταχώρηση ενός λογαριασμό Jabber σε αυτόν το διακομιστή Jabber."}.
@@ -394,8 +376,6 @@
{"Thursday","Πέμπτη"}.
{"Time delay","Χρόνος καθυστέρησης"}.
{"Time","Χρόνος"}.
{"To register, visit ~s","Για να εγγραφείτε, επισκεφθείτε το ~ s"}.
{"To ~s","Πρώς ~s"}.
{"Token TTL","Token TTL"}.
{"Too many active bytestreams","Πάρα πολλά ενεργά bytestreams"}.
{"Too many CAPTCHA requests","Πάρα πολλά αιτήματα CAPTCHA"}.
@@ -403,6 +383,8 @@
{"Too many <list/> elements","Πάρα πολλά στοιχεία <list/>"}.
{"Too many unacked stanzas","Πάρα πολλές μη αναγνωρισμένες stanzas"}.
{"Too many users in this conference","Πάρα πολλοί χρήστες σε αυτή τη διάσκεψη"}.
{"To register, visit ~s","Για να εγγραφείτε, επισκεφθείτε το ~ s"}.
{"To ~s","Πρώς ~s"}.
{"Total rooms","Συνολικές Αίθουσες σύνεδριασης"}.
{"To","Πρώς"}.
{"Traffic rate limit is exceeded","Υπέρφορτωση"}.
@@ -428,13 +410,12 @@
{"User already exists","Ο χρήστης υπάρχει ήδη"}.
{"User (jid)","Χρήστη (jid)"}.
{"User Management","Διαχείριση χρηστών"}.
{"User part of JID in 'from' is empty","Το τμήμα χρήστη του JID στο 'from' είναι άδειο"}.
{"User session not found","Η συνάντηση χρήστη δεν βρέθηκε"}.
{"User session terminated","Η σύνδεση χρήστη τερματίστηκε"}.
{"User ~s","Ο Χρήστης ~s"}.
{"Username:","Όνομα χρήστη:"}.
{"Users are not allowed to register accounts so quickly","Οι χρήστες δεν επιτρέπεται να εγγραφούν λογαριασμούς τόσο γρήγορα"}.
{"User session not found","Η συνάντηση χρήστη δεν βρέθηκε"}.
{"User session terminated","Η σύνδεση χρήστη τερματίστηκε"}.
{"Users Last Activity","Τελευταία Δραστηριότητα Χρήστη"}.
{"User ~s","Ο Χρήστης ~s"}.
{"Users","Χρήστες"}.
{"User","Χρήστης"}.
{"Validate","Επαληθεύστε"}.
@@ -459,7 +440,6 @@
{"You need an x:data capable client to search","Χρειάζεστε ένα x:data ικανό πελάτη για αναζήτηση"}.
{"Your active privacy list has denied the routing of this stanza.","Ο ενεργός κατάλογος απορρήτου, έχει αρνηθεί τη δρομολόγηση αυτής της στροφής (stanza)."}.
{"Your contact offline message queue is full. The message has been discarded.","Η μνήμη χωρίς σύνδεση μήνυματών είναι πλήρης. Το μήνυμα έχει απορριφθεί."}.
{"You're not allowed to create nodes","Δεν σου επιτρέπεται η δημιουργία κόμβων"}.
{"Your Jabber account was successfully created.","Ο Jabber λογαριασμός σας δημιουργήθηκε με επιτυχία."}.
{"Your Jabber account was successfully deleted.","Ο Jabber λογαριασμός σας διαγράφηκε με επιτυχία."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Τα μηνύματά σας πρως ~s είναι αποκλεισμένα. Για αποδεσμεύση, επισκεφθείτε ~s"}.
{"You're not allowed to create nodes","Δεν σου επιτρέπεται η δημιουργία κόμβων"}.
+790 -659
View File
File diff suppressed because it is too large Load Diff
+27 -42
View File
@@ -1,20 +1,13 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," ŝanĝis la temon al: "}.
{"A password is required to enter this room","Pasvorto estas bezonata por eniri ĉi tiun babilejon"}.
{"Access Configuration","Agordo de atingo"}.
{"Access Control List Configuration","Agordo de atingokontrolo"}.
{"Access Control Lists","Atingokontrol-listoj"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Atingo rifuzita de serv-politiko"}.
{"Access Rules","Atingo-reguloj"}.
{"Action on user","Ago je uzanto"}.
{"Add Jabber ID","Aldonu Jabber ID"}.
{"Add New","Aldonu novan"}.
{"Add User","Aldonu Uzanton"}.
{"Administration of ","Mastrumado de "}.
{"Administration","Administro"}.
{"Administration of ","Mastrumado de "}.
{"Administrator privileges required","Administrantaj rajtoj bezonata"}.
{"All activity","Ĉiu aktiveco"}.
{"All Users","Ĉiuj Uzantoj"}.
{"Allow users to change the subject","Permesu uzantojn ŝanĝi la temon"}.
{"Allow users to query other users","Permesu uzantojn informpeti aliajn uzantojn"}.
{"Allow users to send invites","Permesu uzantojn sendi invitojn"}.
@@ -22,13 +15,15 @@
{"Allow visitors to change nickname","Permesu al vizitantoj ŝanĝi siajn kaŝnomojn"}.
{"Allow visitors to send private messages to","Permesu uzantojn sendi privatajn mesaĝojn al"}.
{"Allow visitors to send status text in presence updates","Permesu al vizitantoj sendi statmesaĝon en ĉeest-sciigoj"}.
{"All Users","Ĉiuj Uzantoj"}.
{"Announcements","Anoncoj"}.
{"A password is required to enter this room","Pasvorto estas bezonata por eniri ĉi tiun babilejon"}.
{"April","Aprilo"}.
{"August","Aŭgusto"}.
{"Backup","Faru Sekurkopion"}.
{"Backup Management","Mastrumado de sekurkopioj"}.
{"Backup of ~p","Sekurkopio de ~p"}.
{"Backup to File at ","Faru sekurkopion je "}.
{"Backup","Faru Sekurkopion"}.
{"Bad format","Malĝusta formo"}.
{"Birthday","Naskiĝtago"}.
{"CAPTCHA web page","CAPTCHA teksaĵ-paĝo"}.
@@ -48,18 +43,18 @@
{"City","Urbo"}.
{"Commands","Ordonoj"}.
{"Conference room does not exist","Babilejo ne ekzistas"}.
{"Configuration of room ~s","Agordo de babilejo ~s"}.
{"Configuration","Agordo"}.
{"Configuration of room ~s","Agordo de babilejo ~s"}.
{"Connected Resources:","Konektataj risurcoj:"}.
{"Country","Lando"}.
{"CPU Time:","CPU-tempo"}.
{"Database","Datumbazo"}.
{"Database Tables at ~p","Datumbaz-tabeloj je ~p"}.
{"Database Tables Configuration at ","Agordo de datumbaz-tabeloj je "}.
{"Database","Datumbazo"}.
{"December","Decembro"}.
{"Default users as participants","Kutime farigu uzantojn kiel partpoprenantoj"}.
{"Delete message of the day on all hosts","Forigu mesaĝo de la tago je ĉiu gastigo"}.
{"Delete message of the day","Forigu mesaĝo de la tago"}.
{"Delete message of the day on all hosts","Forigu mesaĝo de la tago je ĉiu gastigo"}.
{"Delete Selected","Forigu elektata(j)n"}.
{"Delete User","Forigu Uzanton"}.
{"Description:","Priskribo:"}.
@@ -95,10 +90,9 @@
{"Failed to extract JID from your voice request approval","Malsukcesis ekstrakti JID-on de via voĉ-pet-aprobo"}.
{"Family Name","Lasta Nomo"}.
{"February","Februaro"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Kompletigu la formon por serĉi rekonata Jabber-uzanto (Aldonu * je la fino de la kampo por rekoni subĉenon"}.
{"Friday","Vendredo"}.
{"From ~s","De ~s"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Plena Nomo"}.
{"Get Number of Online Users","Montru nombron de konektataj uzantoj"}.
{"Get Number of Registered Users","Montru nombron de registritaj uzantoj"}.
@@ -108,10 +102,11 @@
{"Group ","Grupo "}.
{"Groups","Grupoj"}.
{"has been banned","estas forbarita"}.
{"has been kicked because of a system shutdown","estas forpelita pro sistem-haltigo"}.
{"has been kicked because of an affiliation change","estas forpelita pro aparteneca ŝanĝo"}.
{"has been kicked because of a system shutdown","estas forpelita pro sistem-haltigo"}.
{"has been kicked because the room has been changed to members-only","estas forpelita ĉar la babilejo fariĝis sole por membroj"}.
{"has been kicked","estas forpelita"}.
{" has set the subject to: "," ŝanĝis la temon al: "}.
{"Host","Gastigo"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Se vi ne vidas la CAPTCHA-imagon jene, vizitu la teksaĵ-paĝon."}.
{"Import Directory","Importu dosierujo"}.
@@ -125,11 +120,10 @@
{"Improper message type","Malĝusta mesaĝo-tipo"}.
{"Incorrect password","Nekorekta pasvorto"}.
{"IP addresses","IP-adresoj"}.
{"IP","IP"}.
{"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"}.
{"It is not allowed to send private messages","Ne estas permesata sendi privatajn mesaĝojn"}.
{"Jabber Account Registration","Ĵabber-konto registrado"}.
{"Jabber ID","Jabber ID"}.
{"January","Januaro"}.
@@ -143,8 +137,6 @@
{"leaves the room","eliras la babilejo"}.
{"List of modules to start","Listo de moduloj por starti"}.
{"List of rooms","Listo de babilejoj"}.
{"Listened Ports at ","Atentataj pordoj je "}.
{"Listened Ports","Atentataj pordoj"}.
{"Low level update script","Bazanivela ĝisdatigo-skripto"}.
{"Make participants list public","Farigu partoprento-liston publika"}.
{"Make room CAPTCHA protected","Farigu babilejon protektata per CAPTCHA"}.
@@ -164,8 +156,6 @@
{"Middle Name","Meza Nomo"}.
{"Moderator privileges required","Moderantaj rajtoj bezonata"}.
{"Modified modules","Ĝisdatigitaj moduloj"}.
{"Module","Modulo"}.
{"Modules at ~p","Moduloj je ~p"}.
{"Modules","Moduloj"}.
{"Monday","Lundo"}.
{"Multicast","Multicast"}.
@@ -174,14 +164,15 @@
{"Name:","Nomo:"}.
{"Never","Neniam"}.
{"New Password:","Nova Pasvorto:"}.
{"Nickname","Kaŝnomo"}.
{"Nickname Registration at ","Kaŝnomo-registrado je "}.
{"Nickname ~s does not exist in the room","Kaŝnomo ~s ne ekzistas en la babilejo"}.
{"Nickname","Kaŝnomo"}.
{"No body provided for announce message","Neniu teksto donita por anonc-mesaĝo"}.
{"No Data","Neniu datumo"}.
{"Node not found","Nodo ne trovita"}.
{"Node ~p","Nodo ~p"}.
{"Nodes","Nodoj"}.
{"No limit","Neniu limigo"}.
{"None","Nenio"}.
{"Not Found","Ne trovita"}.
{"November","Novembro"}.
@@ -192,26 +183,25 @@
{"Offline Messages:","Liverontaj mesaĝoj"}.
{"OK","Bone"}.
{"Old Password:","Malnova Pasvorto:"}.
{"Online","Konektata"}.
{"Online Users:","Konektataj uzantoj:"}.
{"Online Users","Konektataj Uzantoj"}.
{"Online","Konektata"}.
{"Only moderators and participants are allowed to change the subject in this room","Nur moderigantoj kaj partoprenantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
{"Only moderators are allowed to change the subject in this room","Nur moderigantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
{"Only moderators can approve voice requests","Nur moderigantoj povas aprobi voĉ-petojn"}.
{"Only occupants are allowed to send messages to the conference","Nur partoprenantoj rajtas sendi mesaĝojn al la babilejo"}.
{"Only occupants are allowed to send queries to the conference","Nur partoprenantoj rajtas sendi informmendojn al la babilejoj"}.
{"Only service administrators are allowed to send service messages","Nur servo-administrantoj rajtas sendi serv-mesaĝojn"}.
{"Options","Elektebloj"}.
{"Organization Name","Organiz-nomo"}.
{"Organization Unit","Organiz-parto"}.
{"Outgoing s2s Connections","Elirantaj s-al-s-konektoj"}.
{"Outgoing s2s Connections:","Elirantaj s-al-s-konektoj:"}.
{"Owner privileges required","Mastraj rajtoj bezonata"}.
{"Packet","Pakaĵo"}.
{"Password Verification","Pasvortkontrolo"}.
{"Password Verification:","Pasvortkontrolo:"}.
{"Password","Pasvorto"}.
{"Password:","Pasvorto:"}.
{"Password Verification","Pasvortkontrolo"}.
{"Password Verification:","Pasvortkontrolo:"}.
{"Path to Dir","Vojo al dosierujo"}.
{"Path to File","Voje de dosiero"}.
{"Pending","Atendanta"}.
@@ -220,15 +210,12 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Rimarku ke ĉi tiuj elektebloj nur sekurkopias la propran Mnesia-datumbazon. Se vi uzas la ODBC-modulon, vi ankaŭ devas sekurkopii tiujn SQL-datumbazoj aparte."}.
{"Please, wait for a while before sending new voice request","Bonvolu atendi iomete antaŭ ol sendi plian voĉ-peton"}.
{"Pong","Resondaĵo"}.
{"Port","Pordo"}.
{"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"}.
{"Really delete message of the day?","Ĉu vere forigi mesaĝon de la tago?"}.
{"Recipient is not in the conference room","Ricevanto ne ĉeestas en la babilejo "}.
{"Register a Jabber account","Registru Ĵabber-konton"}.
@@ -237,12 +224,12 @@
{"Register","Registru"}.
{"Remote copy","Fora kopio"}.
{"Remove All Offline Messages","Forigu ĉiujn liverontajn mesaĝojn"}.
{"Remove User","Forigu uzanton"}.
{"Remove","Forigu"}.
{"Remove User","Forigu uzanton"}.
{"Replaced by new connection","Anstataŭigita je nova konekto"}.
{"Resources","Risurcoj"}.
{"Restart Service","Restartu Servon"}.
{"Restart","Restartu"}.
{"Restart Service","Restartu Servon"}.
{"Restore Backup from File at ","Restaŭrigu de dosiero el "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaŭrigu duuman sekurkopion post sekvonta ejabberd-restarto"}.
{"Restore binary backup immediately:","Restaŭrigu duuman sekurkopion tuj:"}.
@@ -253,13 +240,11 @@
{"Room description","Babilejo-priskribo"}.
{"Room Occupants","Nombro de ĉeestantoj"}.
{"Room title","Babilejo-nomo"}.
{"Roster","Kontaktlisto"}.
{"Roster of ","Kontaktlisto de "}.
{"Roster size","Kontaktlist-grando"}.
{"Roster","Kontaktlisto"}.
{"RPC Call Error","Eraro de RPC-alvoko"}.
{"Running Nodes","Funkciantaj Nodoj"}.
{"~s access rule configuration","Agordo de atingo-reguloj de ~s"}.
{"~s invites you to the room ~s","~s invitas vin al la babilejo ~s"}.
{"Saturday","Sabato"}.
{"Script check","Skript-kontrolo"}.
{"Search Results for ","Serĉ-rezultoj de "}.
@@ -276,16 +261,16 @@
{"Show Integral Table","Montru integran tabelon"}.
{"Show Ordinary Table","Montru ordinaran tabelon"}.
{"Shut Down Service","Haltigu Servon"}.
{"~s invites you to the room ~s","~s invitas vin al la babilejo ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Kelkaj Ĵabber-klientoj povas memori vian pasvorton je via komputilo. Nur uzu tiun eblon se vi fidas ke via komputilo estas sekura."}.
{"~s's Offline Messages Queue","Mesaĝo-atendovico de ~s"}.
{"Start Modules at ","Startu modulojn je "}.
{"Start Modules","Startu Modulojn"}.
{"Start","Startu"}.
{"Statistics of ~p","Statistikoj de ~p"}.
{"Statistics","Statistikoj"}.
{"Stop","Haltigu"}.
{"Stop Modules at ","Haltigu modulojn je "}.
{"Stop Modules","Haltigu Modulojn"}.
{"Stop","Haltigu"}.
{"Stopped Nodes","Neaktivaj Nodoj"}.
{"Storage Type","Konserv-tipo"}.
{"Store binary backup:","Konservu duuman sekurkopion:"}.
@@ -299,8 +284,8 @@
{"That nickname is registered by another person","Kaŝnomo estas registrita de alia persono"}.
{"The CAPTCHA is valid.","La CAPTCHA ĝustas"}.
{"The CAPTCHA verification has failed","La CAPTCHA-kontrolado malsukcesis"}.
{"The password is too weak","La pasvorto estas ne sufiĉe forta"}.
{"the password is","la pasvorto estas"}.
{"The password is too weak","La pasvorto estas ne sufiĉe forta"}.
{"The password of your Jabber account was successfully changed.","La pasvorto de via Ĵabber-konto estas sukcese ŝanĝata."}.
{"There was an error changing the password: ","Estis eraro dum ŝanĝi de la pasvortro:"}.
{"There was an error creating the account: ","Estis eraro dum kreado de la konto:"}.
@@ -312,10 +297,11 @@
{"Thursday","Ĵaŭdo"}.
{"Time delay","Prokrasto"}.
{"Time","Tempo"}.
{"To ~s","Al ~s"}.
{"To","Ĝis"}.
{"Too many CAPTCHA requests","Tro multaj CAPTCHA-petoj"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Tro da malsukcesaj aŭtentprovoj (~p) de ĉi tiu IP-adreso (~s). La adreso estos malbarata je ~s UTC."}.
{"Too many unacked stanzas","Tro da neagnoskitaj stancoj"}.
{"To ~s","Al ~s"}.
{"Total rooms","Babilejoj"}.
{"Traffic rate limit is exceeded","Trafikrapida limigo superita"}.
{"Transactions Aborted:","Transakcioj nuligitaj"}.
@@ -327,19 +313,19 @@
{"Unauthorized","Nepermesita"}.
{"Unregister a Jabber account","Malregistru Ĵabber-konton"}.
{"Unregister","Malregistru"}.
{"Update","Ĝisdatigu"}.
{"Update message of the day (don't send)","Ŝanĝu mesaĝon de la tago (ne sendu)"}.
{"Update message of the day on all hosts (don't send)","Ŝanĝu mesaĝon de la tago je ĉiu gastigo (ne sendu)"}.
{"Update ~p","Ĝisdatigu ~p-n"}.
{"Update plan","Ĝisdatigo-plano"}.
{"Update script","Ĝisdatigo-skripto"}.
{"Update","Ĝisdatigu"}.
{"Uptime:","Daŭro de funkciado"}.
{"User Management","Uzanto-administrado"}.
{"User ~s","Uzanto ~s"}.
{"Username:","Uzantnomo"}.
{"Users are not allowed to register accounts so quickly","Ne estas permesata al uzantoj registri tiel rapide"}.
{"Users Last Activity","Lasta aktiveco de uzanto"}.
{"Users","Uzantoj"}.
{"User ~s","Uzanto ~s"}.
{"User","Uzanto"}.
{"Validate","Validigu"}.
{"vCard User Search","Serĉado de vizitkartoj"}.
@@ -359,4 +345,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Mesaĝo-atendovico de la senkonekta kontakto estas plena. La mesaĝo estas forĵetita"}.
{"Your Jabber account was successfully created.","Via Ĵabber-konto estis sukcese kreata."}.
{"Your Jabber account was successfully deleted.","Via Ĵabber-konto estas sukcese forigita."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Viaj mesaĝoj al ~s estas blokata. Por malbloki ilin, iru al ~s"}.
+776 -663
View File
File diff suppressed because it is too large Load Diff
+43 -25
View File
@@ -1,12 +1,10 @@
%% -*- coding: latin-1 -*-
%% -*- coding: utf-8 -*-
{" (Add * to the end of field to match substring)","(Añade * al final del campo para buscar subcadenas)"}.
{" has set the subject to: "," ha puesto el asunto: "}.
{"A password is required to enter this room","Se necesita contraseña para entrar en esta sala"}.
{"A password is required to enter this room"," (Añade * al final del campo para buscar subcadenas)"}.
{"Accept","Aceptar"}.
{"Access Configuration","Configuración de accesos"}.
{"Access Control List Configuration","Configuración de la Lista de Control de Acceso"}.
{"Access Control Lists","Listas de Control de Acceso"}.
{"Access denied by service policy","Acceso denegado por la política del servicio"}.
{"Access Rules","Reglas de Acceso"}.
{"Account doesn't exist","La cuenta no existe"}.
{"Action on user","Acción en el usuario"}.
{"Add Jabber ID","Añadir Jabber ID"}.
{"Add New","Añadir nuevo"}.
@@ -75,9 +73,11 @@
{"Database","Base de datos"}.
{"December","diciembre"}.
{"Default users as participants","Los usuarios son participantes por defecto"}.
{"Delete content","Borrar contenido"}.
{"Delete message of the day on all hosts","Borrar el mensaje del día en todos los dominios"}.
{"Delete message of the day","Borrar mensaje del dia"}.
{"Delete Selected","Eliminar los seleccionados"}.
{"Delete Selected","Borrar los seleccionados"}.
{"Delete table","Borrar tabla"}.
{"Delete User","Borrar usuario"}.
{"Description:","Descripción:"}.
{"Disc only copy","Copia en disco solamente"}.
@@ -123,13 +123,14 @@
{"Family Name","Apellido"}.
{"February","febrero"}.
{"File larger than ~w bytes","El fichero es más grande que ~w bytes"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Rellena el formulario para buscar usuarios Jabber. Añade * al final de un campo para buscar subcadenas."}.
{"Fill in the form to search for any matching Jabber User","Rellena campos para buscar usuarios Jabber que concuerden"}.
{"Friday","viernes"}.
{"From ~s","De ~s"}.
{"From","De"}.
{"Full Name","Nombre completo"}.
{"Get Number of Online Users","Ver número de usuarios conectados"}.
{"Get Number of Registered Users","Ver número de usuarios registrados"}.
{"Get Pending","Obtener pendientes"}.
{"Get User Last Login Time","Ver fecha de la última conexión de usuario"}.
{"Get User Password","Ver contraseña de usuario"}.
{"Get User Statistics","Ver estadísticas de usuario"}.
@@ -164,11 +165,12 @@
{"Incorrect value of 'action' in data form","Valor incorrecto de 'action' en el formulario de datos"}.
{"Incorrect value of 'path' in data form","Valor incorrecto de 'path' en el formulario de datos"}.
{"Insufficient privilege","Privilegio insuficiente"}.
{"Internal server error","Error interno en el servidor"}.
{"Invalid 'from' attribute in forwarded message","Atributo 'from' no válido en el mensaje reenviado"}.
{"Invalid node name","Nombre de nodo no válido"}.
{"Invalid 'previd' value","Valor de 'previd' no válido"}.
{"Invitations are not allowed in this conference","Las invitaciones no están permitidas en esta sala"}.
{"IP addresses","Direcciones IP"}.
{"IP","IP"}.
{"is now known as","se cambia el nombre a"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","No está permitido enviar mensajes de error a la sala. Este participante (~s) ha enviado un mensaje de error (~s) y fue expulsado de la sala"}.
{"It is not allowed to send private messages of type \"groupchat\"","No está permitido enviar mensajes privados del tipo \"groupchat\""}.
@@ -187,8 +189,6 @@
{"leaves the room","sale de la sala"}.
{"List of modules to start","Lista de módulos a iniciar"}.
{"List of rooms","Lista de salas"}.
{"Listened Ports at ","Puertos de escucha en "}.
{"Listened Ports","Puertos de escucha"}.
{"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"}.
@@ -198,6 +198,7 @@
{"Make room persistent","Sala permanente"}.
{"Make room public searchable","Sala públicamente visible"}.
{"Malformed username","Nombre de usuario mal formado"}.
{"MAM preference modification denied by service policy","Se ha denegado modificar la preferencia MAM por política del servicio"}.
{"March","marzo"}.
{"Maximum Number of Occupants","Número máximo de ocupantes"}.
{"May","mayo"}.
@@ -212,8 +213,6 @@
{"Moderator privileges required","Se necesita privilegios de moderador"}.
{"Modified modules","Módulos modificados"}.
{"Module failed to handle the query","El módulo falló al gestionar la petición"}.
{"Module","Módulo"}.
{"Modules at ~p","Módulos en ~p"}.
{"Modules","Módulos"}.
{"Monday","lunes"}.
{"Multicast","Multicast"}.
@@ -225,11 +224,12 @@
{"Neither 'role' nor 'affiliation' attribute found","No se encontraron los atributos 'role' ni 'affiliation'"}.
{"Never","Nunca"}.
{"New Password:","Nueva contraseña:"}.
{"Nickname can't be empty","El apodo no puede estar vacío"}.
{"Nickname Registration at ","Registro del apodo en "}.
{"Nickname ~s does not exist in the room","El apodo ~s no existe en la sala"}.
{"Nickname","Apodo"}.
{"No 'access' found in data form","No se encontró 'access' en el formulario de datos"}.
{"No 'acls' found in data form","No se encontró 'acls' en el formulario de datos"}.
{"No address elements found","No se encontraron elementos de dirección ('address')"}.
{"No addresses element found","No se encontró elemento de direcciones ('addresses')"}.
{"No 'affiliation' attribute found","No se encontró el atributo 'affiliation'"}.
{"No available resource found","No se encontró un recurso conectado"}.
{"No body provided for announce message","No se ha proporcionado cuerpo de mensaje para el anuncio"}.
@@ -242,6 +242,7 @@
{"No info about last activity found","No hay información respeto a la última actividad"}.
{"No 'item' element found","No se encontró el elemento 'item'"}.
{"No items found in this query","No se han encontrado elementos en esta petición"}.
{"No limit","Sin límite"}.
{"No module is handling this query","Ningún modulo está gestionando esta petición"}.
{"No 'modules' found in data form","No se encontró 'modules' en el formulario de datos"}.
{"No node specified","No se ha especificado ningún nodo"}.
@@ -262,6 +263,7 @@
{"Nodeprep has failed","Ha fallado el procesado del nombre de nodo (nodeprep)"}.
{"Nodes","Nodos"}.
{"None","Ninguno"}.
{"Not allowed","No permitido"}.
{"Not Found","No encontrado"}.
{"Not subscribed","No suscrito"}.
{"November","noviembre"}.
@@ -284,12 +286,12 @@
{"Only occupants are allowed to send messages to the conference","Solo los ocupantes pueden enviar mensajes a la sala"}.
{"Only occupants are allowed to send queries to the conference","Solo los ocupantes pueden enviar solicitudes a la sala"}.
{"Only service administrators are allowed to send service messages","Solo los administradores del servicio tienen permiso para enviar mensajes de servicio"}.
{"Options","Opciones"}.
{"Organization Name","Nombre de la organización"}.
{"Organization Unit","Unidad de la organización"}.
{"Outgoing s2s Connections","Conexiones S2S salientes"}.
{"Outgoing s2s Connections:","Conexiones S2S salientes:"}.
{"Owner privileges required","Se requieren privilegios de propietario de la sala"}.
{"Packet relay is denied by service policy","Se ha denegado el reenvío del paquete por política del servicio"}.
{"Packet","Paquete"}.
{"Parse failed","El procesado falló"}.
{"Password Verification","Verificación de la contraseña"}.
@@ -305,11 +307,13 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ten en cuenta que estas opciones solo harán copia de seguridad de la base de datos Mnesia embebida. Si estás usando ODBC tendrás que hacer también copia de seguridad de tu base de datos SQL."}.
{"Please, wait for a while before sending new voice request","Por favor, espera un poco antes de enviar otra petición de voz"}.
{"Pong","Pong"}.
{"Port","Puerto"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Poseer el atributo 'ask' no está permitido por RFC6121"}.
{"Previous session not found","La sesión previa no ha sido encontrada"}.
{"Previous session PID has been killed","El proceso de la sesión previa ha sido cerrado"}.
{"Previous session PID has exited","El proceso de la sesión previa ha terminado"}.
{"Previous session PID is dead","El proceso de la sesión previa está muerto"}.
{"Previous session timed out","La sesión previa ha caducado"}.
{"private, ","privado"}.
{"Protocol","Protocolo"}.
{"Publishing items to collection node is not allowed","Publicar elementos en un nodo de colección no está permitido"}.
{"Publish-Subscribe","Servicio de Publicar-Subscribir"}.
{"PubSub subscriber request","Petición de subscriptor de PubSub"}.
{"Push record not found","No se encontró registro Push"}.
@@ -317,7 +321,6 @@
{"Query to another users is forbidden","Enviar solicitudes a otros usuarios está prohibido"}.
{"RAM and disc copy","Copia en RAM y disco"}.
{"RAM copy","Copia en RAM"}.
{"Raw","Crudo"}.
{"Really delete message of the day?","¿Está seguro de quere borrar el mensaje del dia?"}.
{"Recipient is not in the conference room","El receptor no está en la sala de conferencia"}.
{"Register a Jabber account","Registrar una cuenta Jabber"}.
@@ -342,6 +345,7 @@
{"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 terminates","Cerrando la sala"}.
{"Room title","Título de la sala"}.
{"Roster module has failed","El módulo Roster ha fallado"}.
{"Roster of ","Lista de contactos de "}.
@@ -349,20 +353,20 @@
{"Roster","Lista de contactos"}.
{"RPC Call Error","Error en la llamada RPC"}.
{"Running Nodes","Nodos funcionando"}.
{"~s access rule configuration","Configuración de las Regla de Acceso ~s"}.
{"~s invites you to the room ~s","~s te invita a la sala ~s"}.
{"Saturday","sábado"}.
{"Scan failed","El escaneo ha fallado"}.
{"Script check","Comprobación de script"}.
{"Search Results for ","Buscar resultados por "}.
{"Search users in ","Buscar usuarios en "}.
{"Select All","Seleccionar todo"}.
{"Send announcement to all online users on all hosts","Enviar anuncio a todos los usuarios conectados en todos los dominios"}.
{"Send announcement to all online users","Enviar anuncio a todos los usuarios conectados"}.
{"Send announcement to all users on all hosts","Enviar anuncio a todos los usuarios en todos los dominios"}.
{"Send announcement to all users","Enviar anuncio a todos los usuarios"}.
{"September","septiembre"}.
{"Server connections to local subdomains are forbidden","Conexiones de servidor a subdominios locales están prohibidas"}.
{"Server:","Servidor:"}.
{"Session state copying timed out","El copiado del estado de la sesión ha caducado"}.
{"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"}.
@@ -374,7 +378,6 @@
{"~s's Offline Messages Queue","Cola de mensajes diferidos de ~s"}.
{"Start Modules at ","Iniciar módulos en "}.
{"Start Modules","Iniciar módulos"}.
{"Start","Iniciar"}.
{"Statistics of ~p","Estadísticas de ~p"}.
{"Statistics","Estadísticas"}.
{"Stop Modules at ","Detener módulos en "}.
@@ -394,16 +397,22 @@
{"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 account already exists","La cuenta ya existe"}.
{"The account was not deleted","La cuenta no fue eliminada"}.
{"The CAPTCHA is valid.","El CAPTCHA es válido."}.
{"The CAPTCHA verification has failed","La verificación de CAPTCHA ha fallado"}.
{"The captcha you entered is wrong","El CAPTCHA que has introducido es erróneo"}.
{"The feature requested is not supported by the conference","La característica solicitada no está soportada por la sala de conferencia"}.
{"The password contains unacceptable characters","La contraseña contiene caracteres inaceptables"}.
{"The password is too weak","La contraseña es demasiado débil"}.
{"the password is","la contraseña es"}.
{"The password of your Jabber account was successfully changed.","La contraseña de tu cuenta Jabber se ha cambiado correctamente."}.
{"The password was not changed","La contraseña no fue cambiada"}.
{"The passwords are different","Las contraseñas son diferentes"}.
{"The query is only allowed from local users","La solicitud está permitida solo para usuarios locales"}.
{"The query must not contain <item/> elements","La solicitud no debe contener elementos <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquete DEBE contener solo un elemento <active/>, un elemento <default/>, o un elemento <list/>"}.
{"The username is not valid","El nombre de usuario no es válido"}.
{"There was an error changing the password: ","Hubo un error cambiando la contraseña."}.
{"There was an error creating the account: ","Hubo uno error al crear la cuenta:"}.
{"There was an error deleting the account: ","Hubo un error borrando la cuenta."}.
@@ -411,6 +420,7 @@
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Esta página te permite crear una cuenta Jabber este servidor Jabber. Tu JID (Jabber IDentificador) será de la forma: nombredeusuario@servidor. Por favor lee detenidamente las instrucciones para rellenar correctamente los campos."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Esta página te permite borrar tu cuenta Jabber en este servidor Jabber."}.
{"This room is not anonymous","Sala no anónima"}.
{"This service can not process the address: ~s","Este servicio no puede procesar la dirección: ~s"}.
{"Thursday","jueves"}.
{"Time delay","Retraso temporal"}.
{"Timed out waiting for stream resumption","Ha pasado demasiado tiempo esperando que la conexión se restablezca"}.
@@ -423,6 +433,8 @@
{"Too many child elements","Demasiados subelementos"}.
{"Too many <item/> elements","Demasiados elementos <item/>"}.
{"Too many <list/> elements","Demasiados elementos <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Demasiadas (~p) autenticaciones fallidas de esta dirección IP (~s). La dirección será desbloqueada en ~s UTC"}.
{"Too many receiver fields were specified","Se han especificado demasiados campos de destinatario"}.
{"Too many unacked stanzas","Demasiados mensajes sin haber reconocido recibirlos"}.
{"Too many users in this conference","Demasiados usuarios en esta sala"}.
{"To","Para"}.
@@ -437,8 +449,10 @@
{"Unable to register route on existing local domain","No se ha podido registrar la ruta en este dominio local existente"}.
{"Unauthorized","No autorizado"}.
{"Unexpected action","Acción inesperada"}.
{"Unexpected error condition: ~p","Condición de error inesperada: ~p"}.
{"Unregister a Jabber account","Borrar una cuenta Jabber"}.
{"Unregister","Borrar"}.
{"Unselect All","Deseleccionar todo"}.
{"Unsupported <index/> element","Elemento <index/> no soportado"}.
{"Unsupported version","Versión no soportada"}.
{"Update message of the day (don't send)","Actualizar mensaje del dia, pero no enviarlo"}.
@@ -451,7 +465,7 @@
{"User already exists","El usuario ya existe"}.
{"User (jid)","Usuario (jid)"}.
{"User Management","Administración de usuarios"}.
{"User part of JID in 'from' is empty","La parte de usuario del JID en 'from' está vacía"}.
{"User removed","Usuario eliminado"}.
{"User session not found","Sesión de usuario no encontrada"}.
{"User session terminated","Sesión de usuario terminada"}.
{"User ~s","Usuario ~s"}.
@@ -467,12 +481,16 @@
{"Value of '~s' should be integer","El valor de '~s' debería ser un entero"}.
{"Value 'set' of 'type' attribute is not allowed","El valor 'set' del atributo 'type' no está permitido"}.
{"vCard User Search","Buscar vCard de usuario"}.
{"Virtual Hosting","Dominios Virtuales"}.
{"Virtual Hosts","Dominios Virtuales"}.
{"Visitors are not allowed to change their nicknames in this room","Los visitantes no tienen permitido cambiar sus apodos en esta sala"}.
{"Visitors are not allowed to send messages to all occupants","Los visitantes no pueden enviar mensajes a todos los ocupantes"}.
{"Voice request","Petición de voz"}.
{"Voice requests are disabled in this conference","Las peticiones de voz están desactivadas en esta sala"}.
{"Wednesday","miércoles"}.
{"Wrong parameters in the web formulary","Parámetros incorrectos en el formulario web"}.
{"Wrong xmlns","xmlns incorrecto"}.
{"You are being removed from the room because of a system shutdown","Estás siendo expulsado de la sala porque el sistema se va a detener"}.
{"You are not joined to the channel","No has entrado en el canal"}.
{"You can later change your password using a Jabber client.","Puedes cambiar tu contraseña después, usando un cliente Jabber."}.
{"You have been banned from this room","Has sido bloqueado en esta sala"}.
@@ -485,5 +503,5 @@
{"Your contact offline message queue is full. The message has been discarded.","Tu cola de mensajes diferidos de contactos está llena. El mensaje se ha descartado."}.
{"Your Jabber account was successfully created.","Tu cuenta Jabber se ha creado correctamente."}.
{"Your Jabber account was successfully deleted.","Tu cuenta Jabber se ha borrado correctamente."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Tus mensajes a ~s están siendo bloqueados. Para desbloquearlos, visita ~s"}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Tu petición de suscripción y/o mensajes a ~s están siendo bloqueados. Para desbloquearlos, visita ~s"}.
{"You're not allowed to create nodes","No tienes permitido crear nodos"}.
+770 -673
View File
File diff suppressed because it is too large Load Diff
+45 -64
View File
@@ -1,21 +1,14 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," a changé le sujet: "}.
{"A password is required to enter this room","Un mot de passe est nécessaire pour accéder à ce salon"}.
%% -*- coding: utf-8 -*-
{"Accept","Accepter"}.
{"Access Configuration","Configuration d'accès"}.
{"Access Control List Configuration","Configuration des droits (ACL)"}.
{"Access Control Lists","Droits (ACL)"}.
{"Access denied by service policy","L'accès au service est refusé"}.
{"Access Rules","Règles d'accès"}.
{"Action on user","Action sur l'utilisateur"}.
{"Add Jabber ID","Ajouter un Jabber ID"}.
{"Add New","Ajouter"}.
{"Add User","Ajouter un utilisateur"}.
{"Administration of ","Administration de "}.
{"Administration","Administration"}.
{"Administration of ","Administration de "}.
{"Administrator privileges required","Les droits d'administrateur sont nécessaires"}.
{"All activity","Toute activité"}.
{"All Users","Tous les utilisateurs"}.
{"Allow users to change the subject","Autoriser les utilisateurs à changer le sujet"}.
{"Allow users to query other users","Autoriser les utilisateurs à envoyer des requêtes aux autres utilisateurs"}.
{"Allow users to send invites","Autoriser les utilisateurs à envoyer des invitations"}.
@@ -23,14 +16,16 @@
{"Allow visitors to change nickname","Autoriser les visiteurs à changer de pseudo"}.
{"Allow visitors to send private messages to","Autoriser les visiteurs à envoyer des messages privés"}.
{"Allow visitors to send status text in presence updates","Autoriser les visiteurs à envoyer un message d'état avec leur présence"}.
{"All Users","Tous les utilisateurs"}.
{"Announcements","Annonces"}.
{"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"}.
{"Automatic node creation is not enabled","La creation implicite de nœud n'est pas disponible"}.
{"Backup Management","Gestion des sauvegardes"}.
{"Backup of ~p","Sauvegarde de ~p"}.
{"Backup to File at ","Sauvegarde fichier sur "}.
{"Backup","Sauvegarde"}.
{"Backup to File at ","Sauvegarde fichier sur "}.
{"Bad format","Mauvais format"}.
{"Birthday","Date d'anniversaire"}.
{"Both the username and the resource are required","Le nom d'utilisateur et sa ressource sont nécessaires"}.
@@ -56,15 +51,15 @@
{"City","Ville"}.
{"Commands","Commandes"}.
{"Conference room does not exist","Le salon de discussion n'existe pas"}.
{"Configuration of room ~s","Configuration pour le salon ~s"}.
{"Configuration","Configuration"}.
{"Configuration of room ~s","Configuration pour le salon ~s"}.
{"Connected Resources:","Ressources connectées:"}.
{"Country","Pays"}.
{"CPU Time:","Temps CPU:"}.
{"Database","Base de données"}.
{"Database failure","Echec sur la base de données"}.
{"Database Tables at ~p","Tables de base de données sur ~p"}.
{"Database Tables Configuration at ","Configuration des tables de base de données sur "}.
{"Database","Base de données"}.
{"December","Décembre"}.
{"Default users as participants","Les utilisateurs sont participant par défaut"}.
{"Delete message of the day on all hosts","Supprimer le message du jour sur tous les domaines"}.
@@ -114,10 +109,9 @@
{"Family Name","Nom de famille"}.
{"February","Février"}.
{"File larger than ~w bytes","Taille de fichier suppérieur à ~w octets"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Remplissez le formulaire pour recherche un utilisateur Jabber (Ajouter * à la fin du champ pour chercher n'importe quelle fin de chaîne"}.
{"Friday","Vendredi"}.
{"From ~s","De ~s"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nom complet"}.
{"Get Number of Online Users","Récupérer le nombre d'utilisateurs en ligne"}.
{"Get Number of Registered Users","Récupérer le nombre d'utilisateurs enregistrés"}.
@@ -128,12 +122,13 @@
{"Group ","Groupe "}.
{"Groups","Groupes"}.
{"has been banned","a été banni"}.
{"has been kicked because of a system shutdown","a été éjecté en raison de l'arrêt du système"}.
{"has been kicked because of an affiliation change","a été éjecté à cause d'un changement d'autorisation"}.
{"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 been kicked","a été expulsé"}.
{"Host unknown","Serveur inconnu"}.
{"has been kicked because of an affiliation change","a été éjecté à cause d'un changement d'autorisation"}.
{"has been kicked because of a system shutdown","a été éjecté en raison de l'arrêt du système"}.
{"has been kicked because the room has been changed to members-only","a été éjecté car la salle est désormais réservée aux membres"}.
{" has set the subject to: "," a changé le sujet: "}.
{"Host","Serveur"}.
{"Host unknown","Serveur inconnu"}.
{"If you don't see the CAPTCHA image here, visit the web page.","SI vous ne voyez pas l'image CAPTCHA ici, visitez la page web."}.
{"Import Directory","Importer un répertoire"}.
{"Import File","Importer un fichier"}.
@@ -156,12 +151,11 @@
{"Invalid 'from' attribute in forwarded message","L'attribut 'from' du message transféré est incorrect"}.
{"Invitations are not allowed in this conference","Les invitations ne sont pas autorisées dans ce salon"}.
{"IP addresses","Adresses IP"}.
{"IP","IP"}.
{"is now known as","est maintenant connu comme"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","L'envoyer de messages d'erreur au salon n'est pas autorisé. Le participant (~s) à envoyé un message d'erreur (~s) et à été expulsé du salon"}.
{"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\" au salon"}.
{"It is not allowed to send private messages","L'envoi de messages privés n'est pas autorisé"}.
{"Jabber Account Registration","Enregistrement du Compte Jabber"}.
{"Jabber ID","Jabber ID"}.
{"January","Janvier"}.
@@ -175,8 +169,6 @@
{"leaves the room","quitte le salon"}.
{"List of modules to start","Liste des modules à démarrer"}.
{"List of rooms","Liste des salons"}.
{"Listened Ports at ","Ports ouverts sur "}.
{"Listened Ports","Ports ouverts"}.
{"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"}.
@@ -199,8 +191,6 @@
{"Moderator privileges required","Les droits de modérateur sont nécessaires"}.
{"Modified modules","Modules mis à jour"}.
{"Module failed to handle the query","Echec de traitement de la demande"}.
{"Module","Module"}.
{"Modules at ~p","Modules sur ~p"}.
{"Modules","Modules"}.
{"Monday","Lundi"}.
{"Multicast","Multidiffusion"}.
@@ -212,23 +202,29 @@
{"Neither 'role' nor 'affiliation' attribute found","Attribut 'role' ou 'affiliation' absent"}.
{"Never","Jamais"}.
{"New Password:","Nouveau mot de passe:"}.
{"Nickname","Pseudo"}.
{"Nickname Registration at ","Enregistrement d'un pseudo sur "}.
{"Nickname ~s does not exist in the room","Le pseudo ~s n'existe pas dans ce salon"}.
{"Nickname","Pseudo"}.
{"No 'access' found in data form","Entrée 'access' absente du formulaire"}.
{"No 'acls' found in data form","Entrée 'acls' absente du formulaire"}.
{"No 'affiliation' attribute found","Attribut 'affiliation' absent"}.
{"No available resource found","Aucune ressource disponible"}.
{"No body provided for announce message","Pas de corps de message pour l'annonce"}.
{"No data form found","Formulaire non trouvé"}.
{"No Data","Aucune information disponible"}.
{"No data form found","Formulaire non trouvé"}.
{"Node already exists","Ce nœud existe déjà"}.
{"Node index not found","Index de nœud non trouvé"}.
{"Node not found","Nœud non trouvé"}.
{"Node ~p","Nœud ~p"}.
{"Nodeprep has failed","Echec de formattage"}.
{"Nodes","Nœuds"}.
{"No features available","Aucune fonctionalité disponible"}.
{"No hook has processed this command","Aucun gestionnaire n'a pris en charge cette commande"}.
{"No info about last activity found","Aucune activité précédente trouvée"}.
{"No 'item' element found","Aucun élément 'item' trouvé"}.
{"No items found in this query","Aucun item trouvé dans cette requête"}.
{"No limit","Pas de limite"}.
{"No module is handling this query","Aucun module ne supporte cette requête"}.
{"No 'modules' found in data form","Entrée 'modules' absente du formulaire"}.
{"None","Aucun"}.
{"No node specified","Nœud non spécifié"}.
{"No 'password' found in data form","Entrée 'password' absente du formulaire"}.
{"No 'password' found in this query","L'élément 'password' est absent de la requête"}.
@@ -239,15 +235,8 @@
{"No running node found","Nœud non trouvé"}.
{"No services available","Aucun service disponible"}.
{"No statistics found for this item","Pas de statistiques"}.
{"No 'to' attribute found in the invitation","L'élément 'to' est absent de l'invitation"}.
{"Node already exists","Ce nœud existe déjà"}.
{"Node index not found","Index de nœud non trouvé"}.
{"Node not found","Nœud non trouvé"}.
{"Node ~p","Nœud ~p"}.
{"Nodeprep has failed","Echec de formattage"}.
{"Nodes","Nœuds"}.
{"None","Aucun"}.
{"Not Found","Nœud non trouvé"}.
{"No 'to' attribute found in the invitation","L'élément 'to' est absent de l'invitation"}.
{"Not subscribed","Pas abonné"}.
{"November","Novembre"}.
{"Number of online users","Nombre d'utilisateurs en ligne"}.
@@ -257,9 +246,9 @@
{"Offline Messages:","Messages en attente:"}.
{"OK","OK"}.
{"Old Password:","Ancien mot de passe:"}.
{"Online","En ligne"}.
{"Online Users:","Utilisateurs connectés:"}.
{"Online Users","Utilisateurs en ligne"}.
{"Online","En ligne"}.
{"Only <enable/> or <disable/> tags are allowed","Seul le tag <enable/> ou <disable/> est autorisé"}.
{"Only <list/> element is allowed in this query","Seul l'élément <list/> est autorisé dans cette requête"}.
{"Only members may query archives of this room","Seuls les membres peuvent accéder aux archives de ce salon"}.
@@ -269,7 +258,6 @@
{"Only occupants are allowed to send messages to the conference","Seuls les occupants peuvent envoyer des messages à la conférence"}.
{"Only occupants are allowed to send queries to the conference","Seuls les occupants sont autorisés à envoyer des requêtes à la conférence"}.
{"Only service administrators are allowed to send service messages","Seuls les administrateurs du service sont autoriser à envoyer des messages de service"}.
{"Options","Options"}.
{"Organization Name","Nom de l'organisation"}.
{"Organization Unit","Unité de l'organisation"}.
{"Outgoing s2s Connections","Connexions s2s sortantes"}.
@@ -277,31 +265,27 @@
{"Owner privileges required","Les droits de propriétaire sont nécessaires"}.
{"Packet","Paquet"}.
{"Parse failed","Echec d'interprétation"}.
{"Password Verification","Vérification du mot de passe"}.
{"Password Verification:","Vérification du mot de passe:"}.
{"Password","Mot de passe"}.
{"Password:","Mot de passe:"}.
{"Password Verification","Vérification du mot de passe"}.
{"Password Verification:","Vérification du mot de passe:"}.
{"Path to Dir","Chemin vers le répertoire"}.
{"Path to File","Chemin vers le fichier"}.
{"Pending","En suspens"}.
{"Period: ","Période: "}.
{"Ping query is incorrect","Requête ping incorrecte"}.
{"Ping","Ping"}.
{"Ping query is incorrect","Requête ping incorrecte"}.
{"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."}.
{"Please, wait for a while before sending new voice request","Attendez un moment avant de re-lancer une requête de voix"}.
{"Pong","Pong"}.
{"Port","Port"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Le traitement de l'attribut 'ack' n'est pas autorisé (rfc6121)"}.
{"private, ","privé"}.
{"Protocol","Protocole"}.
{"Publishing items to collection node is not allowed","La publication sur un nœud de type collection n'est pas autorisé"}.
{"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"}.
{"Query to another users is forbidden","Requête vers un autre utilisateur interdite"}.
{"RAM and disc copy","Copie en mémoire vive (RAM) et sur disque"}.
{"RAM copy","Copie en mémoire vive (RAM)"}.
{"Raw","Brut"}.
{"Really delete message of the day?","Confirmer la suppression du message du jour ?"}.
{"Recipient is not in the conference room","Le destinataire n'est pas dans la conférence"}.
{"Register a Jabber account","Enregistrer un compte Jabber"}.
@@ -310,12 +294,12 @@
{"Register","Enregistrer"}.
{"Remote copy","Copie distante"}.
{"Remove All Offline Messages","Effacer tous les messages hors ligne"}.
{"Remove User","Supprimer l'utilisateur"}.
{"Remove","Supprimer"}.
{"Remove User","Supprimer l'utilisateur"}.
{"Replaced by new connection","Remplacé par une nouvelle connexion"}.
{"Resources","Ressources"}.
{"Restart Service","Redémarrer le service"}.
{"Restart","Redémarrer"}.
{"Restart Service","Redémarrer le service"}.
{"Restore Backup from File at ","Restaurer la sauvegarde depuis le fichier sur "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restauration de la sauvegarde binaire après redémarrage (nécessite moins de mémoire):"}.
{"Restore binary backup immediately:","Restauration immédiate d'une sauvegarde binaire:"}.
@@ -326,23 +310,21 @@
{"Room description","Description du salon"}.
{"Room Occupants","Occupants du salon"}.
{"Room title","Titre du salon"}.
{"Roster","Liste de contacts"}.
{"Roster module has failed","Echec du module roster"}.
{"Roster of ","Liste de contact de "}.
{"Roster size","Taille de la liste de contacts"}.
{"Roster","Liste de contacts"}.
{"RPC Call Error","Erreur d'appel RPC"}.
{"Running Nodes","Noeuds actifs"}.
{"~s access rule configuration","Configuration des règles d'accès ~s"}.
{"~s invites you to the room ~s","~s vous a invité dans la salle de discussion ~s"}.
{"Saturday","Samedi"}.
{"Scan failed","Echec d'interprétation"}.
{"Script check","Validation du script"}.
{"Search Results for ","Résultats de recherche pour "}.
{"Search users in ","Rechercher des utilisateurs "}.
{"Send announcement to all online users on all hosts","Envoyer l'annonce à tous les utilisateurs en ligne sur tous les serveurs"}.
{"Send announcement to all online users","Envoyer l'annonce à tous les utilisateurs en ligne"}.
{"Send announcement to all users on all hosts","Envoyer une annonce à tous les utilisateurs de tous les domaines"}.
{"Send announcement to all online users on all hosts","Envoyer l'annonce à tous les utilisateurs en ligne sur tous les serveurs"}.
{"Send announcement to all users","Envoyer l'annonce à tous les utilisateurs"}.
{"Send announcement to all users on all hosts","Envoyer une annonce à tous les utilisateurs de tous les domaines"}.
{"September","Septembre"}.
{"Server connections to local subdomains are forbidden","La connection aux sous-domaines locaux est interdite"}.
{"Server:","Serveur:"}.
@@ -352,16 +334,16 @@
{"Show Integral Table","Montrer la table intégralement"}.
{"Show Ordinary Table","Montrer la table ordinaire"}.
{"Shut Down Service","Arrêter le service"}.
{"~s invites you to the room ~s","~s vous a invité dans la salle de discussion ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Certains clients Jabber peuvent stocker votre mot de passe sur votre ordinateur. N'utilisez cette fonctionnalité que si vous avez confiance en la sécurité de votre ordinateur."}.
{"~s's Offline Messages Queue","~s messages en file d'attente"}.
{"Start Modules at ","Démarrer les modules sur "}.
{"Start Modules","Modules de démarrage"}.
{"Start","Démarrer"}.
{"Statistics of ~p","Statistiques de ~p"}.
{"Statistics","Statistiques"}.
{"Stop","Arrêter"}.
{"Stop Modules at ","Arrêter les modules sur "}.
{"Stop Modules","Modules d'arrêt"}.
{"Stop","Arrêter"}.
{"Stopped Nodes","Nœuds arrêtés"}.
{"Storage Type","Type de stockage"}.
{"Store binary backup:","Sauvegarde binaire:"}.
@@ -378,8 +360,8 @@
{"The CAPTCHA verification has failed","La vérification du CAPTCHA a échoué"}.
{"The feature requested is not supported by the conference","La demande de fonctionalité n'est pas supportée par la conférence"}.
{"The password contains unacceptable characters","Le mot de passe contient des caractères non-acceptables"}.
{"The password is too weak","Le mot de passe est trop faible"}.
{"the password is","le mot de passe est"}.
{"The password is too weak","Le mot de passe est trop faible"}.
{"The password of your Jabber account was successfully changed.","Le mot de passe de votre compte Jabber a été changé avec succès."}.
{"The query is only allowed from local users","La requête n'est autorisé qu'aux utilisateurs locaux"}.
{"The query must not contain <item/> elements","La requête ne doit pas contenir d'élément <item/>"}.
@@ -393,16 +375,17 @@
{"Thursday","Jeudi"}.
{"Time delay","Délais"}.
{"Time","Heure"}.
{"To register, visit ~s","Pour vous enregistrer, visitez ~s"}.
{"To ~s","A ~s"}.
{"To","A"}.
{"Token TTL","Jeton TTL"}.
{"Too many active bytestreams","Trop de flux SOCKS5 actifs"}.
{"Too many CAPTCHA requests","Trop de requêtes CAPTCHA"}.
{"Too many <item/> elements","Trop d'éléments <item/>"}.
{"Too many <list/> elements","Trop d'éléments <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Trop (~p) d'authentification ont échoué pour cette adresse IP (~s). L'adresse sera débloquée à ~s UTC"}.
{"Too many unacked stanzas","Trop de stanzas sans accusé de réception (ack)"}.
{"Too many users in this conference","Trop d'utilisateurs dans cette conférence"}.
{"To register, visit ~s","Pour vous enregistrer, visitez ~s"}.
{"To ~s","A ~s"}.
{"Total rooms","Nombre de salons"}.
{"Traffic rate limit is exceeded","La limite de trafic a été dépassée"}.
{"Transactions Aborted:","Transactions annulées:"}.
@@ -419,21 +402,20 @@
{"Unsupported <index/> element","Elément <index/> non supporté"}.
{"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 plan","Plan de mise à jour"}.
{"Update ~p","Mise à jour de ~p"}.
{"Update script","Script de mise à jour"}.
{"Update","Mettre à jour"}.
{"Uptime:","Temps depuis le démarrage :"}.
{"User already exists","L'utilisateur existe déjà"}.
{"User (jid)","Utilisateur (jid)"}.
{"User Management","Gestion des utilisateurs"}.
{"User part of JID in 'from' is empty","L'utilisateur n'est pas spécifié dans le JID de l'attribut 'from'"}.
{"User session not found","Session utilisateur non trouvée"}.
{"User session terminated","Session utilisateur terminée"}.
{"User ~s","Utilisateur ~s"}.
{"Username:","Nom d'utilisateur:"}.
{"Users are not allowed to register accounts so quickly","Les utilisateurs ne sont pas autorisés à enregistrer des comptes si rapidement"}.
{"User session not found","Session utilisateur non trouvée"}.
{"User session terminated","Session utilisateur terminée"}.
{"Users Last Activity","Dernière activité des utilisateurs"}.
{"User ~s","Utilisateur ~s"}.
{"Users","Utilisateurs"}.
{"User","Utilisateur"}.
{"Validate","Valider"}.
@@ -458,7 +440,6 @@
{"You need an x:data capable client to search","Vous avez besoin d'un client supportant x:data pour faire une recherche"}.
{"Your active privacy list has denied the routing of this stanza.","Votre règle de flitrage active a empêché le routage de ce stanza."}.
{"Your contact offline message queue is full. The message has been discarded.","La file d'attente de message de votre contact est pleine. Votre message a été détruit."}.
{"You're not allowed to create nodes","Vous n'êtes pas autorisé à créer des nœuds"}.
{"Your Jabber account was successfully created.","Votre compte Jabber a été créé avec succès."}.
{"Your Jabber account was successfully deleted.","Votre compte Jabber a été effacé avec succès."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"}.
{"You're not allowed to create nodes","Vous n'êtes pas autorisé à créer des nœuds"}.
+791 -664
View File
File diff suppressed because it is too large Load Diff
+46 -65
View File
@@ -1,21 +1,14 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," puxo o asunto: "}.
{"A password is required to enter this room","Necesítase contrasinal para entrar nesta sala"}.
%% -*- coding: utf-8 -*-
{"Accept","Aceptar"}.
{"Access Configuration","Configuración de accesos"}.
{"Access Control List Configuration","Configuración da Lista de Control de Acceso"}.
{"Access Control Lists","Listas de Control de Acceso"}.
{"Access denied by service policy","Acceso denegado pola política do servizo"}.
{"Access Rules","Regras de Acceso"}.
{"Action on user","Acción no usuario"}.
{"Add Jabber ID","Engadir ID Jabber"}.
{"Add New","Engadir novo"}.
{"Add User","Engadir usuario"}.
{"Administration of ","Administración de "}.
{"Administration","Administración"}.
{"Administration of ","Administración de "}.
{"Administrator privileges required","Necesítase privilexios de administrador"}.
{"All activity","Toda a actividade"}.
{"All Users","Todos os usuarios"}.
{"Allow users to change the subject","Permitir aos usuarios cambiar o asunto"}.
{"Allow users to query other users","Permitir aos usuarios consultar a outros usuarios"}.
{"Allow users to send invites","Permitir aos usuarios enviar invitacións"}.
@@ -23,14 +16,16 @@
{"Allow visitors to change nickname","Permitir aos visitantes cambiarse o alcume"}.
{"Allow visitors to send private messages to","Permitir aos visitantes enviar mensaxes privadas a"}.
{"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"}.
{"A password is required to enter this room","Necesítase contrasinal para entrar nesta sala"}.
{"April","Abril"}.
{"August","Agosto"}.
{"Automatic node creation is not enabled","A creación automática de nodos non está habilitada"}.
{"Backup","Copia de seguridade"}.
{"Backup Management","Xestión de copia de seguridade"}.
{"Backup of ~p","Copia de seguridade de ~p"}.
{"Backup to File at ","Copia de seguridade de arquivos en "}.
{"Backup","Copia de seguridade"}.
{"Bad format","Mal formato"}.
{"Birthday","Aniversario"}.
{"Both the username and the resource are required","Tanto o nome de usuario como o recurso son necesarios"}.
@@ -56,19 +51,19 @@
{"City","Cidade"}.
{"Commands","Comandos"}.
{"Conference room does not exist","A sala de conferencias non existe"}.
{"Configuration of room ~s","Configuración para a sala ~s"}.
{"Configuration","Configuración"}.
{"Configuration of room ~s","Configuración para a sala ~s"}.
{"Connected Resources:","Recursos conectados:"}.
{"Country","País"}.
{"CPU Time:","Tempo da CPU:"}.
{"Database","Base de datos"}.
{"Database failure","Erro na base de datos"}.
{"Database Tables at ~p","Táboas da base de datos en ~p"}.
{"Database Tables Configuration at ","Configuración de táboas da base de datos en "}.
{"Database","Base de datos"}.
{"December","Decembro"}.
{"Default users as participants","Os usuarios son participantes por defecto"}.
{"Delete message of the day on all hosts","Borrar a mensaxe do día en todos os dominios"}.
{"Delete message of the day","Borrar mensaxe do dia"}.
{"Delete message of the day on all hosts","Borrar a mensaxe do día en todos os dominios"}.
{"Delete Selected","Eliminar os seleccionados"}.
{"Delete User","Borrar usuario"}.
{"Description:","Descrición:"}.
@@ -114,10 +109,9 @@
{"Family Name","Apelido"}.
{"February","Febreiro"}.
{"File larger than ~w bytes","O ficheiro é maior que ~w bytes"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Enche o formulario para buscar usuarios Jabber (Engade * ao final dun campo para buscar subcadenas)"}.
{"Friday","Venres"}.
{"From ~s","De ~s"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nome completo"}.
{"Get Number of Online Users","Ver número de usuarios conectados"}.
{"Get Number of Registered Users","Ver número de usuarios rexistrados"}.
@@ -128,12 +122,13 @@
{"Group ","Grupo "}.
{"Groups","Grupos"}.
{"has been banned","foi bloqueado"}.
{"has been kicked because of a system shutdown","foi expulsado porque o sistema vaise a deter"}.
{"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 porque o sistema vaise a deter"}.
{"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"}.
{"Host unknown","Dominio descoñecido"}.
{" has set the subject to: "," puxo o asunto: "}.
{"Host","Host"}.
{"Host unknown","Dominio descoñecido"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Si non ves a imaxe CAPTCHA aquí, visita a páxina web."}.
{"Import Directory","Importar directorio"}.
{"Import File","Importar ficheiro"}.
@@ -156,12 +151,11 @@
{"Invalid 'from' attribute in forwarded message","Atributo 'from'' non é válido na mensaxe reenviada"}.
{"Invitations are not allowed in this conference","As invitacións non están permitidas nesta sala"}.
{"IP addresses","Direccións IP"}.
{"IP","IP"}.
{"is now known as","agora coñécese como"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Non está permitido enviar mensaxes de erro á sala. Este participante (~s) enviou unha mensaxe de erro (~s) e foi expulsado da sala"}.
{"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"}.
{"It is not allowed to send private messages","Non está permitido enviar mensaxes privadas"}.
{"Jabber Account Registration","Rexistro de conta Jabber"}.
{"Jabber ID","Jabber ID"}.
{"January","Xaneiro"}.
@@ -175,8 +169,6 @@
{"leaves the room","sae da sala"}.
{"List of modules to start","Lista de módulos a iniciar"}.
{"List of rooms","Lista de salas"}.
{"Listened Ports at ","Portos de escoita en "}.
{"Listened Ports","Portos de escoita"}.
{"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"}.
@@ -199,8 +191,6 @@
{"Moderator privileges required","Necesítase privilexios de moderador"}.
{"Modified modules","Módulos Modificados"}.
{"Module failed to handle the query","O módulo non puido xestionar a consulta"}.
{"Module","Módulo"}.
{"Modules at ~p","Módulos en ~p"}.
{"Modules","Módulos"}.
{"Monday","Luns"}.
{"Multicast","Multicast"}.
@@ -212,23 +202,29 @@
{"Neither 'role' nor 'affiliation' attribute found","Non se atopou o atributo 'role' nin 'affiliation'"}.
{"Never","Nunca"}.
{"New Password:","Novo contrasinal:"}.
{"Nickname","Alcume"}.
{"Nickname Registration at ","Rexistro do alcume en "}.
{"Nickname ~s does not exist in the room","O alcume ~s non existe na sala"}.
{"Nickname","Alcume"}.
{"No 'access' found in data form","Non se atopou 'access' no formulario de datos"}.
{"No 'acls' found in data form","Non se atopou 'acls' no formulario de datos"}.
{"No 'affiliation' attribute found","Non se atopou o atributo de 'affiliation'"}.
{"No available resource found","Non se atopou ningún recurso"}.
{"No body provided for announce message","Non se proporcionou corpo de mensaxe para o anuncio"}.
{"No data form found","Non se atopou formulario de datos"}.
{"No Data","Sen datos"}.
{"Node already exists","O nodo xa existe"}.
{"Node index not found","Non se atopou índice de nodo"}.
{"Node not found","Nodo non atopado"}.
{"Node ~p","Nodo ~p"}.
{"Nodeprep has failed","Nodeprep fallou"}.
{"Nodes","Nodos"}.
{"No features available","Non hai características dispoñibles"}.
{"No hook has processed this command","Ningún evento procesou este comando"}.
{"No info about last activity found","Non se atopou información sobre a última actividade"}.
{"No 'item' element found","Non se atopou o elemento 'item'"}.
{"No items found in this query","Non se atoparon elementos nesta consulta"}.
{"No limit","Sen límite"}.
{"No module is handling this query","Ningún módulo manexa esta consulta"}.
{"No 'modules' found in data form","Non se atopan 'modules' no formulario de datos"}.
{"None","Ningún"}.
{"No node specified","Non se especificou nodo"}.
{"No 'password' found in data form","Non se atopou 'password' no formulario de datos"}.
{"No 'password' found in this query","Non se atopou 'password' nesta solicitude"}.
@@ -239,15 +235,8 @@
{"No running node found","Non se atoparon nodos activos"}.
{"No services available","Non hai servizos dispoñibles"}.
{"No statistics found for this item","Non se atopou ningunha estatística para este elemento"}.
{"No 'to' attribute found in the invitation","O atributo 'to' non se atopou na invitación"}.
{"Node already exists","O nodo xa existe"}.
{"Node index not found","Non se atopou índice de nodo"}.
{"Node not found","Nodo non atopado"}.
{"Node ~p","Nodo ~p"}.
{"Nodeprep has failed","Nodeprep fallou"}.
{"Nodes","Nodos"}.
{"None","Ningún"}.
{"Not Found","Non atopado"}.
{"No 'to' attribute found in the invitation","O atributo 'to' non se atopou na invitación"}.
{"Not subscribed","Non subscrito"}.
{"November","Novembro"}.
{"Number of online users","Número de usuarios conectados"}.
@@ -257,9 +246,9 @@
{"Offline Messages:","Mensaxes sen conexión:"}.
{"OK","Aceptar"}.
{"Old Password:","Contrasinal anterior:"}.
{"Online","Conectado"}.
{"Online Users","Usuarios conectados"}.
{"Online Users:","Usuarios conectados:"}.
{"Online","Conectado"}.
{"Only <enable/> or <disable/> tags are allowed","Só se permiten etiquetas <enable/> ou <disable/>"}.
{"Only <list/> element is allowed in this query","Só se admite o elemento <list/> nesta consulta"}.
{"Only members may query archives of this room","Só membros poden consultar o arquivo de mensaxes da sala"}.
@@ -269,7 +258,6 @@
{"Only occupants are allowed to send messages to the conference","Só os ocupantes poden enviar mensaxes á sala"}.
{"Only occupants are allowed to send queries to the conference","Só os ocupantes poden enviar solicitudes á sala"}.
{"Only service administrators are allowed to send service messages","Só os administradores do servizo teñen permiso para enviar mensaxes de servizo"}.
{"Options","Opcións"}.
{"Organization Name","Nome da organización"}.
{"Organization Unit","Unidade da organización"}.
{"Outgoing s2s Connections","Conexións S2S saíntes"}.
@@ -277,31 +265,27 @@
{"Owner privileges required","Requírense privilexios de propietario da sala"}.
{"Packet","Paquete"}.
{"Parse failed","Fallou o procesamento"}.
{"Password Verification","Verificación da contrasinal"}.
{"Password Verification:","Verificación da Contrasinal:"}.
{"Password","Contrasinal"}.
{"Password:","Contrasinal:"}.
{"Password Verification","Verificación da contrasinal"}.
{"Password Verification:","Verificación da Contrasinal:"}.
{"Path to Dir","Ruta ao directorio"}.
{"Path to File","Ruta ao ficheiro"}.
{"Pending","Pendente"}.
{"Period: ","Periodo: "}.
{"Ping query is incorrect","A solicitude de Ping é incorrecta"}.
{"Ping","Ping"}.
{"Ping query is incorrect","A solicitude de Ping é incorrecta"}.
{"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."}.
{"Please, wait for a while before sending new voice request","Por favor, espera un pouco antes de enviar outra petición de voz"}.
{"Pong","Pong"}.
{"Port","Porto"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Posuír o atributo 'ask' non está permitido por RFC6121"}.
{"private, ","privado, "}.
{"Protocol","Protocolo"}.
{"Publishing items to collection node is not allowed","Non se permite a publicación de elementos no nodo de colección"}.
{"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"}.
{"Query to another users is forbidden","É prohibido enviar solicitudes a outros usuarios"}.
{"RAM and disc copy","Copia en RAM e disco"}.
{"RAM copy","Copia en RAM"}.
{"Raw","Cru"}.
{"Really delete message of the day?","¿Está seguro que quere borrar a mensaxe do dia?"}.
{"Recipient is not in the conference room","O receptor non está na sala de conferencia"}.
{"Register a Jabber account","Rexistrar unha conta Jabber"}.
@@ -310,12 +294,12 @@
{"Register","Rexistrar"}.
{"Remote copy","Copia remota"}.
{"Remove All Offline Messages","Borrar Todas as Mensaxes Sen conexión"}.
{"Remove User","Eliminar usuario"}.
{"Remove","Borrar"}.
{"Remove User","Eliminar usuario"}.
{"Replaced by new connection","Substituído por unha nova conexión"}.
{"Resources","Recursos"}.
{"Restart Service","Reiniciar o servizo"}.
{"Restart","Reiniciar"}.
{"Restart Service","Reiniciar o servizo"}.
{"Restore Backup from File at ","Restaura copia de seguridade desde o ficheiro en "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaurar copia de seguridade binaria no seguinte reinicio de ejabberd (require menos memoria):"}.
{"Restore binary backup immediately:","Restaurar inmediatamente copia de seguridade binaria:"}.
@@ -326,23 +310,21 @@
{"Room description","Descrición da sala"}.
{"Room Occupants","Ocupantes da sala"}.
{"Room title","Título da sala"}.
{"Roster","Lista de contactos"}.
{"Roster module has failed","O módulo de Roster fallou"}.
{"Roster of ","Lista de contactos de "}.
{"Roster size","Tamaño da lista de contactos"}.
{"Roster","Lista de contactos"}.
{"RPC Call Error","Erro na chamada RPC"}.
{"Running Nodes","Nodos funcionando"}.
{"~s access rule configuration","Configuración das regra de acceso ~s"}.
{"~s invites you to the room ~s","~s invítache á sala ~s"}.
{"Saturday","Sábado"}.
{"Scan failed","O escaneo Fallou"}.
{"Script check","Comprobación de script"}.
{"Search Results for ","Buscar resultados por "}.
{"Search users in ","Buscar usuarios en "}.
{"Send announcement to all online users on all hosts","Enviar anuncio a todos os usuarios conectados en todos os dominios"}.
{"Send announcement to all online users","Enviar anuncio a todos os usuarios conectados"}.
{"Send announcement to all users on all hosts","Enviar anuncio a todos os usuarios en todos os dominios"}.
{"Send announcement to all online users on all hosts","Enviar anuncio a todos os usuarios conectados en todos os dominios"}.
{"Send announcement to all users","Enviar anuncio a todos os usuarios"}.
{"Send announcement to all users on all hosts","Enviar anuncio a todos os usuarios en todos os dominios"}.
{"September","Setembro"}.
{"Server connections to local subdomains are forbidden","Non se permiten conexións de servidor a subdominios locais"}.
{"Server:","Servidor:"}.
@@ -352,16 +334,16 @@
{"Show Integral Table","Mostrar Táboa Integral"}.
{"Show Ordinary Table","Mostrar Táboa Ordinaria"}.
{"Shut Down Service","Deter o servizo"}.
{"~s invites you to the room ~s","~s invítache á sala ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Algúns clientes Jabber pode almacenar o contrasinal no computador, pero debe facer isto só no seu computador persoal por razóns de seguridade."}.
{"~s's Offline Messages Queue","Cola de mensaxes diferidas de ~s"}.
{"Start Modules at ","Iniciar módulos en "}.
{"Start Modules","Iniciar módulos"}.
{"Start","Iniciar"}.
{"Statistics of ~p","Estatísticas de ~p"}.
{"Statistics","Estatísticas"}.
{"Statistics of ~p","Estatísticas de ~p"}.
{"Stop","Deter"}.
{"Stop Modules at ","Deter módulos en "}.
{"Stop Modules","Deter módulos"}.
{"Stop","Deter"}.
{"Stopped Nodes","Nodos detidos"}.
{"Storage Type","Tipo de almacenamento"}.
{"Store binary backup:","Gardar copia de seguridade binaria:"}.
@@ -378,32 +360,33 @@
{"The CAPTCHA verification has failed","A verificación de CAPTCHA fallou"}.
{"The feature requested is not supported by the conference","A sala de conferencias non admite a función solicitada"}.
{"The password contains unacceptable characters","O contrasinal contén caracteres inaceptables"}.
{"The password is too weak","O contrasinal é demasiado débil"}.
{"the password is","a contrasinal é"}.
{"The password is too weak","O contrasinal é demasiado débil"}.
{"The password of your Jabber account was successfully changed.","O contrasinal da súa conta Jabber cambiouse correctamente."}.
{"The query is only allowed from local users","A solicitude só se permite para usuarios locais"}.
{"The query must not contain <item/> elements","A solicitude non debe conter elementos <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","A estroa DEBEN conter un elemento <active/>, un elemento <default/> ou un elemento <list/>"}.
{"There was an error changing the password: ","Produciuse un erro ao cambiar o contrasinal: "}.
{"There was an error creating the account: ","Produciuse un erro ao crear a conta: "}.
{"There was an error deleting the account: ","Produciuse un erro ao eliminar a conta: "}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","A estroa DEBEN conter un elemento <active/>, un elemento <default/> ou un elemento <list/>"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Esta é insensible: Macbeth é o mesmo que MacBeth e Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Esta páxina permite crear unha conta Jabber neste servidor Jabber. o seu JID (Jabber IDentificador) será da forma: nomeusuario@servidor. Por favor le coidadosamente as instrucións para encher correctamente os campos."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Esta páxina permite anular o rexistro dunha conta Jabber neste servidor Jabber."}.
{"This room is not anonymous","Sala non anónima"}.
{"Thursday","Xoves"}.
{"Time delay","Atraso temporal"}.
{"Time","Data"}.
{"To register, visit ~s","Para rexistrarse, visita ~s"}.
{"To ~s","A ~s"}.
{"Time delay","Atraso temporal"}.
{"Token TTL","Token TTL"}.
{"Too many active bytestreams","Demasiados bytestreams activos"}.
{"Too many CAPTCHA requests","Demasiadas solicitudes CAPTCHA"}.
{"Too many <item/> elements","Demasiados elementos <item/>"}.
{"Too many <list/> elements","Demasiados elementos <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Demasiados (~p) fallou autenticaciones desde esta dirección IP (~s). A dirección será desbloqueada as ~s UTC"}.
{"Too many unacked stanzas","Demasiadas mensaxes sen recoñecer recibilos"}.
{"Too many users in this conference","Demasiados usuarios nesta sala"}.
{"To","Para"}.
{"To register, visit ~s","Para rexistrarse, visita ~s"}.
{"To ~s","A ~s"}.
{"Total rooms","Salas totais"}.
{"Traffic rate limit is exceeded","Hase exedido o límite de tráfico"}.
{"Transactions Aborted:","Transaccións abortadas:"}.
@@ -418,23 +401,22 @@
{"Unregister a Jabber account","Eliminar o rexistro dunha conta Jabber"}.
{"Unregister","Eliminar rexistro"}.
{"Unsupported <index/> element","Elemento <index/> non soportado"}.
{"Update","Actualizar"}.
{"Update message of the day (don't send)","Actualizar mensaxe do dia, pero non envialo"}.
{"Update message of the day on all hosts (don't send)","Actualizar a mensaxe do día en todos os dominos (pero non envialo)"}.
{"Update ~p","Actualizar ~p"}.
{"Update plan","Plan de actualización"}.
{"Update script","Script de actualización"}.
{"Update","Actualizar"}.
{"Uptime:","Tempo desde o inicio:"}.
{"User already exists","O usuario xa existe"}.
{"User (jid)","Usuario (jid)"}.
{"User Management","Administración de usuarios"}.
{"User part of JID in 'from' is empty","A parte do usuario do JID en 'from' está baleira"}.
{"User session not found","Sesión de usuario non atopada"}.
{"User session terminated","Sesión de usuario completada"}.
{"User ~s","Usuario ~s"}.
{"Username:","Nome de usuario:"}.
{"Users are not allowed to register accounts so quickly","Os usuarios non están autorizados a rexistrar contas con tanta rapidez"}.
{"User session not found","Sesión de usuario non atopada"}.
{"User session terminated","Sesión de usuario completada"}.
{"Users Last Activity","Última actividade dos usuarios"}.
{"User ~s","Usuario ~s"}.
{"Users","Usuarios"}.
{"User","Usuario"}.
{"Validate","Validar"}.
@@ -459,7 +441,6 @@
{"You need an x:data capable client to search","Necesitas un cliente con soporte de x:data para poder buscar"}.
{"Your active privacy list has denied the routing of this stanza.","A súa lista de privacidade activa negou o encaminamiento desta estrofa."}.
{"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."}.
{"You're not allowed to create nodes","Non tes permiso para crear nodos"}.
{"Your Jabber account was successfully created.","A súa conta Jabber creouse correctamente."}.
{"Your Jabber account was successfully deleted.","A súa conta Jabber eliminouse correctamente."}.
{"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"}.
{"You're not allowed to create nodes","Non tes permiso para crear nodos"}.
+791 -664
View File
File diff suppressed because it is too large Load Diff
+22 -37
View File
@@ -1,12 +1,6 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," הגדיר/ה את הנושא אל: "}.
{"A password is required to enter this room","נדרשת סיסמה כדי להיכנס אל חדר זה"}.
%% -*- coding: utf-8 -*-
{"Accept","קבל"}.
{"Access Configuration","תצורת גישה"}.
{"Access Control List Configuration","תצורת רשימת בקרת גישה"}.
{"Access Control Lists","רשימות בקרת גישה"}.
{"Access denied by service policy","גישה נדחתה על ידי פוליסת שירות"}.
{"Access Rules","כללי גישה"}.
{"Action on user","פעולה על משתמש"}.
{"Add Jabber ID","הוסף מזהה Jabber"}.
{"Add New","הוסף חדש"}.
@@ -15,7 +9,6 @@
{"Administration","הנהלה"}.
{"Administrator privileges required","נדרשות הרשאות מנהל"}.
{"All activity","כל פעילות"}.
{"All Users","כל המשתמשים"}.
{"Allow users to change the subject","התר למשתמשים לשנות את הנושא"}.
{"Allow users to query other users","התר למשתמשים לתשאל משתמשים אחרים"}.
{"Allow users to send invites","התר למשתמשים לשלוח הזמנות"}.
@@ -23,7 +16,9 @@
{"Allow visitors to change nickname","התר למבקרים לשנות שם כינוי"}.
{"Allow visitors to send private messages to","התר למבקרים לשלוח הודעות פרטיות אל"}.
{"Allow visitors to send status text in presence updates","התר למבקרים לשלוח טקסט מצב בתוך עדכוני נוכחות"}.
{"All Users","כל המשתמשים"}.
{"Announcements","בשורות"}.
{"A password is required to enter this room","נדרשת סיסמה כדי להיכנס אל חדר זה"}.
{"April","אפריל"}.
{"August","אוגוסט"}.
{"Automatic node creation is not enabled","יצירה אוטומטית של צומת אינה מאופשרת"}.
@@ -107,7 +102,6 @@
{"Family Name","שם משפחה"}.
{"February","פברואר"}.
{"File larger than ~w bytes","קובץ גדול יותר משיעור של ~w בייטים"}.
{"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","מאת"}.
@@ -118,13 +112,14 @@
{"Get User Password","השג סיסמת משתמש"}.
{"Get User Statistics","השג סטטיסטיקת משתמש"}.
{"Given Name","שם פרטי"}.
{"Group ","קבוצה "}.
{"Groups","קבוצות"}.
{"Group ","קבוצה "}.
{"has been banned","נאסר/ה"}.
{"has been kicked because of a system shutdown","נבעט/ה משום כיבוי מערכת"}.
{"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 unknown","מארח לא ידוע"}.
{"Host","מארח"}.
{"If you don't see the CAPTCHA image here, visit the web page.","אם אינך רואה תמונת CAPTCHA כאן, בקר בעמוד רשת."}.
@@ -144,7 +139,6 @@
{"Insufficient privilege","הרשאה לא מספיקה"}.
{"Invitations are not allowed in this conference","הזמנות אינן מותרות בועידה זו"}.
{"IP addresses","כתובות IP"}.
{"IP","IP"}.
{"is now known as","ידועה כעת בכינוי"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","אין זה מותר לשלוח הודעות שגיאה לחדר. משתתף זה (~s) שלח הודעת שגיאה (~s) ונבעט מתוך החדר"}.
{"It is not allowed to send private messages of type \"groupchat\"","אין זה מותר לשלוח הודעות פרטיות מן טיפוס \"groupchat\""}.
@@ -163,8 +157,6 @@
{"leaves the room","עוזב/ת את החדר"}.
{"List of modules to start","רשימה של מודולים להפעלה"}.
{"List of rooms","רשימה של חדרים"}.
{"Listened Ports at ","פורטים מואזנים אצל "}.
{"Listened Ports","פורטים מואזנים"}.
{"Low level update script","תסריט עדכון Low level"}.
{"Make participants list public","הפוך רשימת משתתפים לפומבית"}.
{"Make room CAPTCHA protected","הפוך חדר לחדר מוגן CAPTCHA"}.
@@ -186,9 +178,7 @@
{"Moderator privileges required","נדרשות הרשאות אחראי"}.
{"Modified modules","מודולים שהותאמו"}.
{"Module failed to handle the query","מודול נכשל לטפל בשאילתא"}.
{"Modules at ~p","מודולים אצל ~p"}.
{"Modules","מודולים"}.
{"Module","מודול"}.
{"Monday","יום שני"}.
{"Multicast","שידור מרובב"}.
{"Multi-User Chat","שיחה מרובת משתמשים"}.
@@ -202,9 +192,17 @@
{"No available resource found","לא נמצא משאב זמין"}.
{"No body provided for announce message","לא סופק גוף עבור הודעת בשורה"}.
{"No Data","אין מידע"}.
{"Node already exists","צומת כבר קיים"}.
{"Node index not found","מפתח צומת לא נמצא"}.
{"Node not found","צומת לא נמצא"}.
{"Nodeprep has failed","Nodeprep נכשל"}.
{"Node ~p","צומת ~p"}.
{"Nodes","צמתים"}.
{"No features available","אין תכונות זמינות"}.
{"No items found in this query","לא נמצאו פריטים בתוך שאילתא זו"}.
{"No limit","ללא הגבלה"}.
{"No module is handling this query","אין מודול אשר מטפל בשאילתא זו"}.
{"None","אין"}.
{"No node specified","לא צויין צומת"}.
{"No pending subscriptions found","לא נמצאו הרשמות ממתינות"}.
{"No privacy list with this name found","לא נמצאה רשימת פרטיות בשם זה"}.
@@ -212,13 +210,6 @@
{"No running node found","לא נמצא צומת מורץ"}.
{"No services available","אין שירות זמין"}.
{"No statistics found for this item","לא נמצאה סטטיסטיקה לגבי פריט זה"}.
{"Node already exists","צומת כבר קיים"}.
{"Node index not found","מפתח צומת לא נמצא"}.
{"Node not found","צומת לא נמצא"}.
{"Node ~p","צומת ~p"}.
{"Nodeprep has failed","Nodeprep נכשל"}.
{"Nodes","צמתים"}.
{"None","אין"}.
{"Not Found","לא נמצא"}.
{"Not subscribed","לא רשום"}.
{"November","נובמבר"}.
@@ -240,7 +231,6 @@
{"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 יוצאים"}.
@@ -261,15 +251,12 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","אנא שים לב כי אפשרויות אלו יגבו את מסד הנתונים המובנה Mnesia בלבד. אם הינך עושה שימוש במודול ODBC, עליך גם לגבות את מסד הנתונים SQL אשר מצוי ברשותך בנפרד."}.
{"Please, wait for a while before sending new voice request","אנא, המתן לזמן מה לפני שליחת בקשת ביטוי חדשה"}.
{"Pong","פונג"}.
{"Port","פורט"}.
{"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","גולמי"}.
{"Really delete message of the day?","באמת למחוק את בשורת היום?"}.
{"Recipient is not in the conference room","מקבל אינו מצוי בחדר הועידה"}.
{"Register a Jabber account","רשום חשבון Jabber"}.
@@ -300,8 +287,6 @@
{"Roster","רשימה"}.
{"RPC Call Error","שגיאת קריאת RPC"}.
{"Running Nodes","צמתים מורצים"}.
{"~s access rule configuration","~s תצורת כללי גישה"}.
{"~s invites you to the room ~s","~s מזמינך לחדר ~s"}.
{"Saturday","יום שבת"}.
{"Scan failed","סריקה נכשלה"}.
{"Script check","בדיקת תסריט"}.
@@ -319,11 +304,11 @@
{"Show Integral Table","הצג טבלה אינטגרלית"}.
{"Show Ordinary Table","הצג טבלה רגילה"}.
{"Shut Down Service","כבה שירות"}.
{"~s invites you to the room ~s","~s מזמינך לחדר ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","ישנם לקוחות Jabber אשר מסוגלים לאחסן את הסיסמה שלך בתוך המחשב, אולם עליך לעשות זאת רק בתוך המחשב האישי שלך מסיבות ביטחוניות."}.
{"~s's Offline Messages Queue","תור הודעות לא מקוונות של ~s"}.
{"Start Modules at ","התחל מודולים אצל "}.
{"Start Modules","התחל מודולים"}.
{"Start","התחל"}.
{"Statistics of ~p","סטטיסטיקות של ~p"}.
{"Statistics","סטטיסטיקה"}.
{"Stop Modules at ","הפסק מודולים אצל "}.
@@ -356,13 +341,14 @@
{"Thursday","יום חמישי"}.
{"Time delay","זמן שיהוי"}.
{"Time","זמן"}.
{"To register, visit ~s","כדי להירשם, בקרו ~s"}.
{"To ~s","אל ~s"}.
{"Token TTL","סימן TTL"}.
{"Too many active bytestreams","יותר מדי יחידות bytestream פעילות"}.
{"Too many CAPTCHA requests","יותר מדי בקשות CAPTCHA"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","יותר מדי (~p) אימותים כושלים מתוך כתובת IP זו (~s). הכתובת תורשה לקבל גישה בשעה ~s UTC"}.
{"Too many unacked stanzas","יותר מדי סטנזות בלי אישורי קבלה"}.
{"Too many users in this conference","יותר מדי משתמשים בועידה זו"}.
{"To register, visit ~s","כדי להירשם, בקרו ~s"}.
{"To ~s","אל ~s"}.
{"Total rooms","חדרים סה״כ"}.
{"To","לכבוד"}.
{"Traffic rate limit is exceeded","מגבלת שיעור תעבורה נחצתה"}.
@@ -386,12 +372,12 @@
{"User already exists","משתמש כבר קיים"}.
{"User (jid)","משתמש (jid)"}.
{"User Management","ניהול משתמשים"}.
{"User session not found","סשן משתמש לא נמצא"}.
{"User session terminated","סשן משתמש הסתיים"}.
{"User ~s","משתמש ~s"}.
{"Username:","שם משתמש:"}.
{"Users are not allowed to register accounts so quickly","משתמשים אינם מורשים לרשום חשבונות כל כך במהירות"}.
{"User session not found","סשן משתמש לא נמצא"}.
{"User session terminated","סשן משתמש הסתיים"}.
{"Users Last Activity","פעילות משתמשים אחרונה"}.
{"User ~s","משתמש ~s"}.
{"Users","משתמשים"}.
{"User","משתמש"}.
{"Validate","הענק תוקף"}.
@@ -414,7 +400,6 @@
{"You need an x:data capable client to search","עליך להשתמש בלקוח אשר מסוגל להבין x:data כדי לחפש"}.
{"Your active privacy list has denied the routing of this stanza.","רשימת הפרטיות הפעילה שלך אסרה את הניתוב של סטנזה זו."}.
{"Your contact offline message queue is full. The message has been discarded.","תור הודעות קשר לא מקוונות הינו מלא. ההודעה סולקה."}.
{"You're not allowed to create nodes","אינך מורשה ליצור צמתים"}.
{"Your Jabber account was successfully created.","חשבון Jabber נוצר בהצלחה."}.
{"Your Jabber account was successfully deleted.","חשבון Jabber נמחק בהצלחה."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","ההודעות שלך לערוץ ~s הינן חסומות. כדי לבטל את חסימתן, בקר בכתובת ~s"}.
{"You're not allowed to create nodes","אינך מורשה ליצור צמתים"}.
+782 -665
View File
File diff suppressed because it is too large Load Diff
+27 -42
View File
@@ -1,32 +1,27 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: ","telah menetapkan topik yaitu:"}.
{"A password is required to enter this room","Diperlukan kata sandi untuk masuk ruangan ini"}.
{"Access Configuration","Akses Konfigurasi"}.
{"Access Control List Configuration","Konfigurasi Daftar Akses Pengendalian"}.
{"Access Control Lists","Akses Daftar Pengendalian"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Akses ditolak oleh kebijakan layanan"}.
{"Access Rules","Aturan Akses"}.
{"Action on user","Tindakan pada pengguna"}.
{"Add Jabber ID","Tambah Jabber ID"}.
{"Add New","Tambah Baru"}.
{"Add User","Tambah Pengguna"}.
{"Administration of ","Administrasi"}.
{"Administration","Administrasi"}.
{"Administration of ","Administrasi"}.
{"Administrator privileges required","Hak istimewa Administrator dibutuhkan"}.
{"All activity","Semua aktifitas"}.
{"All Users","Semua Pengguna"}.
{"Allow users to change the subject","Perbolehkan pengguna untuk mengganti topik"}.
{"Allow users to query other users","Perbolehkan pengguna untuk mengetahui pengguna lain"}.
{"Allow users to send invites","Perbolehkan pengguna mengirimkan undangan"}.
{"Allow users to send private messages","perbolehkan pengguna mengirimkan pesan ke pengguna lain secara pribadi"}.
{"Allow visitors to change nickname","Perbolehkan visitor mengganti nama julukan"}.
{"Allow visitors to send status text in presence updates","Izinkan pengunjung untuk mengirim teks status terbaru"}.
{"All Users","Semua Pengguna"}.
{"Announcements","Pengumuman"}.
{"A password is required to enter this room","Diperlukan kata sandi untuk masuk ruangan ini"}.
{"April","April"}.
{"August","Agustus"}.
{"Backup","Backup"}.
{"Backup Management","Manajemen Backup"}.
{"Backup to File at ","Backup ke File pada"}.
{"Backup","Backup"}.
{"Bad format","Format yang buruk"}.
{"Birthday","Hari Lahir"}.
{"CAPTCHA web page","CAPTCHA laman web"}.
@@ -51,12 +46,12 @@
{"Connected Resources:","Sumber Daya Terhubung:"}.
{"Country","Negara"}.
{"CPU Time:","Waktu CPU:"}.
{"Database Tables Configuration at ","Database Tabel Konfigurasi pada"}.
{"Database","Database"}.
{"Database Tables Configuration at ","Database Tabel Konfigurasi pada"}.
{"December","Desember"}.
{"Default users as participants","pengguna pertama kali masuk sebagai participant"}.
{"Delete message of the day on all hosts","Hapus pesan harian pada semua host"}.
{"Delete message of the day","Hapus pesan harian"}.
{"Delete message of the day on all hosts","Hapus pesan harian pada semua host"}.
{"Delete Selected","Hapus Yang Terpilih"}.
{"Delete User","Hapus Pengguna"}.
{"Description:","Keterangan:"}.
@@ -88,10 +83,9 @@
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Ekspor data pengguna pada sebuah host ke berkas PIEFXIS (XEP-0227):"}.
{"Family Name","Nama Keluarga (marga)"}.
{"February","Februari"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Isi formulir untuk pencarian pengguna Jabber yang cocok (Tambahkan * ke mengakhiri pengisian untuk menyamakan kata)"}.
{"Friday","Jumat"}.
{"From ~s","Dari ~s"}.
{"From","Dari"}.
{"From ~s","Dari ~s"}.
{"Full Name","Nama Lengkap"}.
{"Get Number of Online Users","Dapatkan Jumlah User Yang Online"}.
{"Get Number of Registered Users","Dapatkan Jumlah Pengguna Yang Terdaftar"}.
@@ -101,10 +95,11 @@
{"Group ","Grup"}.
{"Groups","Grup"}.
{"has been banned","telah dibanned"}.
{"has been kicked because of a system shutdown","telah dikick karena sistem shutdown"}.
{"has been kicked because of an affiliation change","telah dikick karena perubahan afiliasi"}.
{"has been kicked because of a system shutdown","telah dikick karena sistem shutdown"}.
{"has been kicked because the room has been changed to members-only","telah dikick karena ruangan telah diubah menjadi hanya untuk member"}.
{"has been kicked","telah dikick"}.
{" has set the subject to: ","telah menetapkan topik yaitu:"}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Jika Anda tidak melihat gambar CAPTCHA disini, silahkan kunjungi halaman web."}.
{"Import Directory","Impor Direktori"}.
@@ -118,11 +113,10 @@
{"Improper message type","Jenis pesan yang tidak benar"}.
{"Incorrect password","Kata sandi salah"}.
{"IP addresses","Alamat IP"}.
{"IP","IP"}.
{"is now known as","sekarang dikenal sebagai"}.
{"It is not allowed to send private messages","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi"}.
{"It is not allowed to send private messages of type \"groupchat\"","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi jenis \"groupchat \""}.
{"It is not allowed to send private messages to the conference","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi ke konferensi"}.
{"It is not allowed to send private messages","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi"}.
{"Jabber Account Registration","Pendaftaran Akun Jabber"}.
{"Jabber ID","Jabber ID"}.
{"January","Januari"}.
@@ -135,8 +129,6 @@
{"Last year","Akhir tahun"}.
{"leaves the room","meninggalkan ruangan"}.
{"List of modules to start","Daftar modul untuk memulai"}.
{"Listened Ports at ","Mendeteksi Port-port di"}.
{"Listened Ports","Port Terdeteksi"}.
{"Low level update script","Perbaruan naskah tingkat rendah"}.
{"Make participants list public","Buat daftar participant diketahui oleh public"}.
{"Make room CAPTCHA protected","Buat ruangan dilindungi dengan CAPTCHA"}.
@@ -156,20 +148,20 @@
{"Middle Name","Nama Tengah"}.
{"Moderator privileges required","Hak istimewa moderator dibutuhkan"}.
{"Modified modules","Modifikasi modul-modul"}.
{"Module","Modul"}.
{"Modules","Modul"}.
{"Monday","Senin"}.
{"Name","Nama"}.
{"Name:","Nama:"}.
{"Never","Tidak Pernah"}.
{"New Password:","Password Baru:"}.
{"Nickname","Nama Julukan"}.
{"Nickname Registration at ","Pendaftaran Julukan pada"}.
{"Nickname ~s does not exist in the room","Nama Julukan ~s tidak berada di dalam ruangan"}.
{"Nickname","Nama Julukan"}.
{"No body provided for announce message","Tidak ada isi pesan yang disediakan untuk mengirimkan pesan"}.
{"No Data","Tidak Ada Data"}.
{"Node not found","Node tidak ditemukan"}.
{"Nodes","Node-node"}.
{"No limit","Tidak terbatas"}.
{"None","Tak satupun"}.
{"Not Found","Tidak Ditemukan"}.
{"November","Nopember"}.
@@ -180,25 +172,24 @@
{"Offline Messages:","Pesan Offline:"}.
{"OK","YA"}.
{"Old Password:","Password Lama:"}.
{"Online","Online"}.
{"Online Users:","Pengguna Online:"}.
{"Online Users","Pengguna Yang Online"}.
{"Online","Online"}.
{"Only moderators and participants are allowed to change the subject in this room","Hanya moderator dan peserta yang diizinkan untuk mengganti topik pembicaraan di ruangan ini"}.
{"Only moderators are allowed to change the subject in this room","Hanya moderator yang diperbolehkan untuk mengubah topik dalam ruangan ini"}.
{"Only occupants are allowed to send messages to the conference","Hanya penghuni yang diizinkan untuk mengirim pesan ke konferensi"}.
{"Only occupants are allowed to send queries to the conference","Hanya penghuni diizinkan untuk mengirim permintaan ke konferensi"}.
{"Only service administrators are allowed to send service messages","Layanan hanya diperuntukan kepada administrator yang diizinkan untuk mengirim layanan pesan"}.
{"Options","Pilihan-pilihan"}.
{"Organization Name","Nama Organisasi"}.
{"Organization Unit","Unit Organisasi"}.
{"Outgoing s2s Connections","Koneksi Keluar s2s"}.
{"Outgoing s2s Connections:","Koneksi s2s yang keluar:"}.
{"Owner privileges required","Hak istimewa owner dibutuhkan"}.
{"Packet","Paket"}.
{"Password Verification:","Verifikasi Kata Sandi:"}.
{"Password Verification","Verifikasi Sandi"}.
{"Password:","Kata Sandi:"}.
{"Password","Sandi"}.
{"Password Verification:","Verifikasi Kata Sandi:"}.
{"Password Verification","Verifikasi Sandi"}.
{"Path to Dir","Jalur ke Dir"}.
{"Path to File","Jalur ke File"}.
{"Pending","Tertunda"}.
@@ -206,15 +197,12 @@
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Harap dicatat bahwa pilihan ini hanya akan membuat cadangan builtin Mnesia database. Jika Anda menggunakan modul ODBC, anda juga perlu untuk membuat cadangan database SQL Anda secara terpisah."}.
{"Pong","Pong"}.
{"Port","Port"}.
{"private, ","pribadi, "}.
{"Protocol","Protocol"}.
{"Publish-Subscribe","Setujui-Pertemanan"}.
{"PubSub subscriber request","Permintaan pertemanan PubSub"}.
{"Queries to the conference members are not allowed in this room","Permintaan untuk para anggota konferensi tidak diperbolehkan di ruangan ini"}.
{"RAM and disc copy","RAM dan disc salinan"}.
{"RAM copy","Salinan RAM"}.
{"Raw","mentah"}.
{"Really delete message of the day?","Benar-benar ingin menghapus pesan harian?"}.
{"Recipient is not in the conference room","Penerima tidak berada di ruangan konferensi"}.
{"Register a Jabber account","Daftarkan sebuah akun jabber"}.
@@ -223,37 +211,35 @@
{"Register","Mendaftar"}.
{"Remote copy","Salinan Remote"}.
{"Remove All Offline Messages","Hapus Semua Pesan Offline"}.
{"Remove User","Hapus Pengguna"}.
{"Remove","Menghapus"}.
{"Remove User","Hapus Pengguna"}.
{"Replaced by new connection","Diganti dengan koneksi baru"}.
{"Resources","Sumber daya"}.
{"Restart Service","Restart Layanan"}.
{"Restart","Jalankan Ulang"}.
{"Restart Service","Restart Layanan"}.
{"Restore Backup from File at ","Kembalikan Backup dari File pada"}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Mengembalikan cadangan yang berpasanagn setelah ejabberd berikutnya dijalankan ulang (memerlukan memori lebih sedikit):"}.
{"Restore binary backup immediately:","Segera mengembalikan cadangan yang berpasangan:"}.
{"Restore plain text backup immediately:","Segera mengembalikan cadangan teks biasa:"}.
{"Restore","Mengembalikan"}.
{"Restore plain text backup immediately:","Segera mengembalikan cadangan teks biasa:"}.
{"Room Configuration","Konfigurasi Ruangan"}.
{"Room creation is denied by service policy","Pembuatan Ruangan ditolak oleh kebijakan layanan"}.
{"Room description","Keterangan ruangan"}.
{"Room Occupants","Penghuni Ruangan"}.
{"Room title","Nama Ruangan"}.
{"Roster","Kontak"}.
{"Roster of ","Kontak dari"}.
{"Roster size","Ukuran Daftar Kontak"}.
{"Roster","Kontak"}.
{"RPC Call Error","Panggilan Kesalahan RPC"}.
{"Running Nodes","Menjalankan Node"}.
{"~s access rule configuration","~s aturan akses konfigurasi"}.
{"~s invites you to the room ~s","~s mengundang anda ke ruangan ~s"}.
{"Saturday","Sabtu"}.
{"Script check","Periksa naskah"}.
{"Search Results for ","Hasil Pencarian untuk"}.
{"Search users in ","Pencarian pengguna dalam"}.
{"Send announcement to all online users on all hosts","Kirim pengumuman untuk semua pengguna yang online pada semua host"}.
{"Send announcement to all online users","Kirim pengumuman untuk semua pengguna yang online"}.
{"Send announcement to all users on all hosts","Kirim pengumuman untuk semua pengguna pada semua host"}.
{"Send announcement to all online users on all hosts","Kirim pengumuman untuk semua pengguna yang online pada semua host"}.
{"Send announcement to all users","Kirim pengumuman untuk semua pengguna"}.
{"Send announcement to all users on all hosts","Kirim pengumuman untuk semua pengguna pada semua host"}.
{"September","September"}.
{"Server:","Layanan:"}.
{"Set message of the day and send to online users","Mengatur pesan harian dan mengirimkan ke pengguna yang online"}.
@@ -262,16 +248,16 @@
{"Show Integral Table","Tampilkan Tabel Terpisah"}.
{"Show Ordinary Table","Tampilkan Tabel Normal"}.
{"Shut Down Service","Shut Down Layanan"}.
{"~s invites you to the room ~s","~s mengundang anda ke ruangan ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Beberapa klien Jabber dapat menyimpan password di komputer Anda. Gunakan fitur itu hanya jika Anda mempercayai komputer Anda aman."}.
{"~s's Offline Messages Queue","Antrian Pesan Offline ~s"}.
{"Start Modules at ","Mulai Modul pada"}.
{"Start Modules","Memulai Modul"}.
{"Start","Mulai"}.
{"Statistics of ~p","statistik dari ~p"}.
{"Statistics","Statistik"}.
{"Stop","Hentikan"}.
{"Stop Modules at ","Hentikan Modul pada"}.
{"Stop Modules","Hentikan Modul"}.
{"Stop","Hentikan"}.
{"Stopped Nodes","Menghentikan node"}.
{"Storage Type","Jenis Penyimpanan"}.
{"Store binary backup:","Penyimpanan cadangan yang berpasangan:"}.
@@ -285,8 +271,8 @@
{"That nickname is registered by another person","Julukan tersebut telah didaftarkan oleh orang lain"}.
{"The CAPTCHA is valid.","Captcha ini benar."}.
{"The CAPTCHA verification has failed","Verifikasi CAPTCHA telah gagal"}.
{"The password is too weak","Kata sandi terlalu lemah"}.
{"the password is","kata sandi yaitu:"}.
{"The password is too weak","Kata sandi terlalu lemah"}.
{"The password of your Jabber account was successfully changed.","Kata sandi pada akun Jabber Anda telah berhasil diubah."}.
{"There was an error changing the password: ","Ada kesalahan dalam mengubah password:"}.
{"There was an error creating the account: ","Ada kesalahan saat membuat akun:"}.
@@ -298,8 +284,8 @@
{"Thursday","Kamis"}.
{"Time delay","Waktu tunda"}.
{"Time","Waktu"}.
{"To ~s","Kepada ~s"}.
{"To","Kepada"}.
{"To ~s","Kepada ~s"}.
{"Traffic rate limit is exceeded","Lalu lintas melebihi batas"}.
{"Transactions Aborted:","Transaksi yang dibatalkan:"}.
{"Transactions Committed:","Transaksi yang dilakukan:"}.
@@ -310,11 +296,11 @@
{"Unauthorized","Ditolak"}.
{"Unregister a Jabber account","Nonaktifkan akun jabber"}.
{"Unregister","Nonaktifkan"}.
{"Update","Memperbarui"}.
{"Update message of the day (don't send)","Rubah pesan harian (tidak dikirim)"}.
{"Update message of the day on all hosts (don't send)","Rubah pesan harian pada semua host (tidak dikirim)"}.
{"Update plan","Rencana Perubahan"}.
{"Update script","Perbarui naskah"}.
{"Update","Memperbarui"}.
{"Uptime:","Sampai saat:"}.
{"User Management","Manajemen Pengguna"}.
{"Username:","Nama Pengguna:"}.
@@ -338,4 +324,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Kontak offline Anda pada antrian pesan sudah penuh. Pesan telah dibuang."}.
{"Your Jabber account was successfully created.","Jabber akun Anda telah sukses dibuat"}.
{"Your Jabber account was successfully deleted.","Jabber akun Anda berhasil dihapus."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Pesan Anda untuk ~s sedang diblokir. Untuk membuka blokir tersebut, kunjungi ~s"}.
+775 -657
View File
File diff suppressed because it is too large Load Diff
+28 -43
View File
@@ -1,20 +1,13 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," ha modificato l'oggetto in: "}.
{"A password is required to enter this room","Per entrare in questa stanza è prevista una password"}.
{"Access Configuration","Configurazione dell'accesso"}.
{"Access Control List Configuration","Configurazione dei diritti di accesso (ACL)"}.
{"Access Control Lists","Diritti di accesso (ACL)"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Accesso impedito dalle politiche del servizio"}.
{"Access Rules","Regole di accesso"}.
{"Action on user","Azione sull'utente"}.
{"Add Jabber ID","Aggiungere un Jabber ID (Jabber ID)"}.
{"Add New","Aggiungere nuovo"}.
{"Add User","Aggiungere un utente"}.
{"Administration of ","Amministrazione di "}.
{"Administration","Amministrazione"}.
{"Administration of ","Amministrazione di "}.
{"Administrator privileges required","Necessari i privilegi di amministratore"}.
{"All activity","Tutta l'attività"}.
{"All Users","Tutti gli utenti"}.
{"Allow users to change the 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"}.
@@ -22,12 +15,14 @@
{"Allow visitors to change nickname","Consentire ai visitatori di cambiare il nickname"}.
{"Allow visitors to send private messages to","Consentire agli ospiti l'invio di messaggi privati a"}.
{"Allow visitors to send status text in presence updates","Consentire ai visitatori l'invio di testo sullo stato in aggiornamenti sulla presenza"}.
{"All Users","Tutti gli utenti"}.
{"Announcements","Annunci"}.
{"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"}.
{"Backup to File at ","Salvataggio sul file "}.
{"Backup","Salvare"}.
{"Backup to File at ","Salvataggio sul file "}.
{"Bad format","Formato non valido"}.
{"Birthday","Compleanno"}.
{"CAPTCHA web page","Pagina web CAPTCHA"}.
@@ -47,17 +42,17 @@
{"City","Città"}.
{"Commands","Comandi"}.
{"Conference room does not exist","La stanza per conferenze non esiste"}.
{"Configuration of room ~s","Configurazione per la stanza ~s"}.
{"Configuration","Configurazione"}.
{"Configuration of room ~s","Configurazione per la stanza ~s"}.
{"Connected Resources:","Risorse connesse:"}.
{"Country","Paese"}.
{"CPU Time:","Tempo CPU:"}.
{"Database Tables Configuration at ","Configurazione delle tabelle del database su "}.
{"Database","Database"}.
{"Database Tables Configuration at ","Configurazione delle tabelle del database su "}.
{"December","Dicembre"}.
{"Default users as participants","Definire per default gli utenti come partecipanti"}.
{"Delete message of the day on all hosts","Eliminare il messaggio del giorno (MOTD) su tutti gli host"}.
{"Delete message of the day","Eliminare il messaggio del giorno (MOTD)"}.
{"Delete message of the day on all hosts","Eliminare il messaggio del giorno (MOTD) su tutti gli host"}.
{"Delete Selected","Eliminare gli elementi selezionati"}.
{"Delete User","Eliminare l'utente"}.
{"Description:","Descrizione:"}.
@@ -91,10 +86,9 @@
{"Failed to extract JID from your voice request approval","Impossibile estrarre il JID dall'approvazione della richiesta di parola"}.
{"Family Name","Cognome"}.
{"February","Febbraio"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Riempire il modulo per la ricerca di utenti Jabber corrispondenti ai criteri (Aggiungere * alla fine del campo per la ricerca di una sottostringa"}.
{"Friday","Venerdì"}.
{"From ~s","Da ~s"}.
{"From","Da"}.
{"From ~s","Da ~s"}.
{"Full Name","Nome completo"}.
{"Get Number of Online Users","Ottenere il numero di utenti online"}.
{"Get Number of Registered Users","Ottenere il numero di utenti registrati"}.
@@ -104,10 +98,11 @@
{"Group ","Gruppo "}.
{"Groups","Gruppi"}.
{"has been banned","è stata/o bandita/o"}.
{"has been kicked because of a system shutdown","è stato espulso a causa dello spegnimento del sistema"}.
{"has been kicked because of an affiliation change","è stato espulso a causa di un cambiamento di appartenenza"}.
{"has been kicked because of a system shutdown","è stato espulso a causa dello spegnimento del sistema"}.
{"has been kicked because the room has been changed to members-only","è stato espulso per la limitazione della stanza ai soli membri"}.
{"has been kicked","è stata/o espulsa/o"}.
{" has set the subject to: "," ha modificato l'oggetto in: "}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Se qui non vedi l'immagine CAPTCHA, visita la pagina web."}.
{"Import Directory","Importare una directory"}.
@@ -121,11 +116,10 @@
{"Improper message type","Tipo di messaggio non corretto"}.
{"Incorrect password","Password non esatta"}.
{"IP addresses","Indirizzi IP"}.
{"IP","IP"}.
{"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"}.
{"It is not allowed to send private messages","Non è consentito l'invio di messaggi privati"}.
{"Jabber Account Registration","Registrazione account Jabber"}.
{"Jabber ID","Jabber ID (Jabber ID)"}.
{"January","Gennaio"}.
@@ -138,8 +132,6 @@
{"Last year","Ultimo anno"}.
{"leaves the room","esce dalla stanza"}.
{"List of modules to start","Elenco dei moduli da avviare"}.
{"Listened Ports at ","Porte in ascolto su "}.
{"Listened Ports","Porte in ascolto"}.
{"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"}.
@@ -159,20 +151,20 @@
{"Middle Name","Altro nome"}.
{"Moderator privileges required","Necessari i privilegi di moderatore"}.
{"Modified modules","Moduli modificati"}.
{"Module","Modulo"}.
{"Modules","Moduli"}.
{"Monday","Lunedì"}.
{"Name","Nome"}.
{"Name:","Nome:"}.
{"Never","Mai"}.
{"New Password:","Nuova password:"}.
{"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"}.
{"Nickname","Nickname"}.
{"No body provided for announce message","Nessun corpo fornito per il messaggio di annuncio"}.
{"No Data","Nessuna informazione"}.
{"Node not found","Nodo non trovato"}.
{"Nodes","Nodi"}.
{"No limit","Nessun limite"}.
{"None","Nessuno"}.
{"Not Found","Non trovato"}.
{"November","Novembre"}.
@@ -183,26 +175,25 @@
{"Offline Messages:","Messaggi offline:"}.
{"OK","OK"}.
{"Old Password:","Vecchia password:"}.
{"Online","Online"}.
{"Online Users:","Utenti connessi:"}.
{"Online Users","Utenti online"}.
{"Online","Online"}.
{"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 can approve voice requests","Soltanto i moderatori possono approvare richieste di parola"}.
{"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"}.
{"Options","Opzioni"}.
{"Organization Name","Nome dell'organizzazione"}.
{"Organization Unit","Unità dell'organizzazione"}.
{"Outgoing s2s Connections","Connessioni s2s in uscita"}.
{"Outgoing s2s Connections:","Connessioni s2s in uscita:"}.
{"Owner privileges required","Necessari i privilegi di proprietario"}.
{"Packet","Pacchetto"}.
{"Password Verification","Verifica della password"}.
{"Password Verification:","Verifica della password:"}.
{"Password","Password"}.
{"Password:","Password:"}.
{"Password Verification","Verifica della password"}.
{"Password Verification:","Verifica della password:"}.
{"Path to Dir","Percorso della directory"}.
{"Path to File","Percorso del file"}.
{"Pending","Pendente"}.
@@ -211,15 +202,12 @@
{"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."}.
{"Please, wait for a while before sending new voice request","Attendi qualche istante prima di inviare una nuova richiesta di parola"}.
{"Pong","Pong"}.
{"Port","Porta"}.
{"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"}.
{"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"}.
{"Register a Jabber account","Registra un account Jabber"}.
@@ -228,12 +216,12 @@
{"Register","Registra"}.
{"Remote copy","Copia remota"}.
{"Remove All Offline Messages","Eliminare tutti i messaggi offline"}.
{"Remove User","Eliminare l'utente"}.
{"Remove","Eliminare"}.
{"Remove User","Eliminare l'utente"}.
{"Replaced by new connection","Sostituito da una nuova connessione"}.
{"Resources","Risorse"}.
{"Restart Service","Riavviare il servizio"}.
{"Restart","Riavviare"}.
{"Restart Service","Riavviare il servizio"}.
{"Restore Backup from File at ","Recuperare il salvataggio dal file "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Recuperare un salvataggio binario dopo il prossimo riavvio di ejabberd (necessita di meno memoria):"}.
{"Restore binary backup immediately:","Recuperare un salvataggio binario adesso:"}.
@@ -244,21 +232,19 @@
{"Room description","Descrizione della stanza"}.
{"Room Occupants","Presenti nella stanza"}.
{"Room title","Titolo della stanza"}.
{"Roster","Lista dei contatti"}.
{"Roster of ","Lista dei contatti di "}.
{"Roster size","Dimensione della lista dei contatti"}.
{"Roster","Lista dei contatti"}.
{"RPC Call Error","Errore di chiamata RPC"}.
{"Running Nodes","Nodi attivi"}.
{"~s access rule configuration","Configurazione delle regole di accesso per ~s"}.
{"~s invites you to the room ~s","~s ti invita nella stanza ~s"}.
{"Saturday","Sabato"}.
{"Script check","Verifica dello script"}.
{"Search Results for ","Risultati della ricerca per "}.
{"Search users in ","Cercare utenti in "}.
{"Send announcement to all online users on all hosts","Inviare l'annuncio a tutti gli utenti online su tutti gli host"}.
{"Send announcement to all online users","Inviare l'annuncio a tutti gli utenti online"}.
{"Send announcement to all users on all hosts","Inviare l'annuncio a tutti gli utenti su tutti gli host"}.
{"Send announcement to all online users on all hosts","Inviare l'annuncio a tutti gli utenti online su tutti gli host"}.
{"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:","Server:"}.
{"Set message of the day and send to online users","Impostare il messaggio del giorno (MOTD) ed inviarlo agli utenti online"}.
@@ -267,16 +253,16 @@
{"Show Integral Table","Mostrare la tabella integrale"}.
{"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"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alcuni client Jabber possono conservare la password nel tuo computer. Utilizza tale funzione soltanto se ritieni che il tuo computer sia sicuro."}.
{"~s's Offline Messages Queue","Coda di ~s messaggi offline"}.
{"Start Modules at ","Avviare moduli su "}.
{"Start Modules","Avviare moduli"}.
{"Start","Avviare"}.
{"Statistics of ~p","Statistiche di ~p"}.
{"Statistics","Statistiche"}.
{"Stop Modules at ","Arrestare moduli su "}.
{"Stop Modules","Arrestare moduli"}.
{"Stop","Arrestare"}.
{"Stop Modules","Arrestare moduli"}.
{"Stop Modules at ","Arrestare moduli su "}.
{"Stopped Nodes","Nodi arrestati"}.
{"Storage Type","Tipo di conservazione"}.
{"Store binary backup:","Conservare un salvataggio binario:"}.
@@ -290,8 +276,8 @@
{"That nickname is registered by another person","Questo nickname è registrato da un'altra persona"}.
{"The CAPTCHA is valid.","Il CAPTCHA è valido."}.
{"The CAPTCHA verification has failed","La verifica del CAPTCHA ha avuto esito negativo"}.
{"The password is too weak","La password è troppo debole"}.
{"the password is","la password è"}.
{"The password is too weak","La password è troppo debole"}.
{"The password of your Jabber account was successfully changed.","Il cambio di password del tuo account Jabber è andato a buon fine."}.
{"There was an error changing the password: ","Si è verificato un errore nel cambio di password: "}.
{"There was an error creating the account: ","Si è verificato un errore nella creazione dell'account: "}.
@@ -303,9 +289,9 @@
{"Thursday","Giovedì"}.
{"Time delay","Ritardo"}.
{"Time","Ora"}.
{"To ~s","A ~s"}.
{"To","A"}.
{"Too many CAPTCHA requests","Troppe richieste CAPTCHA"}.
{"To ~s","A ~s"}.
{"Traffic rate limit is exceeded","Limite di traffico superato"}.
{"Transactions Aborted:","Transazioni abortite:"}.
{"Transactions Committed:","Transazioni avvenute:"}.
@@ -316,11 +302,11 @@
{"Unauthorized","Non autorizzato"}.
{"Unregister a Jabber account","Elimina un account Jabber"}.
{"Unregister","Elimina"}.
{"Update","Aggiornare"}.
{"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"}.
{"Update script","Script di aggiornamento"}.
{"Update","Aggiornare"}.
{"Uptime:","Tempo dall'avvio:"}.
{"User Management","Gestione degli utenti"}.
{"Username:","Nome utente:"}.
@@ -346,4 +332,3 @@
{"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 Jabber account was successfully created.","La creazione del tuo account Jabber è andata a buon fine."}.
{"Your Jabber account was successfully deleted.","La cancellazione del tuo account Jabber è andata a buon fine."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","I messaggi verso ~s sono bloccati. Per sbloccarli, visitare ~s"}.
+775 -657
View File
File diff suppressed because it is too large Load Diff
+11 -26
View File
@@ -1,12 +1,6 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," は件名を設定しました: "}.
{"A password is required to enter this room","このチャットルームに入るにはパスワードが必要です"}.
%% -*- coding: utf-8 -*-
{"Accept","許可"}.
{"Access Configuration","アクセス設定"}.
{"Access Control List Configuration","アクセスコントロールリスト設定"}.
{"Access Control Lists","アクセスコントロールリスト"}.
{"Access denied by service policy","サービスポリシーによってアクセスが禁止されました"}.
{"Access Rules","アクセスルール"}.
{"Action on user","ユーザー操作"}.
{"Add Jabber ID","Jabber ID を追加"}.
{"Add New","新規追加"}.
@@ -15,7 +9,6 @@
{"Administration","管理"}.
{"Administrator privileges required","管理者権限が必要です"}.
{"All activity","すべて"}.
{"All Users","全ユーザー"}.
{"Allow users to change the subject","ユーザーによる件名の変更を許可"}.
{"Allow users to query other users","ユーザーによる他のユーザーへのクエリーを許可"}.
{"Allow users to send invites","ユーザーによる招待を許可"}.
@@ -23,7 +16,9 @@
{"Allow visitors to change nickname","傍聴者のニックネームの変更を許可"}.
{"Allow visitors to send private messages to","傍聴者によるプライベートメッセージの送信を次の相手に許可"}.
{"Allow visitors to send status text in presence updates","傍聴者によるプレゼンス更新のステータス文の送信を許可"}.
{"All Users","全ユーザー"}.
{"Announcements","アナウンス"}.
{"A password is required to enter this room","このチャットルームに入るにはパスワードが必要です"}.
{"April","4月"}.
{"August","8月"}.
{"Backup Management","バックアップ管理"}.
@@ -96,7 +91,6 @@
{"Failed to extract JID from your voice request approval","発言権要求の承認から JID を取り出すことに失敗しました"}.
{"Family Name","姓"}.
{"February","2月"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","項目を入力してユーザーを検索を行えます (* を使用すると部分文字列にマッチします)"}.
{"Friday","金曜日"}.
{"From ~s","From ~s"}.
{"From","差出人"}.
@@ -106,13 +100,14 @@
{"Get User Last Login Time","最終ログイン時間を取得"}.
{"Get User Password","パスワードを取得"}.
{"Get User Statistics","ユーザー統計を取得"}.
{"Group ","グループ"}.
{"Groups","グループ"}.
{"Group ","グループ"}.
{"has been banned","はバンされました"}.
{"has been kicked because of a system shutdown","はシステムシャットダウンのためキックされました"}.
{"has been kicked because of an affiliation change","は分掌が変更されたためキックされました"}.
{"has been kicked because of a system shutdown","はシステムシャットダウンのためキックされました"}.
{"has been kicked because the room has been changed to members-only","はチャットルームがメンバー制に変更されたためキックされました"}.
{"has been kicked","はキックされました"}.
{" has set the subject to: "," は件名を設定しました: "}.
{"Host","ホスト"}.
{"If you don't see the CAPTCHA image here, visit the web page.","ここに CAPTCHA 画像が表示されない場合、ウェブページを参照してください。"}.
{"Import Directory","ディレクトリインポート"}.
@@ -127,7 +122,6 @@
{"Incoming s2s Connections:","内向き s2s コネクション:"}.
{"Incorrect password","パスワードが違います"}.
{"IP addresses","IP アドレス"}.
{"IP","IP"}.
{"is now known as","は名前を変更しました: "}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","このルームにエラーメッセージを送ることは許可されていません。参加者(~s)はエラーメッセージを(~s)を送信してルームからキックされました。"}.
{"It is not allowed to send private messages of type \"groupchat\"","種別が\"groupchat\" であるプライベートメッセージを送信することはできません"}.
@@ -146,8 +140,6 @@
{"leaves the room","がチャットルームから退出しました"}.
{"List of modules to start","起動モジュールの一覧"}.
{"List of rooms","チャットルームの一覧"}.
{"Listened Ports at ","Listen ポート "}.
{"Listened Ports","Listen ポート"}.
{"Low level update script","低レベル更新スクリプト"}.
{"Make participants list public","参加者一覧を公開"}.
{"Make room CAPTCHA protected","チャットルームを CAPTCHA で保護"}.
@@ -167,9 +159,7 @@
{"Middle Name","ミドルネーム"}.
{"Moderator privileges required","モデレーター権限が必要です"}.
{"Modified modules","更新されたモジュール"}.
{"Modules at ~p","モジュール ~p"}.
{"Modules","モジュール"}.
{"Module","モジュール"}.
{"Monday","月曜日"}.
{"Multicast","マルチキャスト"}.
{"Multi-User Chat","マルチユーザーチャット"}.
@@ -185,6 +175,7 @@
{"Node not found","ノードが見つかりません"}.
{"Node ~p","ノード ~p"}.
{"Nodes","ノード"}.
{"No limit","制限なし"}.
{"None","なし"}.
{"Not Found","見つかりません"}.
{"November","11月"}.
@@ -205,7 +196,6 @@
{"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 コネクション"}.
@@ -224,15 +214,12 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","これらのオプションは組み込みの Mnesia データーベースのバックアップのみを行うことに注意してください。もし ODBC モジュールを使用している場合は、SQL データーベースのバックアップを別に行う必要があります。"}.
{"Please, wait for a while before sending new voice request","新しい発言権の要求を送るまで少し間をおいてください"}.
{"Pong","Pong"}.
{"Port","ポート"}.
{"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"}.
{"Really delete message of the day?","本当にお知らせメッセージを削除しますか ?"}.
{"Recipient is not in the conference room","受信者はこの会議室にいません"}.
{"Register a Jabber account","Jabber アカウントを登録"}.
@@ -262,8 +249,6 @@
{"Roster","名簿"}.
{"RPC Call Error","RPC 呼び出しエラー"}.
{"Running Nodes","起動ノード"}.
{"~s access rule configuration","~s アクセスルール設定"}.
{"~s invites you to the room ~s","~s はあなたをチャットルーム ~s に招待しています"}.
{"Saturday","土曜日"}.
{"Script check","スクリプトチェック"}.
{"Search Results for ","検索結果: "}.
@@ -280,11 +265,11 @@
{"Show Integral Table","累積の表を表示"}.
{"Show Ordinary Table","通常の表を表示"}.
{"Shut Down Service","サービスを停止"}.
{"~s invites you to the room ~s","~s はあなたをチャットルーム ~s に招待しています"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Jabber クライアントはコンピューターにパスワードを記憶できます。コンピューターが安全であると信頼できる場合にのみ、この機能を使用してください。"}.
{"~s's Offline Messages Queue","~s' のオフラインメッセージキュー"}.
{"Start Modules at ","モジュールを開始: "}.
{"Start Modules","モジュールを起動"}.
{"Start","開始"}.
{"Statistics of ~p","~p の統計"}.
{"Statistics","統計"}.
{"Stop Modules at ","モジュールを停止: "}.
@@ -316,9 +301,10 @@
{"Thursday","木曜日"}.
{"Time delay","遅延時間"}.
{"Time","時間"}.
{"To ~s","宛先 ~s"}.
{"Too many CAPTCHA requests","CAPTCHA 要求が多すぎます"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","~p回の認証に失敗しました。このIPアドレス(~s)は~s UTCまでブロックされます。"}.
{"Too many unacked stanzas","多くのスタンザが応答していません"}.
{"To ~s","宛先 ~s"}.
{"Total rooms","チャットルーム数"}.
{"To","To"}.
{"Traffic rate limit is exceeded","トラフィックレートの制限を超えました"}.
@@ -339,11 +325,11 @@
{"Update","更新"}.
{"Uptime:","起動時間:"}.
{"User Management","ユーザー管理"}.
{"User ~s","ユーザー ~s"}.
{"Username:","ユーザー名:"}.
{"Users are not allowed to register accounts so quickly","それほど速くアカウントを登録することはできません"}.
{"Users Last Activity","ユーザーの活動履歴"}.
{"Users","ユーザー"}.
{"User ~s","ユーザー ~s"}.
{"User","ユーザー"}.
{"Validate","検証"}.
{"vCard User Search","vCard検索"}.
@@ -363,4 +349,3 @@
{"Your contact offline message queue is full. The message has been discarded.","相手先のオフラインメッセージキューが一杯です。このメッセージは破棄されます。"}.
{"Your Jabber account was successfully created.","Jabber アカウントの作成に成功しました。"}.
{"Your Jabber account was successfully deleted.","Jabber アカウントの削除に成功しました。"}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","~s 宛のメッセージはブロックされています。解除するにはこちらを見てください ~s"}.
+775 -662
View File
File diff suppressed because it is too large Load Diff
+27 -42
View File
@@ -1,20 +1,13 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," veranderde het onderwerp in: "}.
{"A password is required to enter this room","U hebt een wachtwoord nodig om deze chatruimte te kunnen betreden"}.
{"Access Configuration","Toegangsinstellingen"}.
{"Access Control List Configuration","Instellingen van access control lists"}.
{"Access Control Lists","Access control lists"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","De toegang werd geweigerd door het beleid van deze dienst"}.
{"Access Rules","Access rules"}.
{"Action on user","Actie op gebruiker"}.
{"Add Jabber ID","Jabber ID toevoegen"}.
{"Add New","Toevoegen"}.
{"Add User","Gebruiker toevoegen"}.
{"Administration of ","Beheer van "}.
{"Administration","Beheer"}.
{"Administration of ","Beheer van "}.
{"Administrator privileges required","U hebt beheerdersprivileges nodig"}.
{"All activity","Alle activiteit"}.
{"All Users","Alle gebruikers"}.
{"Allow users to change the subject","Sta gebruikers toe het onderwerp te veranderen"}.
{"Allow users to query other users","Gebruikers mogen naar andere gebruikers verzoeken verzenden"}.
{"Allow users to send invites","Gebruikers mogen uitnodigingen verzenden"}.
@@ -22,13 +15,15 @@
{"Allow visitors to change nickname","Sta bezoekers toe hun naam te veranderen"}.
{"Allow visitors to send private messages to","Gebruikers mogen privéberichten verzenden aan"}.
{"Allow visitors to send status text in presence updates","Sta bezoekers toe hun statusbericht in te stellen"}.
{"All Users","Alle gebruikers"}.
{"Announcements","Mededelingen"}.
{"A password is required to enter this room","U hebt een wachtwoord nodig om deze chatruimte te kunnen betreden"}.
{"April","April"}.
{"August","Augustus"}.
{"Backup","Backup"}.
{"Backup Management","Backup"}.
{"Backup of ~p","Backup maken van ~p"}.
{"Backup to File at ","Binaire backup maken op "}.
{"Backup","Backup"}.
{"Bad format","Verkeerd formaat"}.
{"Birthday","Geboortedatum"}.
{"CAPTCHA web page","CAPTCHA webpagina."}.
@@ -48,18 +43,18 @@
{"City","Plaats"}.
{"Commands","Commando's"}.
{"Conference room does not exist","De chatruimte bestaat niet"}.
{"Configuration of room ~s","Instellingen van chatruimte ~s"}.
{"Configuration","Instellingen"}.
{"Configuration of room ~s","Instellingen van chatruimte ~s"}.
{"Connected Resources:","Verbonden bronnen:"}.
{"Country","Land"}.
{"CPU Time:","Processortijd:"}.
{"Database","Database"}.
{"Database Tables at ~p","Databasetabellen van ~p"}.
{"Database Tables Configuration at ","Instellingen van databasetabellen op "}.
{"Database","Database"}.
{"December","December"}.
{"Default users as participants","Gebruikers standaard instellen als deelnemers"}.
{"Delete message of the day on all hosts","Verwijder bericht-van-de-dag op alle hosts"}.
{"Delete message of the day","Bericht van de dag verwijderen"}.
{"Delete message of the day on all hosts","Verwijder bericht-van-de-dag op alle hosts"}.
{"Delete Selected","Geselecteerde verwijderen"}.
{"Delete User","Verwijder Gebruiker"}.
{"Description:","Beschrijving:"}.
@@ -95,7 +90,6 @@
{"Failed to extract JID from your voice request approval","Er kon geen JID worden ontleend uit deze stemaanvraag"}.
{"Family Name","Achternaam"}.
{"February","Februari"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Gebruik de velden om te zoeken (Voeg achteraan het teken * toe om te zoeken naar alles wat met het eerste deel begint.)."}.
{"Friday","Vrijdag"}.
{"From ~s","Van ~s"}.
{"From","Van"}.
@@ -108,10 +102,11 @@
{"Group ","Groep "}.
{"Groups","Groepen"}.
{"has been banned","is verbannen"}.
{"has been kicked because of a system shutdown","is weggestuurd omdat het systeem gestopt wordt"}.
{"has been kicked because of an affiliation change","is weggestuurd vanwege een affiliatieverandering"}.
{"has been kicked because of a system shutdown","is weggestuurd omdat het systeem gestopt wordt"}.
{"has been kicked because the room has been changed to members-only","is weggestuurd omdat de chatruimte vanaf heden alleen toegankelijk is voor leden"}.
{"has been kicked","is weggestuurd"}.
{" has set the subject to: "," veranderde het onderwerp in: "}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Als U het CAPTCHA-plaatje niet ziet, bezoek dan de webpagina."}.
{"Import Directory","Directory importeren"}.
@@ -125,11 +120,10 @@
{"Improper message type","Onjuist berichttype"}.
{"Incorrect password","Foutief wachtwoord"}.
{"IP addresses","IP-adres"}.
{"IP","IP"}.
{"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"}.
{"It is not allowed to send private messages","Het is niet toegestaan priveberichten te sturen"}.
{"Jabber Account Registration","Jabber-account registratie"}.
{"Jabber ID","Jabber ID"}.
{"January","Januari"}.
@@ -143,8 +137,6 @@
{"leaves the room","verliet de chatruimte"}.
{"List of modules to start","Lijst met op te starten modules"}.
{"List of rooms","Lijst van groepsgesprekken"}.
{"Listened Ports at ","Openstaande poorten op "}.
{"Listened Ports","Openstaande poorten"}.
{"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"}.
@@ -164,8 +156,6 @@
{"Middle Name","Tussennaam"}.
{"Moderator privileges required","U hebt moderatorprivileges nodig"}.
{"Modified modules","Gewijzigde modules"}.
{"Module","Module"}.
{"Modules at ~p","Modules op ~p"}.
{"Modules","Modules"}.
{"Monday","Maandag"}.
{"Multicast","Multicast"}.
@@ -174,14 +164,15 @@
{"Name:","Naam:"}.
{"Never","Nooit"}.
{"New Password:","Nieuw Wachtwoord:"}.
{"Nickname","Bijnaam"}.
{"Nickname Registration at ","Registratie van een bijnaam op "}.
{"Nickname ~s does not exist in the room","De bijnaam ~s bestaat niet in deze chatruimte"}.
{"Nickname","Bijnaam"}.
{"No body provided for announce message","De mededeling bevat geen bericht"}.
{"No Data","Geen gegevens"}.
{"Node not found","Node niet gevonden"}.
{"Node ~p","Node ~p"}.
{"Nodes","Nodes"}.
{"No limit","Geen limiet"}.
{"None","Geen"}.
{"Not Found","Niet gevonden"}.
{"November","November"}.
@@ -192,16 +183,15 @@
{"Offline Messages:","Offline berichten:"}.
{"OK","OK"}.
{"Old Password:","Oud Wachtwoord:"}.
{"Online","Online"}.
{"Online Users","Online gebruikers"}.
{"Online Users:","Online gebruikers:"}.
{"Online","Online"}.
{"Only moderators and participants are allowed to change the subject in this room","Alleen moderators en deelnemers mogen het onderwerp van deze chatruimte veranderen"}.
{"Only moderators are allowed to change the subject in this room","Alleen moderators mogen het onderwerp van deze chatruimte veranderen"}.
{"Only moderators can approve voice requests","Alleen moderators kunnen stemaanvragen goedkeuren"}.
{"Only occupants are allowed to send messages to the conference","Alleen aanwezigen mogen berichten naar de chatruimte verzenden"}.
{"Only occupants are allowed to send queries to the conference","Alleen aanwezigen mogen verzoeken verzenden naar de chatruimte"}.
{"Only service administrators are allowed to send service messages","Alleen beheerders van deze dienst mogen mededelingen verzenden naar alle chatruimtes"}.
{"Options","Opties"}.
{"Organization Name","Organisatie"}.
{"Organization Unit","Afdeling"}.
{"Outgoing s2s Connections","Uitgaande s2s-verbindingen"}.
@@ -220,15 +210,12 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Merk op dat volgende opties enkel backups maken van de ingebouwde database Mnesia. Als U de ODBC module gebruikt dan moeten daarvan afzonderlijke backups gemaakt worden."}.
{"Please, wait for a while before sending new voice request","Wacht s.v.p. met het maken van een nieuwe stemaanvraag."}.
{"Pong","Pong"}.
{"Port","Poort"}.
{"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"}.
{"Really delete message of the day?","Wilt u het bericht van de dag verwijderen?"}.
{"Recipient is not in the conference room","De ontvanger is niet in de chatruimte"}.
{"Register a Jabber account","Registreer een Jabber-account"}.
@@ -241,33 +228,31 @@
{"Remove","Verwijderen"}.
{"Replaced by new connection","Vervangen door een nieuwe verbinding"}.
{"Resources","Bronnen"}.
{"Restart Service","Herstart Service"}.
{"Restart","Herstarten"}.
{"Restart Service","Herstart Service"}.
{"Restore Backup from File at ","Binaire backup direct herstellen op "}.
{"Restore","Binaire backup direct herstellen"}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Binaire backup herstellen na herstart van ejabberd (vereist minder geheugen):"}.
{"Restore binary backup immediately:","Binaire backup direct herstellen:"}.
{"Restore plain text backup immediately:","Backup in een tekstbestand direct herstellen:"}.
{"Restore","Binaire backup 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 of ","Roster van "}.
{"Roster size","Contactlijst Groote"}.
{"Roster","Roster"}.
{"Roster size","Contactlijst Groote"}.
{"RPC Call Error","RPC-oproepfout"}.
{"Running Nodes","Draaiende nodes"}.
{"~s access rule configuration","Access rules op ~s"}.
{"~s invites you to the room ~s","~s nodigt je uit voor het groepsgesprek ~s"}.
{"Saturday","Zaterdag"}.
{"Script check","Controle van script"}.
{"Search Results for ","Zoekresultaten voor "}.
{"Search users in ","Gebruikers zoeken in "}.
{"Send announcement to all online users on all hosts","Mededeling verzenden naar alle online gebruikers op alle virtuele hosts"}.
{"Send announcement to all online users","Mededeling verzenden naar alle online gebruikers"}.
{"Send announcement to all users on all hosts","Stuur aankondiging aan alle gebruikers op alle hosts"}.
{"Send announcement to all online users on all hosts","Mededeling verzenden naar alle online gebruikers op alle virtuele hosts"}.
{"Send announcement to all users","Mededeling verzenden naar alle gebruikers"}.
{"Send announcement to all users on all hosts","Stuur aankondiging aan alle gebruikers op alle hosts"}.
{"September","September"}.
{"Server:","Server:"}.
{"Set message of the day and send to online users","Bericht van de dag instellen en verzenden naar online gebruikers"}.
@@ -276,11 +261,11 @@
{"Show Integral Table","Volledige tabel laten zien"}.
{"Show Ordinary Table","Deel van tabel laten zien"}.
{"Shut Down Service","Stop Service"}.
{"~s invites you to the room ~s","~s nodigt je uit voor het groepsgesprek ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Sommige Jabber-clienten kunnen het wachtwoord opslaan op Uw computer. Gebruik deze mogelijkheid alleen als U vertrouwd dat Uw computer afdoende beveiligd is."}.
{"~s's Offline Messages Queue","offline berichten van ~s"}.
{"Start Modules at ","Modules starten op "}.
{"Start Modules","Modules starten"}.
{"Start","Starten"}.
{"Statistics of ~p","Statistieken van ~p"}.
{"Statistics","Statistieken"}.
{"Stop Modules at ","Modules stoppen op "}.
@@ -299,8 +284,8 @@
{"That nickname is registered by another person","Deze bijnaam is al geregistreerd door iemand anders"}.
{"The CAPTCHA is valid.","De geautomatiseerde Turing-test is geslaagd."}.
{"The CAPTCHA verification has failed","De CAPTCHA-verificatie is mislukt"}.
{"The password is too weak","Het wachtwoord is te zwak"}.
{"the password is","het wachtwoord is"}.
{"The password is too weak","Het wachtwoord is te zwak"}.
{"The password of your Jabber account was successfully changed.","Het wachtwoord van Uw Jabber-account is succesvol veranderd."}.
{"There was an error changing the password: ","Er was een fout bij het veranderen van het wachtwoord:"}.
{"There was an error creating the account: ","Er was een fout bij het creeern van de account:"}.
@@ -312,10 +297,11 @@
{"Thursday","Donderdag"}.
{"Time delay","Vertraging"}.
{"Time","Tijd"}.
{"To ~s","Naar ~s"}.
{"To","Aan"}.
{"Too many CAPTCHA requests","Te veel CAPTCHA-aanvragen"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Te veel (~p) mislukte authenticatie-pogingen van dit IP-adres (~s). Dit adres zal worden gedeblokkeerd om ~s UTC"}.
{"Too many unacked stanzas","Te veel niet-bevestigde stanzas"}.
{"To ~s","Naar ~s"}.
{"Total rooms","Aantal groepsgesprekken"}.
{"Traffic rate limit is exceeded","Dataverkeerslimiet overschreden"}.
{"Transactions Aborted:","Afgebroken transacties:"}.
@@ -327,20 +313,20 @@
{"Unauthorized","Niet geautoriseerd"}.
{"Unregister a Jabber account","Opheffen van Jabber-account"}.
{"Unregister","Opheffen"}.
{"Update","Bijwerken"}.
{"Update message of the day (don't send)","Bericht van de dag bijwerken (niet verzenden)"}.
{"Update message of the day on all hosts (don't send)","Verander bericht-van-de-dag op alle hosts (niet versturen)"}.
{"Update plan","Plan voor de opwaardering"}.
{"Update ~p","Opwaarderen van ~p"}.
{"Update script","Script voor de opwaardering"}.
{"Update","Bijwerken"}.
{"Uptime:","Uptime:"}.
{"User Management","Gebruikersbeheer"}.
{"User ~s","Gebruiker ~s"}.
{"User","Gebruiker"}.
{"User Management","Gebruikersbeheer"}.
{"Username:","Gebruikersnaam:"}.
{"Users are not allowed to register accounts so quickly","Het is gebruikers niet toegestaan zo snel achter elkaar te registreren"}.
{"Users Last Activity","Laatste activiteit van gebruikers"}.
{"User ~s","Gebruiker ~s"}.
{"Users","Gebruikers"}.
{"Users Last Activity","Laatste activiteit van gebruikers"}.
{"Validate","Bevestigen"}.
{"vCard User Search","Gebruikers zoeken"}.
{"Virtual Hosts","Virtuele hosts"}.
@@ -359,4 +345,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Te veel offline berichten voor dit contactpersoon. Het bericht is niet opgeslagen."}.
{"Your Jabber account was successfully created.","Uw Jabber-account is succesvol gecreeerd."}.
{"Your Jabber account was successfully deleted.","Uw Jabber-account is succesvol verwijderd."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Uw berichten aan ~s worden geblokkeerd. Om ze te deblokkeren, ga naar ~s"}.
+780 -663
View File
File diff suppressed because it is too large Load Diff
+25 -40
View File
@@ -1,20 +1,13 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," har satt emnet til: "}.
{"A password is required to enter this room","Et passord kreves for tilgang til samtalerommet"}.
{"Access Configuration","Tilgangskonfigurasjon"}.
{"Access Control List Configuration","Konfigurasjon for Tilgangskontroll lister"}.
{"Access Control Lists","Tilgangskontrollister"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Tilgang nektes på grunn av en tjeneste regel"}.
{"Access Rules","Tilgangsregler"}.
{"Action on user","Handling på bruker"}.
{"Add Jabber ID","Legg til Jabber ID"}.
{"Add New","Legg til ny"}.
{"Add User","Legg til Bruker"}.
{"Administration of ","Administrasjon av "}.
{"Administration","Administrasjon"}.
{"Administration of ","Administrasjon av "}.
{"Administrator privileges required","Administratorprivilegier kreves"}.
{"All activity","All aktivitet"}.
{"All Users","Alle Brukere"}.
{"Allow users to change the subject","Tillat brukere å endre emne"}.
{"Allow users to query other users","Tillat brukere å sende forespørsel til andre brukere"}.
{"Allow users to send invites","Tillat brukere å sende invitasjoner"}.
@@ -22,12 +15,14 @@
{"Allow visitors to change nickname","Tillat besøkende å endre kallenavn"}.
{"Allow visitors to send private messages to","Tillat brukere å sende private meldinger til"}.
{"Allow visitors to send status text in presence updates","Tillat besøkende å sende status tekst i "}.
{"All Users","Alle Brukere"}.
{"Announcements","Kunngjøringer"}.
{"A password is required to enter this room","Et passord kreves for tilgang til samtalerommet"}.
{"April","april"}.
{"August","august"}.
{"Backup Management","Håndtere Sikkerehetskopiering"}.
{"Backup to File at ","Sikkerhetskopiere til Fil på "}.
{"Backup","Sikkerhetskopier"}.
{"Backup to File at ","Sikkerhetskopiere til Fil på "}.
{"Bad format","Feil format"}.
{"Birthday","Fødselsdag"}.
{"CAPTCHA web page","CAPTCHA web side"}.
@@ -47,13 +42,13 @@
{"City","By"}.
{"Commands","Kommandoer"}.
{"Conference room does not exist","Konferanserommet finnes ikke"}.
{"Configuration of room ~s","Konfigurasjon for rom ~s"}.
{"Configuration","Konfigurasjon"}.
{"Configuration of room ~s","Konfigurasjon for rom ~s"}.
{"Connected Resources:","Tilkoblede Ressurser:"}.
{"Country","Land"}.
{"CPU Time:","CPU Tid:"}.
{"Database Tables Configuration at ","Database Tabell Konfigurasjon på "}.
{"Database","Database"}.
{"Database Tables Configuration at ","Database Tabell Konfigurasjon på "}.
{"December","desember"}.
{"Default users as participants","Standard brukere som deltakere"}.
{"Delete message of the day on all hosts","Slett melding for dagen på alle maskiner"}.
@@ -91,10 +86,9 @@
{"Failed to extract JID from your voice request approval","Feilet i forsøk på å hente JID fra din lyd forespørsel godkjenning"}.
{"Family Name","Etternavn"}.
{"February","februar"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Fyll inn skjemaet for å søke etter Jabber bruker (Legg til * på slutten av feltet for å treffe alle som starter slik)"}.
{"Friday","fredag"}.
{"From ~s","Fra ~s"}.
{"From","Fra"}.
{"From ~s","Fra ~s"}.
{"Full Name","Fullstendig Navn"}.
{"Get Number of Online Users","Vis Antall Tilkoblede Brukere"}.
{"Get Number of Registered Users","Vis Antall Registrerte Brukere"}.
@@ -104,10 +98,11 @@
{"Group ","Gruppe "}.
{"Groups","Grupper"}.
{"has been banned","har blitt bannlyst"}.
{"has been kicked because of a system shutdown","har blitt kastet ut på grunn av at systemet avslutter"}.
{"has been kicked because of an affiliation change","har blitt kastet ut på grunn av en tilknytnings endring"}.
{"has been kicked because of a system shutdown","har blitt kastet ut på grunn av at systemet avslutter"}.
{"has been kicked because the room has been changed to members-only","har blitt kastet ut på grunn av at rommet er endret til kun-for-medlemmer"}.
{"has been kicked","har blitt kastet ut"}.
{" has set the subject to: "," har satt emnet til: "}.
{"Host","Maskin"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Dersom du ikke ser CAPTCHA bilde her, besøk web siden. "}.
{"Import Directory","Importer Katalog"}.
@@ -121,11 +116,10 @@
{"Improper message type","Feilaktig meldingstype"}.
{"Incorrect password","Feil passord"}.
{"IP addresses","IP adresser"}.
{"IP","IP"}.
{"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","Det er ikke tillatt å sende private meldinger"}.
{"Jabber Account Registration","Jabber Konto Registrering"}.
{"Jabber ID","Jabber ID"}.
{"January","januar"}.
@@ -138,8 +132,6 @@
{"Last year","Siste året"}.
{"leaves the room","forlater rommet"}.
{"List of modules to start","Liste over moduler som skal startes"}.
{"Listened Ports at ","Lyttende Porter på "}.
{"Listened Ports","Lyttende Porter"}.
{"Low level update script","Lavnivå oppdaterings skript"}.
{"Make participants list public","Gjør deltakerlisten offentlig"}.
{"Make room CAPTCHA protected","Gjør rommet CAPTCHA beskyttet"}.
@@ -159,20 +151,20 @@
{"Middle Name","Mellomnavn"}.
{"Moderator privileges required","Redaktørprivilegier kreves"}.
{"Modified modules","Endrede moduler"}.
{"Module","Modul"}.
{"Modules","Moduler"}.
{"Monday","mandag"}.
{"Name","Navn"}.
{"Name:","Navn:"}.
{"Never","Aldri"}.
{"New Password:","Nytt Passord:"}.
{"Nickname","Kallenavn"}.
{"Nickname Registration at ","Registrer Kallenavn på "}.
{"Nickname ~s does not exist in the room","Kallenavn ~s eksisterer ikke i dette rommet"}.
{"Nickname","Kallenavn"}.
{"No body provided for announce message","Ingen meldingskropp gitt for kunngjørings melding"}.
{"No Data","Ingen Data"}.
{"Node not found","Noden finnes ikke"}.
{"Nodes","Noder"}.
{"No limit","Ingen grense"}.
{"None","Ingen"}.
{"Not Found","Finnes Ikke"}.
{"November","november"}.
@@ -183,26 +175,25 @@
{"Offline Messages:","Frakoblede Meldinger:"}.
{"OK","OK"}.
{"Old Password:","Gammelt Passord:"}.
{"Online","Tilkoblet"}.
{"Online Users","Tilkoblede Brukere"}.
{"Online Users:","Tilkoblede Brukere:"}.
{"Online","Tilkoblet"}.
{"Only moderators and participants are allowed to change the subject in this room","Bare redaktører og deltakere kan endre emnet i dette rommet"}.
{"Only moderators are allowed to change the subject in this room","Bare ordstyrer tillates å endre emnet i dette rommet"}.
{"Only moderators can approve voice requests","Bare ordstyrer kan godkjenne lyd forespørsler"}.
{"Only occupants are allowed to send messages to the conference","Bare deltakere får sende normale meldinger til konferansen"}.
{"Only occupants are allowed to send queries to the conference","Bare deltakere er tillatt å sende forespørsler til "}.
{"Only service administrators are allowed to send service messages","Bare tjeneste administratorer er tilatt å sende tjeneste "}.
{"Options","Alternativer"}.
{"Organization Name","Organisasjonsnavn"}.
{"Organization Unit","Organisasjonsenhet"}.
{"Outgoing s2s Connections","Utgående s2s Koblinger"}.
{"Outgoing s2s Connections:","Utgående s2s Koblinger"}.
{"Owner privileges required","Eierprivilegier kreves"}.
{"Packet","Pakke"}.
{"Password Verification","Passord Bekreftelse"}.
{"Password Verification:","Passord Bekreftelse:"}.
{"Password","Passord"}.
{"Password:","Passord:"}.
{"Password Verification","Passord Bekreftelse"}.
{"Password Verification:","Passord Bekreftelse:"}.
{"Path to Dir","Sti til Katalog"}.
{"Path to File","Sti til Fil"}.
{"Pending","Ventende"}.
@@ -211,15 +202,12 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Merk at disse valgene vil bare sikkerhetskopiere den innebygde Mnesia databasen. Dersom du bruker ODBC modulen må du også ta backup av din SQL database."}.
{"Please, wait for a while before sending new voice request","Vennligst vent en stund før du sender en ny lyd forespørsel"}.
{"Pong","Pong"}.
{"Port","Port"}.
{"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"}.
{"RAM and disc copy","RAM og diskkopi"}.
{"RAM copy","RAM kopi"}.
{"Raw","Rå"}.
{"Really delete message of the day?","Virkelig slette melding for dagen?"}.
{"Recipient is not in the conference room","Mottakeren er ikke i konferanserommet"}.
{"Register a Jabber account","Registrer en Jabber konto"}.
@@ -228,8 +216,8 @@
{"Register","Registrer"}.
{"Remote copy","Lagres ikke lokalt"}.
{"Remove All Offline Messages","Fjern Alle Frakoblede Meldinger"}.
{"Remove User","Fjern Bruker"}.
{"Remove","Fjern"}.
{"Remove User","Fjern Bruker"}.
{"Replaced by new connection","Erstattet av en ny tilkobling"}.
{"Resources","Ressurser"}.
{"Restart Service","Start Tjeneste på Nytt"}.
@@ -237,20 +225,18 @@
{"Restore Backup from File at ","Gjenopprett fra Sikkerhetsopifil på "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Gjenopprette binær backup etter neste ejabberd omstart (krever mindre minne):"}.
{"Restore binary backup immediately:","Gjenopprette binær backup umiddelbart:"}.
{"Restore plain text backup immediately:","Gjenopprette rentekst sikkerhetskopi umiddelbart:"}.
{"Restore","Gjenopprett"}.
{"Restore plain text backup immediately:","Gjenopprette rentekst sikkerhetskopi umiddelbart:"}.
{"Room Configuration","Rom Konfigurasjon"}.
{"Room creation is denied by service policy","Oppretting av rom nektes av en tjenste regel"}.
{"Room description","Rom beskrivelse"}.
{"Room Occupants","Samtalerom Deltakere"}.
{"Room title","Romtittel"}.
{"Roster","Kontaktliste"}.
{"Roster of ","Kontaktliste for "}.
{"Roster size","Kontaktliste størrelse"}.
{"Roster","Kontaktliste"}.
{"RPC Call Error","RPC Kall Feil"}.
{"Running Nodes","Kjørende Noder"}.
{"~s access rule configuration","tilgangsregel konfigurasjon for ~s"}.
{"~s invites you to the room ~s","~s inviterer deg til rommet ~s"}.
{"Saturday","lørdag"}.
{"Script check","Skript sjekk"}.
{"Search Results for ","Søke Resultater for "}.
@@ -267,11 +253,11 @@
{"Show Integral Table","Vis Integral Tabell"}.
{"Show Ordinary Table","Vis Ordinær Tabell"}.
{"Shut Down Service","Avslutt Tjeneste"}.
{"~s invites you to the room ~s","~s inviterer deg til rommet ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Noen Jabber klienter kan lagre passordet på datamaskinen. Bruk bare den funksjonen dersom du er sikker på at maskinen er trygg."}.
{"~s's Offline Messages Queue","~ss kø for Frakoblede Meldinger"}.
{"Start Modules at ","Start Moduler på "}.
{"Start Modules","Start Moduler"}.
{"Start","Start"}.
{"Statistics of ~p","Statistikk for ~p"}.
{"Statistics","Statistikk"}.
{"Stop Modules at ","Stopp Moduler på "}.
@@ -290,8 +276,8 @@
{"That nickname is registered by another person","Det kallenavnet er registrert av en annen person"}.
{"The CAPTCHA is valid.","Captchaen er ikke gyldig"}.
{"The CAPTCHA verification has failed","CAPTCHA godkjenningen har feilet"}.
{"The password is too weak","Passordet er for svakt"}.
{"the password is","passordet er"}.
{"The password is too weak","Passordet er for svakt"}.
{"The password of your Jabber account was successfully changed.","Passordet for din Jabber konto ble endret."}.
{"There was an error changing the password: ","En feil skjedde under endring av passordet:"}.
{"There was an error creating the account: ","En feil skjedde under oppretting av kontoen:"}.
@@ -303,8 +289,8 @@
{"Thursday","torsdag"}.
{"Time delay","Tids forsinkelse"}.
{"Time","Tid"}.
{"To ~s","Til ~s"}.
{"Too many CAPTCHA requests","For mange CAPTCHA forespørsler"}.
{"To ~s","Til ~s"}.
{"To","Til"}.
{"Traffic rate limit is exceeded","Trafikkmengde grense overskredet"}.
{"Transactions Aborted:","Avbrutte Transasksjoner:"}.
@@ -318,16 +304,16 @@
{"Unregister","Avregistrer"}.
{"Update message of the day (don't send)","Oppdater melding for dagen (ikke send)"}.
{"Update message of the day on all hosts (don't send)","Oppdater melding for dagen på alle maskiner (ikke send)"}.
{"Update","Oppdatere"}.
{"Update plan","Oppdaterings plan"}.
{"Update script","Oppdaterings skript"}.
{"Update","Oppdatere"}.
{"Uptime:","Oppetid:"}.
{"User Management","Bruker Behandling"}.
{"User","Bruker"}.
{"User Management","Bruker Behandling"}.
{"Username:","Brukernavn:"}.
{"Users are not allowed to register accounts so quickly","Brukere får ikke lov til registrere kontoer så fort"}.
{"Users Last Activity","Brukers Siste Aktivitet"}.
{"Users","Brukere"}.
{"Users Last Activity","Brukers Siste Aktivitet"}.
{"Validate","Bekrefte gyldighet"}.
{"vCard User Search","vCard Bruker Søk"}.
{"Virtual Hosts","Virtuella Maskiner"}.
@@ -346,4 +332,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Kontaktens frakoblede meldingskø er full. Meldingen har blitt kassert."}.
{"Your Jabber account was successfully created.","Din Jabber konto ble opprettet"}.
{"Your Jabber account was successfully deleted.","Dni Jabber konto er blitt sltettet."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Dine meldinger til ~s blir blokkert. For å åpne igjen, besøk ~s"}.
+775 -657
View File
File diff suppressed because it is too large Load Diff
+39 -58
View File
@@ -1,21 +1,14 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," zmienił temat na: "}.
{"A password is required to enter this room","Aby wejść do pokoju wymagane jest hasło"}.
%% -*- coding: utf-8 -*-
{"Accept","Zaakceptuj"}.
{"Access Configuration","Konfiguracja dostępu"}.
{"Access Control List Configuration","Konfiguracja listy dostępowej"}.
{"Access Control Lists","Lista dostępowa"}.
{"Access denied by service policy","Dostęp zabroniony zgodnie z zasadami usługi"}.
{"Access Rules","Zasady dostępu"}.
{"Action on user","Wykonaj na użytkowniku"}.
{"Add Jabber ID","Dodaj Jabber ID"}.
{"Add New","Dodaj nowe"}.
{"Add User","Dodaj użytkownika"}.
{"Administration of ","Zarządzanie "}.
{"Administration","Administracja"}.
{"Administration of ","Zarządzanie "}.
{"Administrator privileges required","Wymagane uprawnienia administratora"}.
{"All activity","Cała aktywność"}.
{"All Users","Wszyscy użytkownicy"}.
{"Allow users to change the subject","Pozwól użytkownikom zmieniać temat"}.
{"Allow users to query other users","Pozwól użytkownikom pobierać informacje o innych użytkownikach"}.
{"Allow users to send invites","Pozwól użytkownikom wysyłać zaproszenia"}.
@@ -23,14 +16,16 @@
{"Allow visitors to change nickname","Pozwól uczestnikom na zmianę nicka"}.
{"Allow visitors to send private messages to","Pozwól użytkownikom wysyłać prywatne wiadomości"}.
{"Allow visitors to send status text in presence updates","Pozwól uczestnikom na wysyłanie statusów opisowych"}.
{"All Users","Wszyscy użytkownicy"}.
{"Announcements","Powiadomienia"}.
{"A password is required to enter this room","Aby wejść do pokoju wymagane jest hasło"}.
{"April","Kwiecień"}.
{"August","Sierpień"}.
{"Automatic node creation is not enabled","Automatyczne tworzenie węzłów nie zostało włączone"}.
{"Backup","Kopia zapasowa"}.
{"Backup Management","Zarządzanie kopiami zapasowymi"}.
{"Backup of ~p","Kopia zapasowa ~p"}.
{"Backup to File at ","Zapisz kopię w pliku na "}.
{"Backup","Kopia zapasowa"}.
{"Bad format","Błędny format"}.
{"Birthday","Data urodzenia"}.
{"Both the username and the resource are required","Wymagana jest zarówno nazwa użytkownika jak i zasób"}.
@@ -56,15 +51,15 @@
{"City","Miasto"}.
{"Commands","Polecenia"}.
{"Conference room does not exist","Pokój konferencyjny nie istnieje"}.
{"Configuration of room ~s","Konfiguracja pokoju ~s"}.
{"Configuration","Konfiguracja"}.
{"Configuration of room ~s","Konfiguracja pokoju ~s"}.
{"Connected Resources:","Zasoby zalogowane:"}.
{"Country","Państwo"}.
{"CPU Time:","Czas CPU:"}.
{"Database","Baza danych"}.
{"Database failure","Błąd bazy danych"}.
{"Database Tables at ~p","Tabele bazy na ~p"}.
{"Database Tables Configuration at ","Konfiguracja tabel bazy na "}.
{"Database","Baza danych"}.
{"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"}.
@@ -114,10 +109,9 @@
{"Family Name","Nazwisko"}.
{"February","Luty"}.
{"File larger than ~w bytes","Plik jest większy niż ~w bajtów"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Wypełnij formularz aby wyszukać użytkowników Jabbera (dodaj * na koniec zapytania aby wyszukać po fragmencie)"}.
{"Friday","Piątek"}.
{"From ~s","Od ~s"}.
{"From","Od"}.
{"From ~s","Od ~s"}.
{"Full Name","Pełna nazwa"}.
{"Get Number of Online Users","Pokaż liczbę zalogowanych użytkowników"}.
{"Get Number of Registered Users","Pokaż liczbę zarejestrowanych użytkowników"}.
@@ -128,12 +122,13 @@
{"Group ","Grupa "}.
{"Groups","Grupy"}.
{"has been banned","został wykluczony"}.
{"has been kicked because of a system shutdown","został wyrzucony z powodu wyłączenia systemu"}.
{"has been kicked because of an affiliation change","został wyrzucony z powodu zmiany przynależności"}.
{"has been kicked because of a system shutdown","został wyrzucony z powodu wyłączenia systemu"}.
{"has been kicked because the room has been changed to members-only","został wyrzucony z powodu zmiany pokoju na \"Tylko dla Członków\""}.
{"has been kicked","został wyrzucony"}.
{"Host unknown","Nieznany host"}.
{" has set the subject to: "," zmienił temat na: "}.
{"Host","Host"}.
{"Host unknown","Nieznany host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Jeśli nie widzisz obrazka CAPTCHA, odwiedź stronę internetową."}.
{"Import Directory","Importuj katalog"}.
{"Import File","Importuj plik"}.
@@ -156,7 +151,6 @@
{"Invalid 'from' attribute in forwarded message","Nieprawidłowy atrybut 'from' w przesyłanej dalej wiadomości"}.
{"Invitations are not allowed in this conference","Zaproszenia są wyłączone w tym pokoju"}.
{"IP addresses","Adresy IP"}.
{"IP","IP"}.
{"is now known as","jest teraz znany jako"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Użytkownik nie może wysyłać wiadomości o błędach do pokoju. Użytkownik (~s) wysłał błąd (~s) i został wyrzucony z pokoju"}.
{"It is not allowed to send private messages of type \"groupchat\"","Nie można wysyłać prywatnych wiadomości typu \"groupchat\""}.
@@ -175,8 +169,6 @@
{"leaves the room","opuszcza pokój"}.
{"List of modules to start","Lista modułów do uruchomienia"}.
{"List of rooms","Lista pokoi"}.
{"Listened Ports at ","Porty nasłuchujące na "}.
{"Listened Ports","Porty nasłuchujące"}.
{"Low level update script","Skrypt aktualizacji niskiego poziomu"}.
{"Make participants list public","Upublicznij listę uczestników"}.
{"Make room CAPTCHA protected","Pokój zabezpieczony captchą"}.
@@ -199,8 +191,6 @@
{"Moderator privileges required","Wymagane uprawnienia moderatora"}.
{"Modified modules","Zmodyfikowane moduły"}.
{"Module failed to handle the query","Moduł nie był wstanie przetworzyć zapytania"}.
{"Module","Moduł"}.
{"Modules at ~p","Moduły na ~p"}.
{"Modules","Moduły"}.
{"Monday","Poniedziałek"}.
{"Multicast","Multicast"}.
@@ -212,23 +202,29 @@
{"Neither 'role' nor 'affiliation' attribute found","Brak zarówno atrybutu 'role' jak i 'affiliation'"}.
{"Never","Nigdy"}.
{"New Password:","Nowe hasło:"}.
{"Nickname","Nazwa użytkownika"}.
{"Nickname Registration at ","Rejestracja nazwy użytkownika na "}.
{"Nickname ~s does not exist in the room","Nie ma nicka ~s w tym pokoju"}.
{"Nickname","Nazwa użytkownika"}.
{"No 'access' found in data form","Brak wartości dla 'access'"}.
{"No 'acls' found in data form","Brak wartości dla 'acls'"}.
{"No 'affiliation' attribute found","Brak wartości dla 'access'"}.
{"No available resource found","Brak dostępnych zasobów"}.
{"No body provided for announce message","Brak treści powiadomienia"}.
{"No data form found","Brak danych dla formatki"}.
{"No Data","Brak danych"}.
{"No data form found","Brak danych dla formatki"}.
{"Node already exists","Węzeł już istnieje"}.
{"Node index not found","Indeks węzła już istnieje"}.
{"Node not found","Węzeł nie został znaleziony"}.
{"Nodeprep has failed","Weryfikacja nazwy nie powiodła się"}.
{"Node ~p","Węzeł ~p"}.
{"Nodes","Węzły"}.
{"No features available","Brak dostępnych funkcji"}.
{"No hook has processed this command","Żadna funkcja nie przetworzyła tej komendy"}.
{"No info about last activity found","Nie znaleziono informacji o ostatniej aktywności"}.
{"No 'item' element found","Brak wartości dla 'item'"}.
{"No items found in this query","Nie znaleziono żadnych pozycji w tym zapytaniu"}.
{"No limit","Bez limitu"}.
{"No module is handling this query","Żaden moduł nie obsługuje tego zapytania"}.
{"No 'modules' found in data form","Brak wartości dla 'modules'"}.
{"None","Brak"}.
{"No node specified","Nie podano węzła"}.
{"No 'password' found in data form","Brak wartości dla 'password'"}.
{"No 'password' found in this query","Brak wartości dla 'password'"}.
@@ -239,15 +235,8 @@
{"No running node found","Brak uruchomionych węzłów"}.
{"No services available","Usługa nie jest dostępna"}.
{"No statistics found for this item","Nie znaleziono statystyk dla tego elementu"}.
{"No 'to' attribute found in the invitation","Brak wartości dla 'to' w zaproszeniu"}.
{"Node already exists","Węzeł już istnieje"}.
{"Node index not found","Indeks węzła już istnieje"}.
{"Node not found","Węzeł nie został znaleziony"}.
{"Node ~p","Węzeł ~p"}.
{"Nodeprep has failed","Weryfikacja nazwy nie powiodła się"}.
{"Nodes","Węzły"}.
{"None","Brak"}.
{"Not Found","Nie znaleziono"}.
{"No 'to' attribute found in the invitation","Brak wartości dla 'to' w zaproszeniu"}.
{"Not subscribed","Nie zasubskrybowano"}.
{"November","Listopad"}.
{"Number of online users","Liczba zalogowanych użytkowników"}.
@@ -257,9 +246,9 @@
{"Offline Messages:","Wiadomości offline:"}.
{"OK","OK"}.
{"Old Password:","Stare hasło:"}.
{"Online","Dostępny"}.
{"Online Users","Użytkownicy zalogowani"}.
{"Online Users:","Użytkownicy zalogowani:"}.
{"Online","Dostępny"}.
{"Only <enable/> or <disable/> tags are allowed","Dozwolone są wyłącznie elementy <enable/> lub <disable/>"}.
{"Only <list/> element is allowed in this query","Wyłącznie elementy <item/> są dozwolone w tym zapytaniu"}.
{"Only members may query archives of this room","Tylko moderatorzy mogą przeglądać archiwa tego pokoju"}.
@@ -269,7 +258,6 @@
{"Only occupants are allowed to send messages to the conference","Tylko uczestnicy mogą wysyłać wiadomości na konferencję"}.
{"Only occupants are allowed to send queries to the conference","Tylko uczestnicy mogą wysyłać zapytania do konferencji"}.
{"Only service administrators are allowed to send service messages","Tylko administratorzy mogą wysyłać wiadomości"}.
{"Options","Opcje"}.
{"Organization Name","Nazwa organizacji"}.
{"Organization Unit","Dział"}.
{"Outgoing s2s Connections","Wychodzące połączenia s2s"}.
@@ -277,31 +265,27 @@
{"Owner privileges required","Wymagane uprawnienia właściciela"}.
{"Packet","Pakiet"}.
{"Parse failed","Błąd parsowania"}.
{"Password Verification","Weryfikacja hasła"}.
{"Password Verification:","Weryfikacja hasła:"}.
{"Password","Hasło"}.
{"Password:","Hasło:"}.
{"Password Verification","Weryfikacja hasła"}.
{"Password Verification:","Weryfikacja hasła:"}.
{"Path to Dir","Ścieżka do katalogu"}.
{"Path to File","Scieżka do pliku"}.
{"Pending","Oczekuje"}.
{"Period: ","Przedział czasu: "}.
{"Ping query is incorrect","Żądanie 'ping' nie jest prawidłowe"}.
{"Ping","Ping"}.
{"Ping query is incorrect","Żądanie 'ping' nie jest prawidłowe"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Te opcje kopii zapasowych dotyczą tylko wbudowanej bazy danych typu Mnesia. Jeśli korzystasz z modułu ODBC, musisz wykonać kopie bazy we własnym zakresie."}.
{"Please, wait for a while before sending new voice request","Proszę poczekać chwile, zanim wyślesz nowe żądanie głosowe"}.
{"Pong","Pong"}.
{"Port","Port"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Atrybut 'ask' nie jest dozwolony"}.
{"private, ","prywatny, "}.
{"Protocol","Protokół"}.
{"Publishing items to collection node is not allowed","Publikacja danych w węzłach kolekcji nie jest dozwolona"}.
{"Publish-Subscribe","PubSub"}.
{"PubSub subscriber request","Żądanie subskrybcji PubSub"}.
{"Queries to the conference members are not allowed in this room","Informacje o członkach konferencji nie są dostępne w tym pokoju"}.
{"Query to another users is forbidden","Zapytanie do innych użytkowników nie są dozwolone"}.
{"RAM and disc copy","Kopia na dysku i w pamięci RAM"}.
{"RAM copy","Kopia w pamięci RAM"}.
{"Raw","Żródło"}.
{"Really delete message of the day?","Na pewno usunąć wiadomość dnia?"}.
{"Recipient is not in the conference room","Odbiorcy nie ma w pokoju"}.
{"Register a Jabber account","Załóż konto Jabber"}.
@@ -326,14 +310,12 @@
{"Room description","Opis pokoju"}.
{"Room Occupants","Lista uczestników"}.
{"Room title","Tytuł pokoju"}.
{"Roster","Lista kontaktów"}.
{"Roster module has failed","Moduł list kontaktów zgłosił błąd"}.
{"Roster of ","Lista kontaktów "}.
{"Roster size","Rozmiar listy kontaktów"}.
{"Roster","Lista kontaktów"}.
{"RPC Call Error","Błąd żądania RPC"}.
{"Running Nodes","Uruchomione węzły"}.
{"~s access rule configuration","~s konfiguracja zasad dostępu"}.
{"~s invites you to the room ~s","~s zaprasza Cię do pokoju ~s"}.
{"Saturday","Sobota"}.
{"Scan failed","Błąd skanowania"}.
{"Script check","Sprawdź skrypt"}.
@@ -352,11 +334,11 @@
{"Show Integral Table","Pokaż tabelę całkowitą"}.
{"Show Ordinary Table","Pokaż zwykłą tabelę"}.
{"Shut Down Service","Wyłącz usługę"}.
{"~s invites you to the room ~s","~s zaprasza Cię do pokoju ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Niektóre klienty Jabber mogą zapisywać Twoje hasło na komputerze. Używaj tej opcji tylko jeśli ufasz komputerowi na którym pracujesz."}.
{"~s's Offline Messages Queue","Kolejka wiadomości offline użytkownika ~s"}.
{"Start Modules at ","Uruchom moduły na "}.
{"Start Modules","Uruchom moduły"}.
{"Start","Uruchom"}.
{"Statistics of ~p","Statystyki ~p"}.
{"Statistics","Statystyki"}.
{"Stop Modules at ","Zatrzymaj moduły na "}.
@@ -378,32 +360,33 @@
{"The CAPTCHA verification has failed","Weryfikacja CAPTCHA nie powiodła się"}.
{"The feature requested is not supported by the conference","Żądana czynność nie jest obsługiwana przez konferencje"}.
{"The password contains unacceptable characters","Hasło zawiera niedopuszczalne znaki"}.
{"The password is too weak","Hasło nie jest wystarczająco trudne"}.
{"the password is","hasło to:"}.
{"The password is too weak","Hasło nie jest wystarczająco trudne"}.
{"The password of your Jabber account was successfully changed.","Hasło do Twojego konta zostało zmienione."}.
{"The query is only allowed from local users","To żądanie jest dopuszczalne wyłącznie dla lokalnych użytkowników"}.
{"The query must not contain <item/> elements","Żądanie nie może zawierać elementów <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Żądanie może zawierać wyłącznie jeden z elementów <active/>, <default/> lub <list/>"}.
{"There was an error changing the password: ","Podczas próby zmiany hasła wystąpił błąd: "}.
{"There was an error creating the account: ","Wystąpił błąd podczas tworzenia konta: "}.
{"There was an error deleting the account: ","Podczas usuwania konta wystąpił błąd: "}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Żądanie może zawierać wyłącznie jeden z elementów <active/>, <default/> lub <list/>"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Pole nie rozróżnia wielkości liter: słowo Hanna jest takie samo jak hAnna lub haNNa."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Niniejsza strona pozwala na założenie konta Jabber na tym serwerze. Twój JID (Jabber IDentyfikator) będzie miał postać: nazwa_użytkownika@serwer. Przeczytaj dokładnie instrukcję i wypełnij pola."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Ta strona pozwala usunąć konto Jabber z tego serwera."}.
{"This room is not anonymous","Ten pokój nie jest anonimowy"}.
{"Thursday","Czwartek"}.
{"Time delay","Opóźnienie"}.
{"Time","Czas"}.
{"To register, visit ~s","Żeby się zarejestrować odwiedź ~s"}.
{"To ~s","Do ~s"}.
{"Time delay","Opóźnienie"}.
{"To","Do"}.
{"Token TTL","Limit czasu tokenu"}.
{"Too many active bytestreams","Zbyt wiele strumieni danych"}.
{"Too many CAPTCHA requests","Za dużo żądań CAPTCHA"}.
{"Too many <item/> elements","Zbyt wiele elementów <item/>"}.
{"Too many <list/> elements","Zbyt wiele elementów <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Zbyt wiele (~p) nieudanych prób logowanie z tego adresu IP (~s). Ten adres zostanie odblokowany o ~s UTC"}.
{"Too many unacked stanzas","Zbyt wiele niepotwierdzonych pakietów"}.
{"Too many users in this conference","Zbyt wielu użytkowników konferencji"}.
{"To register, visit ~s","Żeby się zarejestrować odwiedź ~s"}.
{"To ~s","Do ~s"}.
{"Total rooms","Wszystkich pokoi"}.
{"Traffic rate limit is exceeded","Limit transferu przekroczony"}.
{"Transactions Aborted:","Transakcje anulowane:"}.
@@ -418,24 +401,23 @@
{"Unregister a Jabber account","Usuń konto Jabber"}.
{"Unregister","Wyrejestruj"}.
{"Unsupported <index/> element","Nieobsługiwany element <index/>"}.
{"Update","Aktualizuj"}.
{"Update message of the day (don't send)","Aktualizuj wiadomość dnia (bez wysyłania)"}.
{"Update message of the day on all hosts (don't send)","Aktualizuj wiadomość dnia na wszystkich hostach (bez wysyłania)"}.
{"Update plan","Plan aktualizacji"}.
{"Update ~p","Uaktualnij ~p"}.
{"Update script","Skrypt aktualizacji"}.
{"Update","Aktualizuj"}.
{"Uptime:","Czas pracy:"}.
{"User already exists","Użytkownik już istnieje"}.
{"User (jid)","Użytkownik (jid)"}.
{"User Management","Zarządzanie użytkownikami"}.
{"User part of JID in 'from' is empty","Część użytkownika w 'from' jest pusta"}.
{"User session not found","Sesja użytkownika nie została znaleziona"}.
{"User session terminated","Sesja użytkownika została zakończona"}.
{"User ~s","Użytkownik ~s"}.
{"Username:","Nazwa użytkownika:"}.
{"Users are not allowed to register accounts so quickly","Użytkowncy nie mogą tak szybko rejestrować nowych kont"}.
{"User session not found","Sesja użytkownika nie została znaleziona"}.
{"User session terminated","Sesja użytkownika została zakończona"}.
{"Users Last Activity","Ostatnia aktywność użytkowników"}.
{"Users","Użytkownicy"}.
{"User ~s","Użytkownik ~s"}.
{"User","Użytkownik"}.
{"Validate","Potwierdź"}.
{"Value 'get' of 'type' attribute is not allowed","Wartość 'get' dla atrybutu 'type' jest niedozwolona"}.
@@ -459,7 +441,6 @@
{"You need an x:data capable client to search","Potrzebujesz klienta obsługującego x:data aby wyszukiwać"}.
{"Your active privacy list has denied the routing of this stanza.","Aktualna lista prywatności zabrania przesyłania tej stanzy."}.
{"Your contact offline message queue is full. The message has been discarded.","Kolejka wiadomości offline adresata jest pełna. Wiadomość została odrzucona."}.
{"You're not allowed to create nodes","Nie masz uprawnień do tworzenia węzłów"}.
{"Your Jabber account was successfully created.","Twoje konto zostało stworzone."}.
{"Your Jabber account was successfully deleted.","Twoje konto zostało usunięte."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Twoje wiadomości do ~s są blokowane. Aby je odblokować, odwiedź ~s"}.
{"You're not allowed to create nodes","Nie masz uprawnień do tworzenia węzłów"}.
+791 -664
View File
File diff suppressed because it is too large Load Diff
+40 -59
View File
@@ -1,21 +1,14 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," mudou o assunto para: "}.
{"A password is required to enter this room","Se necessita senha para entrar nesta sala"}.
%% -*- coding: utf-8 -*-
{"Accept","Aceito"}.
{"Access Configuration","Configuração de Acesso"}.
{"Access Control List Configuration","Configuração da Lista de Controle de Acesso"}.
{"Access Control Lists","Listas de Controle de Acesso"}.
{"Access denied by service policy","Acesso negado pela política do serviço"}.
{"Access Rules","Regras de Acesso"}.
{"Action on user","Ação no usuário"}.
{"Add Jabber ID","Adicionar ID jabber"}.
{"Add New","Adicionar novo"}.
{"Add User","Adicionar usuário"}.
{"Administration of ","Administração de "}.
{"Administration","Administração"}.
{"Administration of ","Administração de "}.
{"Administrator privileges required","Se necessita privilégios de administrador"}.
{"All activity","Todas atividades"}.
{"All Users","Todos os usuários"}.
{"Allow users to change the subject","Permitir a usuários modificar o assunto"}.
{"Allow users to query other users","Permitir a usuários pesquisar informações sobre os demais"}.
{"Allow users to send invites","Permitir a usuários envio de convites"}.
@@ -23,14 +16,16 @@
{"Allow visitors to change nickname","Permitir mudança de apelido aos visitantes"}.
{"Allow visitors to send private messages to","Permitir visitantes enviar mensagem privada para"}.
{"Allow visitors to send status text in presence updates","Permitir atualizações de status aos visitantes"}.
{"All Users","Todos os usuários"}.
{"Announcements","Anúncios"}.
{"A password is required to enter this room","Se necessita senha para entrar nesta sala"}.
{"April","Abril"}.
{"August","Agosto"}.
{"Automatic node creation is not enabled","Criação automatizada de nós está desabilitada"}.
{"Backup Management","Gestão de Backup"}.
{"Backup of ~p","Backup de ~p"}.
{"Backup to File at ","Salvar backup para arquivo em "}.
{"Backup","Salvar cópia de segurança"}.
{"Backup to File at ","Salvar backup para arquivo em "}.
{"Bad format","Formato incorreto"}.
{"Birthday","Aniversário"}.
{"Both the username and the resource are required","Nome de usuário e recurso são necessários"}.
@@ -54,18 +49,18 @@
{"City","Cidade"}.
{"Commands","Comandos"}.
{"Conference room does not exist","A sala de conferência não existe"}.
{"Configuration of room ~s","Configuração para ~s"}.
{"Configuration","Configuração"}.
{"Configuration of room ~s","Configuração para ~s"}.
{"Connected Resources:","Recursos conectados:"}.
{"Country","País"}.
{"CPU Time:","Tempo de CPU"}.
{"Database","Base de dados"}.
{"Database Tables at ~p","Tabelas da Base de dados em ~p"}.
{"Database Tables Configuration at ","Configuração de Tabelas de Base de dados em "}.
{"Database","Base de dados"}.
{"December","Dezembro"}.
{"Default users as participants","Usuários padrões como participantes"}.
{"Delete message of the day on all hosts","Apagar a mensagem do dia em todos os hosts"}.
{"Delete message of the day","Apagar mensagem do dia"}.
{"Delete message of the day on all hosts","Apagar a mensagem do dia em todos os hosts"}.
{"Delete Selected","Remover os selecionados"}.
{"Delete User","Deletar Usuário"}.
{"Description:","Descrição:"}.
@@ -110,10 +105,9 @@
{"Family Name","Sobrenome"}.
{"February","Fevereiro"}.
{"File larger than ~w bytes","Arquivo maior que ~w bytes"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Preencha o formulário para buscar usuários Jabber. Agrega * ao final de um campo para buscar sub-palavras."}.
{"Friday","Sexta"}.
{"From ~s","De ~s"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nome completo"}.
{"Get Number of Online Users","Obter Número de Usuários Online"}.
{"Get Number of Registered Users","Obter Número de Usuários Registrados"}.
@@ -123,12 +117,13 @@
{"Group ","Grupo "}.
{"Groups","Grupos"}.
{"has been banned","foi banido"}.
{"has been kicked because of a system shutdown","foi desconectado porque o sistema foi desligado"}.
{"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}.
{"has been kicked because of a system shutdown","foi desconectado porque o sistema foi desligado"}.
{"has been kicked because the room has been changed to members-only","foi desconectado porque a política da sala mudou, só membros são permitidos"}.
{"has been kicked","foi removido"}.
{"Host unknown","Máquina desconhecida"}.
{" has set the subject to: "," mudou o assunto para: "}.
{"Host","Máquina"}.
{"Host unknown","Máquina desconhecida"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Se você não conseguir ver o CAPTCHA aqui, visite a web page."}.
{"Import Directory","Importar diretório"}.
{"Import File","Importar arquivo"}.
@@ -149,12 +144,11 @@
{"Insufficient privilege","Privilégio insuficiente"}.
{"Invalid 'from' attribute in forwarded message","Atributo 'from' inválido na mensagem reenviada"}.
{"IP addresses","Endereços IP"}.
{"IP","IP"}.
{"is now known as","é agora conhecido como"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Não é permitido o envio de mensagens de erro a esta sala. O membro (~s) enviou uma mensagem de erro (~s) e foi desconectado (\"kicked\")."}.
{"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\"","Não é permitido enviar mensagens privadas do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Não é permitido enviar mensagens privadas para a sala de conferência"}.
{"It is not allowed to send private messages","Não é permitido enviar mensagens privadas"}.
{"Jabber Account Registration","Registro de Contas Jabber"}.
{"Jabber ID","ID Jabber"}.
{"January","Janeiro"}.
@@ -168,8 +162,6 @@
{"leaves the room","Sair da sala"}.
{"List of modules to start","Listas de módulos para inicializar"}.
{"List of rooms","Lista de salas"}.
{"Listened Ports at ","Portas abertas em "}.
{"Listened Ports","Portas abertas"}.
{"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"}.
@@ -191,8 +183,6 @@
{"Moderator privileges required","Se necessita privilégios de moderador"}.
{"Modified modules","Módulos atualizados"}.
{"Module failed to handle the query","Módulo falhou ao processar a consulta"}.
{"Module","Módulo"}.
{"Modules at ~p","Módulos em ~p"}.
{"Modules","Módulos"}.
{"Monday","Segunda"}.
{"Multicast","Multicast"}.
@@ -204,21 +194,26 @@
{"Neither 'role' nor 'affiliation' attribute found","Nem o atributo 'role' nem 'affiliation' foram encontrados"}.
{"Never","Nunca"}.
{"New Password:","Nova Senha:"}.
{"Nickname","Apelido"}.
{"Nickname Registration at ","Registro do apelido em "}.
{"Nickname ~s does not exist in the room","O apelido ~s não existe na sala"}.
{"Nickname","Apelido"}.
{"No 'access' found in data form","'access' não foi encontrado em formulário de dados"}.
{"No 'acls' found in data form","'acls' não foi encontrado em formulário de dados"}.
{"No 'affiliation' attribute found","Atributo 'affiliation' não foi encontrado"}.
{"No available resource found","Nenhum recurso disponível foi encontrado"}.
{"No body provided for announce message","Nenhum corpo de texto fornecido para anunciar mensagem"}.
{"No Data","Nenhum dado"}.
{"Node already exists","Nó já existe"}.
{"Node not found","Nó não encontrado"}.
{"Node ~p","Nó ~p"}.
{"Nodeprep has failed","Processo de identificação de nó falhou (nodeprep)"}.
{"Nodes","Nós"}.
{"No features available","Nenhuma funcionalidade disponível"}.
{"No hook has processed this command","Nenhum hook processou este comando"}.
{"No info about last activity found","Não foi encontrada informação sobre última atividade"}.
{"No items found in this query","Nenhum item encontrado nesta consulta"}.
{"No limit","Ilimitado"}.
{"No module is handling this query","Nenhum módulo está processando esta consulta"}.
{"No 'modules' found in data form","'modules' não foi encontrado em formulário de dados"}.
{"None","Nenhum"}.
{"No node specified","Nenhum nó especificado"}.
{"No 'password' found in data form","'password' não foi encontrado em formulário de dados"}.
{"No 'password' found in this query","'password' não foi encontrado nesta consulta"}.
@@ -228,14 +223,8 @@
{"No private data found in this query","Nenhum dado privado encontrado nesta consulta"}.
{"No services available","Não há serviços disponíveis"}.
{"No statistics found for this item","Não foram encontradas estatísticas para este item"}.
{"No 'to' attribute found in the invitation","Atributo 'to' não foi encontrado no convite"}.
{"Node already exists","Nó já existe"}.
{"Node not found","Nó não encontrado"}.
{"Node ~p","Nó ~p"}.
{"Nodeprep has failed","Processo de identificação de nó falhou (nodeprep)"}.
{"Nodes","Nós"}.
{"None","Nenhum"}.
{"Not Found","Não encontrado"}.
{"No 'to' attribute found in the invitation","Atributo 'to' não foi encontrado no convite"}.
{"Not subscribed","Não subscrito"}.
{"November","Novembro"}.
{"Number of online users","Número de usuários online"}.
@@ -245,9 +234,9 @@
{"Offline Messages:","Mensagens offline"}.
{"OK","OK"}.
{"Old Password:","Senha Antiga:"}.
{"Online","Conectado"}.
{"Online Users","Usuários conectados"}.
{"Online Users:","Usuários online"}.
{"Online","Conectado"}.
{"Only <enable/> or <disable/> tags are allowed","Apenas tags <enable/> ou <disable/> são permitidas"}.
{"Only <list/> element is allowed in this query","Apenas elemento <list/> é permitido nesta consulta"}.
{"Only members may query archives of this room","Somente os membros podem procurar nos arquivos desta sala"}.
@@ -257,7 +246,6 @@
{"Only occupants are allowed to send messages to the conference","Somente os ocupantes podem enviar mensagens à sala de conferência"}.
{"Only occupants are allowed to send queries to the conference","Somente os ocupantes podem enviar consultas à sala de conferência"}.
{"Only service administrators are allowed to send service messages","Apenas administradores possuem permissão para enviar mensagens de serviço"}.
{"Options","Opções"}.
{"Organization Name","Nome da organização"}.
{"Organization Unit","Departamento/Unidade"}.
{"Outgoing s2s Connections","Conexões s2s de Saída"}.
@@ -265,10 +253,10 @@
{"Owner privileges required","Se requer privilégios de proprietário da sala"}.
{"Packet","Pacote"}.
{"Parse failed","Análise de dados falhou"}.
{"Password Verification","Verificação de Senha"}.
{"Password Verification:","Verificação de Senha"}.
{"Password","Senha"}.
{"Password:","Senha:"}.
{"Password Verification","Verificação de Senha"}.
{"Password Verification:","Verificação de Senha"}.
{"Path to Dir","Caminho para o diretório"}.
{"Path to File","Caminho do arquivo"}.
{"Pending","Pendente"}.
@@ -277,18 +265,14 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Observe que tais opções farão backup apenas da base de dados Mnesia. Caso você esteja utilizando o modulo ODBC, você precisará fazer backup de sua base de dados SQL separadamente."}.
{"Please, wait for a while before sending new voice request","Por favor, espere antes de enviar uma nova requisição de voz"}.
{"Pong","Pong"}.
{"Port","Porta"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Possuir atributo 'ask' não é permitido pela RFC6121"}.
{"private, ","privado, "}.
{"Protocol","Porta"}.
{"Publishing items to collection node is not allowed","Publicar items em um nó de coleção não é permitido"}.
{"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 de conferência, consultas aos membros não são permitidas"}.
{"Query to another users is forbidden","Consultar a outro usuário é proibido"}.
{"RAM and disc copy","Cópias na RAM e disco rígido"}.
{"RAM copy","Cópia em RAM"}.
{"Raw","Intocado"}.
{"Really delete message of the day?","Deletar realmente a mensagem do dia?"}.
{"Recipient is not in the conference room","O receptor não está na sala de conferência"}.
{"Register a Jabber account","Registrar uma conta Jabber"}.
@@ -297,12 +281,12 @@
{"Register","Registrar"}.
{"Remote copy","Cópia remota"}.
{"Remove All Offline Messages","Remover Todas as Mensagens Offline"}.
{"Remove User","Remover usuário"}.
{"Remove","Remover"}.
{"Remove User","Remover usuário"}.
{"Replaced by new connection","Substituído por nova conexão"}.
{"Resources","Recursos"}.
{"Restart Service","Reiniciar Serviço"}.
{"Restart","Reiniciar"}.
{"Restart Service","Reiniciar Serviço"}.
{"Restore Backup from File at ","Restaurar backup a partir do arquivo em "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaurar backup binário após reinicialização do ejabberd (requer menos memória):"}.
{"Restore binary backup immediately:","Restaurar backup binário imediatamente"}.
@@ -313,22 +297,20 @@
{"Room description","Descrição da Sala"}.
{"Room Occupants","Número de participantes"}.
{"Room title","Título da sala"}.
{"Roster","Lista de contatos"}.
{"Roster module has failed","O módulo Roster falhou"}.
{"Roster of ","Lista de contatos de "}.
{"Roster size","Tamanho da Lista"}.
{"Roster","Lista de contatos"}.
{"RPC Call Error","Erro de chamada RPC"}.
{"Running Nodes","Nós em execução"}.
{"~s access rule configuration","Configuração da Regra de Acesso ~s"}.
{"~s invites you to the room ~s","~s convidou você para a sala ~s"}.
{"Saturday","Sábado"}.
{"Script check","Verificação de Script"}.
{"Search Results for ","Resultados de pesquisa para "}.
{"Search users in ","Procurar usuários em "}.
{"Send announcement to all online users on all hosts","Enviar anúncio a todos usuários online em todas as máquinas"}.
{"Send announcement to all online users","Enviar anúncio a todos os usuárions online"}.
{"Send announcement to all users on all hosts","Enviar aviso para todos os usuários em todos os hosts"}.
{"Send announcement to all online users on all hosts","Enviar anúncio a todos usuários online em todas as máquinas"}.
{"Send announcement to all users","Enviar anúncio a todos os usuários"}.
{"Send announcement to all users on all hosts","Enviar aviso para todos os usuários em todos os hosts"}.
{"September","Setembro"}.
{"Server connections to local subdomains are forbidden","Conexões de servidor a subdomínios locais estão proibidas"}.
{"Server:","Servidor:"}.
@@ -338,13 +320,13 @@
{"Show Integral Table","Mostrar Tabela Integral"}.
{"Show Ordinary Table","Mostrar Tabela Ordinária"}.
{"Shut Down Service","Parar Serviço"}.
{"~s invites you to the room ~s","~s convidou você para a sala ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alguns clientes jabber podem salvar a sua senha no seu computador. Use o recurso somente se você considera este computador seguro o suficiente."}.
{"~s's Offline Messages Queue","~s's Fila de Mensagens Offline"}.
{"Start Modules at ","Iniciar módulos em "}.
{"Start Modules","Iniciar módulos"}.
{"Start","Iniciar"}.
{"Statistics of ~p","Estatísticas de ~p"}.
{"Statistics","Estatísticas"}.
{"Statistics of ~p","Estatísticas de ~p"}.
{"Stop Modules at ","Parar módulos em "}.
{"Stop Modules","Parar módulos"}.
{"Stop","Parar"}.
@@ -364,15 +346,15 @@
{"The CAPTCHA verification has failed","A verificação do CAPTCHA falhou"}.
{"The feature requested is not supported by the conference","A funcionalidade solicitada não é suportada pela sala de conferência"}.
{"The password contains unacceptable characters","A senha contém caracteres proibidos"}.
{"The password is too weak","Senha considerada muito fraca"}.
{"the password is","a senha é"}.
{"The password is too weak","Senha considerada muito fraca"}.
{"The password of your Jabber account was successfully changed.","A senha da sua conta Jabber foi mudada com sucesso."}.
{"The query is only allowed from local users","Esta consulta só é permitida a partir de usuários locais"}.
{"The query must not contain <item/> elements","A consulta não pode conter elementos <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","A instância DEVE conter apenas um elemento <active/>, um elemento <default/>, ou um elemento <list/>"}.
{"There was an error changing the password: ","Houve um erro ao mudar a senha: "}.
{"There was an error creating the account: ","Houve um erro ao criar esta conta: "}.
{"There was an error deleting the account: ","Houve um erro ao deletar esta conta: "}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","A instância DEVE conter apenas um elemento <active/>, um elemento <default/>, ou um elemento <list/>"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Não é 'case insensitive': macbeth é o mesmo que MacBeth e ainda Macbeth. "}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Esta pagina aceita criações de novas contas Jabber neste servidor. O seu JID (Identificador Jabber) será da seguinte forma: 'usuário@servidor'. Por favor, leia cuidadosamente as instruções para preencher corretamente os campos."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Esta página aceita para deletar uma conta Jabber neste servidor."}.
@@ -380,14 +362,15 @@
{"Thursday","Quinta"}.
{"Time delay","Intervalo (Tempo)"}.
{"Time","Tempo"}.
{"To register, visit ~s","Para registrar, visite ~s"}.
{"To ~s","Para ~s"}.
{"Token TTL","Token TTL"}.
{"Too many CAPTCHA requests","Número excessivo de requisições para o CAPTCHA"}.
{"Too many <item/> elements","Número excessivo de elementos <item/>"}.
{"Too many <list/> elements","Número excessivo de elementos <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Número excessivo (~p) de tentativas falhas de autenticação (~s). O endereço será desbloqueado às ~s UTC"}.
{"Too many unacked stanzas","Número excessivo de instâncias sem confirmação"}.
{"To","Para"}.
{"To register, visit ~s","Para registrar, visite ~s"}.
{"To ~s","Para ~s"}.
{"Total rooms","Salas no total"}.
{"Traffic rate limit is exceeded","Limite de banda excedido"}.
{"Transactions Aborted:","Transações abortadas:"}.
@@ -402,22 +385,21 @@
{"Unregister a Jabber account","Deletar conta Jabber"}.
{"Unregister","Deletar registro"}.
{"Unsupported <index/> element","Elemento <index/> não suportado"}.
{"Update","Atualizar"}.
{"Update message of the day (don't send)","Atualizar mensagem do dia (não enviar)"}.
{"Update message of the day on all hosts (don't send)","Atualizar a mensagem do dia em todos os host (não enviar)"}.
{"Update ~p","Atualizar ~p"}.
{"Update plan","Plano de Atualização"}.
{"Update script","Script de atualização"}.
{"Update","Atualizar"}.
{"Uptime:","Uptime:"}.
{"User already exists","Usuário já existe"}.
{"User (jid)","Usuário (jid)"}.
{"User Management","Gerenciamento de Usuários"}.
{"User part of JID in 'from' is empty","Parte do usuário do JID em 'from' está vazia"}.
{"User session terminated","Sessão de usuário terminada"}.
{"User ~s","Usuário ~s"}.
{"Username:","Usuário:"}.
{"Users are not allowed to register accounts so quickly","Usuários não estão autorizados a registrar contas imediatamente"}.
{"User session terminated","Sessão de usuário terminada"}.
{"Users Last Activity","Últimas atividades dos usuários"}.
{"User ~s","Usuário ~s"}.
{"Users","Usuários"}.
{"User","Usuário"}.
{"Validate","Validar"}.
@@ -444,4 +426,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Sua fila de mensagens offline esta cheia. Sua mensagem foi descartada"}.
{"Your Jabber account was successfully created.","Sua conta jabber foi criada com sucesso."}.
{"Your Jabber account was successfully deleted.","Sua conta Jabber foi deletada com sucesso."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Suas mensagens para ~s estão bloqueadas. Para desbloqueá-las, visite: ~s"}.
+791 -664
View File
File diff suppressed because it is too large Load Diff
+9 -18
View File
@@ -1,19 +1,14 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," colocou o tópico: "}.
{"Access Configuration","Configuração de acessos"}.
{"Access Control List Configuration","Configuração da Lista de Controlo de Acesso"}.
{"Access Control Lists","Listas de Controlo de Acesso"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Acesso negado pela política de serviço"}.
{"Access Rules","Regras de Acesso"}.
{"Action on user","Acção no utilizador"}.
{"Add New","Adicionar novo"}.
{"Add User","Adicionar utilizador"}.
{"Administration of ","Administração de "}.
{"Administrator privileges required","São necessários privilégios de administrador"}.
{"All Users","Todos os utilizadores"}.
{"Backup","Guardar cópia de segurança"}.
{"Backup Management","Gestão de cópias de segurança"}.
{"Backup to File at ","Guardar cópia de segurança para ficheiro em "}.
{"Backup","Guardar cópia de segurança"}.
{"Birthday","Data de nascimento"}.
{"Change Password","Mudar palavra-chave"}.
{"Choose a username and password to register with this server","Escolha um nome de utilizador e palavra-chave para se registar neste servidor"}.
@@ -39,10 +34,11 @@
{"Enter path to text file","Introduza caminho para o ficheiro de texto"}.
{"Erlang Jabber Server","Servidor Jabber em Erlang"}.
{"Family Name","Apelido"}.
{"From ~s","De ~s"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nome completo"}.
{"Groups","Grupos"}.
{" has set the subject to: "," colocou o tópico: "}.
{"Import Directory","Importar directório"}.
{"Import File","Importar ficheiro"}.
{"Import User from File at ","Importar utilizador a partir do ficheiro em "}.
@@ -53,28 +49,25 @@
{"It is not allowed to send private messages to the conference","Impedir o envio de mensagens privadas para a sala"}.
{"Last Activity","Última actividade"}.
{"List of modules to start","Lista de módulos a iniciar"}.
{"Listened Ports at ","Portas em escuta em "}.
{"Make room moderated","Tornar a sala moderada"}.
{"Memory","Memória"}.
{"Middle Name","Segundo nome"}.
{"Moderator privileges required","São necessários privilégios de moderador"}.
{"Module","Módulo"}.
{"Modules","Módulos"}.
{"Name","Nome"}.
{"Never","Nunca"}.
{"Nickname","Alcunha"}.
{"Nickname Registration at ","Registo da alcunha em "}.
{"Nickname ~s does not exist in the room","A alcunha ~s não existe na sala"}.
{"Nickname","Alcunha"}.
{"Node not found","Nodo não encontrado"}.
{"Nodes","Nodos"}.
{"None","Nenhum"}.
{"OK","OK"}.
{"Online Users","Utilizadores ligados"}.
{"Online","Ligado"}.
{"Online Users","Utilizadores ligados"}.
{"Only occupants are allowed to send messages to the conference","Só os ocupantes podem enviar mensagens para a sala"}.
{"Only occupants are allowed to send queries to the conference","Só os ocupantes podem enviar consultas para a sala"}.
{"Only service administrators are allowed to send service messages","Só os administradores do serviço têm permissão para enviar mensagens de serviço"}.
{"Options","Opções"}.
{"Organization Name","Nome da organização"}.
{"Organization Unit","Unidade da organização"}.
{"Owner privileges required","São necessários privilégios de dono"}.
@@ -84,23 +77,21 @@
{"Path to Dir","Caminho para o directório"}.
{"Path to File","Caminho do ficheiro"}.
{"Pending","Pendente"}.
{"Port","Porta"}.
{"private, ","privado"}.
{"Queries to the conference members are not allowed in this room","Nesta sala não são permitidas consultas aos seus membros"}.
{"RAM and disc copy","Cópia em RAM e em disco"}.
{"RAM copy","Cópia em RAM"}.
{"Recipient is not in the conference room","O destinatário não está na sala"}.
{"Remote copy","Cópia remota"}.
{"Remove User","Eliminar utilizador"}.
{"Remove","Remover"}.
{"Remove User","Eliminar utilizador"}.
{"Restart","Reiniciar"}.
{"Restore Backup from File at ","Restaura cópia de segurança a partir do ficheiro em "}.
{"Restore","Restaurar"}.
{"Room title","Título da sala"}.
{"Roster of ","Lista de contactos de "}.
{"Roster","Lista de contactos"}.
{"Roster of ","Lista de contactos de "}.
{"Running Nodes","Nodos a correr"}.
{"~s access rule configuration","Configuração das Regra de Acesso ~s"}.
{"Search users in ","Procurar utilizadores em "}.
{"Start Modules at ","Iniciar os módulos em "}.
{"Start Modules","Iniciar módulos"}.
@@ -113,8 +104,8 @@
{"Submit","Enviar"}.
{"Subscription","Subscrição"}.
{"Time","Data"}.
{"To ~s","A ~s"}.
{"To","Para"}.
{"To ~s","A ~s"}.
{"Update","Actualizar"}.
{"Users","Utilizadores"}.
{"User","Utilizador"}.
+769 -655
View File
File diff suppressed because it is too large Load Diff
+87 -43
View File
@@ -1,21 +1,16 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," установил(а) тему: "}.
{"A password is required to enter this room","Чтобы войти в эту конференцию, нужен пароль"}.
%% -*- coding: utf-8 -*-
{"Accept","Принять"}.
{"Access Configuration","Конфигурация доступа"}.
{"Access Control List Configuration","Конфигурация списков управления доступом"}.
{"Access Control Lists","Списки управления доступом"}.
{"Access denied by service policy","Доступ запрещён политикой службы"}.
{"Access Rules","Правила доступа"}.
{"Account doesn't exist","Учётная запись не существует"}.
{"Action on user","Действие над пользователем"}.
{"Add Jabber ID","Добавить Jabber ID"}.
{"Add New","Добавить"}.
{" (Add * to the end of field to match substring)"," (Добавьте * в конец поля для поиска подстроки)"}.
{"Add User","Добавить пользователя"}.
{"Administration of ","Администрирование "}.
{"Administration","Администрирование"}.
{"Administrator privileges required","Требуются права администратора"}.
{"All activity","Вся статистика"}.
{"All Users","Все пользователи"}.
{"Allow users to change the subject","Разрешить пользователям изменять тему"}.
{"Allow users to query other users","Разрешить iq-запросы к пользователям"}.
{"Allow users to send invites","Разрешить пользователям посылать приглашения"}.
@@ -23,8 +18,14 @@
{"Allow visitors to change nickname","Разрешить посетителям изменять псевдоним"}.
{"Allow visitors to send private messages to","Разрешить посетителям посылать приватные сообщения"}.
{"Allow visitors to send status text in presence updates","Разрешить посетителям вставлять текcт статуса в сообщения о присутствии"}.
{"All Users","Все пользователи"}.
{"Announcements","Объявления"}.
{"A password is required to enter this room","Чтобы войти в эту конференцию, нужен пароль"}.
{"April","апреля"}.
{"Attribute 'channel' is required for this request","Атрибут 'channel' является обязательным для этого запроса"}.
{"Attribute 'id' is mandatory for MIX messages","Атрибут 'id' является обязательным для MIX сообщений"}.
{"Attribute 'jid' is not allowed here","Атрибут 'jid' здесь недопустим"}.
{"Attribute 'node' is not allowed here","Атрибут 'node' здесь недопустим"}.
{"August","августа"}.
{"Automatic node creation is not enabled","Автоматическое создание узлов недоступно"}.
{"Backup Management","Управление резервным копированием"}.
@@ -42,6 +43,9 @@
{"Change User Password","Изменить пароль пользователя"}.
{"Changing password is not allowed","Изменение пароля не разрешено"}.
{"Changing role/affiliation is not allowed","Изменение роли/ранга не разрешено"}.
{"Channel already exists","Канал уже существует"}.
{"Channel does not exist","Канал не существует"}.
{"Channels","Каналы"}.
{"Characters not allowed:","Недопустимые символы:"}.
{"Chatroom configuration modified","Конфигурация комнаты изменилась"}.
{"Chatroom is created","Комната создана"}.
@@ -54,6 +58,7 @@
{"Choose storage type of tables","Выберите тип хранения таблиц"}.
{"Choose whether to approve this entity's subscription.","Решите: предоставить ли подписку этому объекту."}.
{"City","Город"}.
{"Client acknowledged more stanzas than sent by server","Клиент подтвердил больше сообщений чем было отправлено сервером"}.
{"Commands","Команды"}.
{"Conference room does not exist","Конференция не существует"}.
{"Configuration of room ~s","Конфигурация комнаты ~s"}.
@@ -67,9 +72,11 @@
{"Database","База данных"}.
{"December","декабря"}.
{"Default users as participants","Сделать пользователей участниками по умолчанию"}.
{"Delete content","Удалить содержимое"}.
{"Delete message of the day on all hosts","Удалить сообщение дня со всех виртуальных серверов"}.
{"Delete message of the day","Удалить сообщение дня"}.
{"Delete Selected","Удалить выделенные"}.
{"Delete table","Удалить таблицу"}.
{"Delete User","Удалить пользователя"}.
{"Description:","Описание:"}.
{"Disc only copy","только диск"}.
@@ -80,6 +87,7 @@
{"Duplicated groups are not allowed by RFC6121","Группы с одинаковыми названиями запрещены стандартом RFC6121"}.
{"Edit Properties","Изменить параметры"}.
{"Either approve or decline the voice request.","Подтвердите или отклоните право голоса."}.
{"ejabberd","ejabberd"}.
{"ejabberd MUC module","ejabberd MUC модуль"}.
{"ejabberd Multicast service","ejabberd Multicast сервис"}.
{"ejabberd Publish-Subscribe module","Модуль ejabberd Публикации-Подписки"}.
@@ -114,26 +122,30 @@
{"Family Name","Фамилия"}.
{"February","февраля"}.
{"File larger than ~w bytes","Файл больше ~w байт"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Заполните форму для поиска пользователя Jabber (Если добавить * в конец поля, то происходит поиск подстроки)"}.
{"Fill in the form to search for any matching Jabber User","Заполните форму для поиска пользователя Jabber"}.
{"Friday","Пятница"}.
{"From ~s","От ~s"}.
{"From","От кого"}.
{"Full Name","Полное имя"}.
{"Get Number of Online Users","Получить количество подключённых пользователей"}.
{"Get Number of Registered Users","Получить количество зарегистрированных пользователей"}.
{"Get Pending","Получить отложенные"}.
{"Get User Last Login Time","Получить время последнего подключения пользователя"}.
{"Get User Password","Получить пароль пользователя"}.
{"Get User Statistics","Получить статистику по пользователю"}.
{"Given Name","Имя"}.
{"Group ","Группа "}.
{"Groups","Группы"}.
{"Group ","Группа "}.
{"has been banned","запретили входить в комнату"}.
{"has been kicked because of a system shutdown","выгнали из комнаты из-за останова системы"}.
{"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 unknown","Неизвестное имя сервера"}.
{"Host","Хост"}.
{"HTTP File Upload","Передача файлов по HTTP"}.
{"Idle connection","Неиспользуемое соединение"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Если вы не видите изображение капчи, перейдите по ссылке."}.
{"Import Directory","Импорт из директории"}.
{"Import File","Импорт из файла"}.
@@ -153,10 +165,12 @@
{"Incorrect value of 'action' in data form","Некорректное значение 'action' в форме данных"}.
{"Incorrect value of 'path' in data form","Некорректное значение 'path' в форме данных"}.
{"Insufficient privilege","Недостаточно прав"}.
{"Internal server error","Внутренняя ошибка сервера"}.
{"Invalid 'from' attribute in forwarded message","Некорректный атрибут 'from' в пересланном сообщении"}.
{"Invalid node name","Недопустимое имя узла"}.
{"Invalid 'previd' value","Недопустимое значение 'previd'"}.
{"Invitations are not allowed in this conference","Рассылка приглашений отключена в этой конференции"}.
{"IP addresses","IP адреса"}.
{"IP","IP"}.
{"is now known as","изменил(а) имя на"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Запрещено посылать сообщения об ошибках в эту комнату. Участник (~s) послал сообщение об ошибке (~s) и был выкинут из комнаты"}.
{"It is not allowed to send private messages of type \"groupchat\"","Нельзя посылать частные сообщения типа \"groupchat\""}.
@@ -175,8 +189,6 @@
{"leaves the room","вышел(а) из комнаты"}.
{"List of modules to start","Список запускаемых модулей"}.
{"List of rooms","Список комнат"}.
{"Listened Ports at ","Прослушиваемые порты на "}.
{"Listened Ports","Прослушиваемые порты"}.
{"Low level update script","Низкоуровневый сценарий обновления"}.
{"Make participants list public","Сделать список участников видимым всем"}.
{"Make room CAPTCHA protected","Сделать комнату защищённой капчей"}.
@@ -186,6 +198,7 @@
{"Make room persistent","Сделать комнату постоянной"}.
{"Make room public searchable","Сделать комнату видимой всем"}.
{"Malformed username","Недопустимое имя пользователя"}.
{"MAM preference modification denied by service policy","Изменение настроек архива сообщений запрещено политикой службы"}.
{"March","марта"}.
{"Maximum Number of Occupants","Максимальное количество участников"}.
{"May","мая"}.
@@ -195,13 +208,12 @@
{"Memory","Память"}.
{"Message body","Тело сообщения"}.
{"Message not found in forwarded payload","Сообщение не найдено в пересылаемом вложении"}.
{"Messages from strangers are rejected","Сообщения от незнакомцев запрещены"}.
{"Middle Name","Отчество"}.
{"Moderator privileges required","Требуются права модератора"}.
{"Modified modules","Изменённые модули"}.
{"Module failed to handle the query","Ошибка модуля при обработке запроса"}.
{"Modules at ~p","Модули на ~p"}.
{"Modules","Модули"}.
{"Module","Модуль"}.
{"Monday","Понедельник"}.
{"Multicast","Мультикаст"}.
{"Multiple <item/> elements are not allowed by RFC6121","Множественные элементы <item/> запрещены стандартом RFC6121"}.
@@ -212,23 +224,34 @@
{"Neither 'role' nor 'affiliation' attribute found","Не найден атрибут 'role' или 'affiliation'"}.
{"Never","Никогда"}.
{"New Password:","Новый пароль:"}.
{"Nickname can't be empty","Псевдоним не может быть пустым значением"}.
{"Nickname Registration at ","Регистрация псевдонима на "}.
{"Nickname ~s does not exist in the room","Псевдоним ~s в комнате отсутствует"}.
{"Nickname","Псевдоним"}.
{"No 'access' found in data form","Не найден 'access' в форме данных"}.
{"No 'acls' found in data form","Не найден 'acls' в форме данных"}.
{"No address elements found","Не найден элемент <address/>"}.
{"No addresses element found","Не найден элемент <addresses/>"}.
{"No 'affiliation' attribute found","Не найден атрибут 'affiliation'"}.
{"No available resource found","Нет доступных ресурсов"}.
{"No body provided for announce message","Тело объявления не должно быть пустым"}.
{"No child elements found","Нет дочерних элементов"}.
{"No data form found","Форма данных не найдена"}.
{"No Data","Нет данных"}.
{"Node already exists","Узел уже существует"}.
{"Node index not found","Индекс узла не найден"}.
{"Node not found","Узел не найден"}.
{"Nodeprep has failed","Ошибка применения профиля Nodeprep"}.
{"Node ~p","Узел ~p"}.
{"Nodes","Узлы"}.
{"No features available","Свойства недоступны"}.
{"No <forwarded/> element found","Не найден элемент <forwarded/>"}.
{"No hook has processed this command","Ни один из хуков не выполнил эту команду"}.
{"No info about last activity found","Не найдено информации о последней активности"}.
{"No 'item' element found","Элемент 'item' не найден"}.
{"No items found in this query","Не найдены элементы в этом запросе"}.
{"No limit","Не ограничено"}.
{"No module is handling this query","Нет модуля который бы обработал этот запрос"}.
{"No 'modules' found in data form","Не найден 'modules' в форме данных"}.
{"None","Нет"}.
{"No node specified","Узел не указан"}.
{"No 'password' found in data form","Не найден 'password' в форме данных"}.
{"No 'password' found in this query","Не найден 'password' в этом запросе"}.
@@ -239,15 +262,9 @@
{"No running node found","Нет работающих узлов"}.
{"No services available","Нет доступных сервисов"}.
{"No statistics found for this item","Не найдено статистики для этого элемента"}.
{"No 'to' attribute found in the invitation","Не найден атрибут 'to' в этом приглашении"}.
{"Node already exists","Узел уже существует"}.
{"Node index not found","Индекс узла не найден"}.
{"Node not found","Узел не найден"}.
{"Node ~p","Узел ~p"}.
{"Nodeprep has failed","Ошибка применения профиля Nodeprep"}.
{"Nodes","Узлы"}.
{"None","Нет"}.
{"Not allowed","Недопустимо"}.
{"Not Found","Не Найдено"}.
{"No 'to' attribute found in the invitation","Не найден атрибут 'to' в этом приглашении"}.
{"Not subscribed","Нет подписки"}.
{"November","ноября"}.
{"Number of online users","Количество подключённых пользователей"}.
@@ -269,12 +286,12 @@
{"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-соединения"}.
{"Owner privileges required","Требуются права владельца"}.
{"Packet relay is denied by service policy","Пересылка пакетов запрещена политикой службы"}.
{"Packet","Пакет"}.
{"Parse failed","Ошибка разбора"}.
{"Password Verification","Проверка пароля"}.
@@ -290,18 +307,21 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Заметьте, что здесь производится резервное копирование только встроенной базы данных Mnesia. Если Вы также используете другое хранилище данных (например с помощью модуля ODBC), то его резервное копирование следует осуществлять отдельно."}.
{"Please, wait for a while before sending new voice request","Пожалуйста, подождите перед тем как подать новый запрос на право голоса"}.
{"Pong","Понг"}.
{"Port","Порт"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Включение атрибута 'ask' запрещено стандартом RFC6121"}.
{"Previous session not found","Предыдущая сессия не найдена"}.
{"Previous session PID has been killed","Предыдущая сессия была убита"}.
{"Previous session PID has exited","Процесс предыдущей сессии завершён"}.
{"Previous session PID is dead","Предыдущая сессия мертва"}.
{"Previous session PID not found","Не найден идентификатор процесса предыдущей сессии"}.
{"Previous session timed out","Предыдущая сессия не отвечает"}.
{"private, ","приватная, "}.
{"Protocol","Протокол"}.
{"Publishing items to collection node is not allowed","Недоступна публикация элементов в коллекцию узлов"}.
{"Publish-Subscribe","Публикация-Подписка"}.
{"PubSub subscriber request","Запрос подписчика PubSub"}.
{"Push record not found","Push-запись не найдена"}.
{"Queries to the conference members are not allowed in this room","Запросы к пользователям в этой конференции запрещены"}.
{"Query to another users is forbidden","Запрос к другим пользователям запрещён"}.
{"RAM and disc copy","ОЗУ и диск"}.
{"RAM copy","ОЗУ"}.
{"Raw","Необработанный формат"}.
{"Really delete message of the day?","Действительно удалить сообщение дня?"}.
{"Recipient is not in the conference room","Адресата нет в конференции"}.
{"Register a Jabber account","Зарегистрировать Jabber-аккаунт"}.
@@ -313,6 +333,7 @@
{"Remove User","Удалить пользователя"}.
{"Remove","Удалить"}.
{"Replaced by new connection","Заменено новым соединением"}.
{"Request has timed out","Истекло время ожидания запроса"}.
{"Resources","Ресурсы"}.
{"Restart Service","Перезапустить службу"}.
{"Restart","Перезапустить"}.
@@ -325,6 +346,7 @@
{"Room creation is denied by service policy","Cоздавать конференцию запрещено политикой службы"}.
{"Room description","Описание комнаты"}.
{"Room Occupants","Участники комнаты"}.
{"Room terminates","Комната остановлена"}.
{"Room title","Название комнаты"}.
{"Roster module has failed","Ошибка модуля roster"}.
{"Roster of ","Ростер пользователя "}.
@@ -332,13 +354,12 @@
{"Roster","Ростер"}.
{"RPC Call Error","Ошибка вызова RPC"}.
{"Running Nodes","Работающие узлы"}.
{"~s access rule configuration","Конфигурация правила доступа ~s"}.
{"~s invites you to the room ~s","~s приглашает вас в комнату ~s"}.
{"Saturday","Суббота"}.
{"Scan failed","Ошибка сканирования"}.
{"Script check","Проверка сценария"}.
{"Search Results for ","Результаты поиска в "}.
{"Search users in ","Поиск пользователей в "}.
{"Select All","Выбрать всё"}.
{"Send announcement to all online users on all hosts","Разослать объявление всем подключённым пользователям на всех виртуальных серверах"}.
{"Send announcement to all online users","Разослать объявление всем подключённым пользователям"}.
{"Send announcement to all users on all hosts","Разослать объявление всем пользователям на всех виртуальных серверах"}.
@@ -346,17 +367,19 @@
{"September","сентября"}.
{"Server connections to local subdomains are forbidden","Серверные соединения с локальными поддоменами запрещены"}.
{"Server:","Сервер:"}.
{"Session state copying timed out","Таймаут копирования состояния сессии"}.
{"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"}.
{"SOCKS5 Bytestreams","Передача файлов через SOCKS5"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Некоторые Jabber-клиенты могут сохранять пароль на Вашем компьютере. Используйте эту функцию только в том случае, если считаете это безопасным."}.
{"~s's Offline Messages Queue","Oчередь офлайновых сообщений ~s"}.
{"Start Modules at ","Запуск модулей на "}.
{"Start Modules","Запуск модулей"}.
{"Start","Запустить"}.
{"Statistics of ~p","статистика узла ~p"}.
{"Statistics","Статистика"}.
{"Stop Modules at ","Остановка модулей на "}.
@@ -366,6 +389,8 @@
{"Storage Type","Тип таблицы"}.
{"Store binary backup:","Сохранить бинарную резервную копию:"}.
{"Store plain text backup:","Сохранить текстовую резервную копию:"}.
{"Stream management is already enabled","Управление потоком уже активировано"}.
{"Stream management is not enabled","Управление потоком не активировано"}.
{"Subject","Тема"}.
{"Submitted","Отправлено"}.
{"Submit","Отправить"}.
@@ -374,35 +399,46 @@
{"Sunday","Воскресенье"}.
{"That nickname is already in use by another occupant","Этот псевдоним уже занят другим участником"}.
{"That nickname is registered by another person","Этот псевдоним зарегистрирован кем-то другим"}.
{"The account already exists","Учётная запись уже существует"}.
{"The account was not deleted","Аккаунт не был удален"}.
{"The CAPTCHA is valid.","Проверка капчи прошла успешно."}.
{"The CAPTCHA verification has failed","Проверка капчи не пройдена"}.
{"The captcha you entered is wrong","Неправильно введённое значение капчи"}.
{"The feature requested is not supported by the conference","Запрашиваемое свойство не поддерживается этой конференцией"}.
{"The password contains unacceptable characters","Пароль содержит недопустимые символы"}.
{"The password is too weak","Слишком слабый пароль"}.
{"the password is","пароль:"}.
{"The password of your Jabber account was successfully changed.","Пароль Вашего Jabber-аккаунта был успешно изменен."}.
{"The passwords are different","Пароли не совпадают"}.
{"The password was not changed","Пароль не был изменён"}.
{"The query is only allowed from local users","Запрос доступен только для локальных пользователей"}.
{"The query must not contain <item/> elements","Запрос не должен содержать элементов <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Строфа может содержать только один элемент <active/>, один элемент <default/> или один элемент <list/>"}.
{"There was an error changing the password: ","Ошибка при смене пароля:"}.
{"There was an error creating the account: ","Ошибка при создании аккаунта:"}.
{"There was an error deleting the account: ","Ошибка при удалении аккаунта:"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Строфа может содержать только один элемент <active/>, один элемент <default/> или один элемент <list/>"}.
{"The username is not valid","Недопустимое имя пользователя"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Регистр не имеет значения: \"маша\" и \"МАША\" будет считаться одним и тем же именем."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Здесь Вы можете создать Jabber-аккаунт на этом Jabber-сервере. Ваш JID (Jabber-идентификатор) будет в виде: \"пользователь@сервер\". Пожалуйста, внимательно читайте инструкции для правильного заполнения полей."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Здесь Вы можете удалить Jabber-аккаунт с этого сервера."}.
{"This room is not anonymous","Эта комната не анонимная"}.
{"This service can not process the address: ~s","Сервер не может обработать адрес: ~s"}.
{"Thursday","Четверг"}.
{"Time delay","По истечение"}.
{"Timed out waiting for stream resumption","Истекло время ожидания возобновления потока"}.
{"Time","Время"}.
{"To register, visit ~s","Для регистрации посетите ~s"}.
{"To ~s","К ~s"}.
{"Token TTL","Токен TTL"}.
{"Too many active bytestreams","Слишком много активных потоков данных"}.
{"Too many CAPTCHA requests","Слишком много запросов капчи"}.
{"Too many child elements","Слишком много дочерних элементов"}.
{"Too many <item/> elements","Слишком много элементов <item/>"}.
{"Too many <list/> elements","Слишком много элементов <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Слишком много (~p) неудачных попыток аутентификации с этого IP-адреса (~s). Адрес будет разблокирован в ~s UTC"}.
{"Too many receiver fields were specified","Указано слишком много получателей"}.
{"Too many unacked stanzas","Слишком много неподтверждённых пакетов"}.
{"Too many users in this conference","Слишком много пользователей в этой конференции"}.
{"To register, visit ~s","Для регистрации посетите ~s"}.
{"To ~s","К ~s"}.
{"Total rooms","Все комнаты"}.
{"To","Кому"}.
{"Traffic rate limit is exceeded","Превышен лимит скорости посылки информации"}.
@@ -415,9 +451,12 @@
{"Unable to register route on existing local domain","Нельзя регистрировать маршруты на существующие локальные домены"}.
{"Unauthorized","Не авторизован"}.
{"Unexpected action","Неожиданное действие"}.
{"Unexpected error condition: ~p","Неожиданная ошибка: ~p"}.
{"Unregister a Jabber account","Удалить Jabber-аккаунт"}.
{"Unregister","Удалить"}.
{"Unselect All","Снять всё выделение"}.
{"Unsupported <index/> element","Элемент <index/> не поддерживается"}.
{"Unsupported version","Неподдерживаемая версия"}.
{"Update message of the day (don't send)","Обновить сообщение дня (не рассылать)"}.
{"Update message of the day on all hosts (don't send)","Обновить сообщение дня на всех виртуальных серверах (не рассылать)"}.
{"Update plan","План обновления"}.
@@ -428,14 +467,14 @@
{"User already exists","Пользователь уже существует"}.
{"User (jid)","Пользователь (XMPP адрес)"}.
{"User Management","Управление пользователями"}.
{"User part of JID in 'from' is empty","Пустое имя пользователя в XMPP-адресе"}.
{"Username:","Имя пользователя:"}.
{"User removed","Пользователь удалён"}.
{"Users are not allowed to register accounts so quickly","Пользователи не могут регистрировать учётные записи так быстро"}.
{"User session not found","Сессия пользователя не найдена"}.
{"User session terminated","Сессия пользователя завершена"}.
{"User ~s","Пользователь ~s"}.
{"Username:","Имя пользователя:"}.
{"Users are not allowed to register accounts so quickly","Пользователи не могут регистрировать учётные записи так быстро"}.
{"Users Last Activity","Статистика последнего подключения пользователей"}.
{"Users","Пользователи"}.
{"User ~s","Пользователь ~s"}.
{"User","Пользователь"}.
{"Validate","Утвердить"}.
{"Value 'get' of 'type' attribute is not allowed","Значение 'get' атрибута 'type' недопустимо"}.
@@ -444,12 +483,17 @@
{"Value of '~s' should be integer","Значение '~s' должно быть целочисленным"}.
{"Value 'set' of 'type' attribute is not allowed","Значение 'set' атрибута 'type' недопустимо"}.
{"vCard User Search","Поиск пользователей по vCard"}.
{"Virtual Hosting","Виртуальный хостинг"}.
{"Virtual Hosts","Виртуальные хосты"}.
{"Visitors are not allowed to change their nicknames in this room","Посетителям запрещено изменять свои псевдонимы в этой комнате"}.
{"Visitors are not allowed to send messages to all occupants","Посетителям не разрешается посылать сообщения всем присутствующим"}.
{"Voice requests are disabled in this conference","Запросы на право голоса отключены в этой конференции"}.
{"Voice request","Запрос на право голоса"}.
{"Wednesday","Среда"}.
{"Wrong parameters in the web formulary","Недопустимые параметры веб-формы"}.
{"Wrong xmlns","Неправильный xmlns"}.
{"You are being removed from the room because of a system shutdown","Вы покинули комнату из-за останова системы"}.
{"You are not joined to the channel","Вы не присоединены к каналу"}.
{"You can later change your password using a Jabber client.","Позже Вы можете изменить пароль через Jabber-клиент."}.
{"You have been banned from this room","Вам запрещено входить в эту конференцию"}.
{"You have joined too many conferences","Вы присоединены к слишком большому количеству конференций"}.
@@ -459,7 +503,7 @@
{"You need an x:data capable client to search","Чтобы воспользоваться поиском, требуется x:data-совместимый клиент"}.
{"Your active privacy list has denied the routing of this stanza.","Маршрутизация этой строфы запрещена вашим активным списком приватности."}.
{"Your contact offline message queue is full. The message has been discarded.","Очередь недоставленных сообщений Вашего адресата переполнена. Сообщение не было сохранено."}.
{"You're not allowed to create nodes","Вам не разрешается создавать узлы"}.
{"Your Jabber account was successfully created.","Ваш Jabber-аккаунт был успешно создан."}.
{"Your Jabber account was successfully deleted.","Ваш Jabber-аккаунт был успешно удален."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ваши сообщения к ~s блокируются. Для снятия блокировки перейдите по ссылке ~s"}.
{"You're not allowed to create nodes","Вам не разрешается создавать узлы"}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Ваши запросы на добавление в контакт-лист, а также сообщения к ~s блокируются. Для снятия блокировки перейдите по ссылке ~s"}.
+797 -709
View File
File diff suppressed because it is too large Load Diff
+25 -40
View File
@@ -1,20 +1,13 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: ","zmenil(a) tému na: "}.
{"A password is required to enter this room","Pre vstup do miestnosti je potrebné heslo"}.
{"Access Configuration","Konfigurácia prístupu"}.
{"Access Control List Configuration","Konfigurácia zoznamu prístupových oprávnení (ACL)"}.
{"Access Control Lists","Zoznamy prístupových oprávnení (ACL)"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Prístup bol zamietnutý nastavením služby"}.
{"Access Rules","Prístupové pravidlá"}.
{"Action on user","Operácia aplikovaná na užívateľa"}.
{"Add Jabber ID","Pridať Jabber ID"}.
{"Add New","Pridať nový"}.
{"Add User","Pridať používateľa"}.
{"Administration of ","Administrácia "}.
{"Administration","Administrácia"}.
{"Administration of ","Administrácia "}.
{"Administrator privileges required","Sú potrebné práva administrátora"}.
{"All activity","Všetky aktivity"}.
{"All Users","Všetci užívatelia"}.
{"Allow users to change the subject","Povoliť užívateľom meniť tému"}.
{"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"}.
@@ -22,7 +15,9 @@
{"Allow visitors to change nickname","Návštevníci môžu meniť prezývky"}.
{"Allow visitors to send private messages to","Povoliť užívateľom odosielať súkromné správy"}.
{"Allow visitors to send status text in presence updates","Návštevníci môžu posielať textové informácie v stavových správach"}.
{"All Users","Všetci užívatelia"}.
{"Announcements","Oznámenia"}.
{"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"}.
@@ -47,13 +42,13 @@
{"City","Mesto"}.
{"Commands","Príkazy"}.
{"Conference room does not exist","Diskusná miestnosť neexistuje"}.
{"Configuration of room ~s","Konfigurácia miestnosti ~s"}.
{"Configuration","Konfigurácia"}.
{"Configuration of room ~s","Konfigurácia miestnosti ~s"}.
{"Connected Resources:","Pripojené zdroje:"}.
{"Country","Krajina"}.
{"CPU Time:","Čas procesoru"}.
{"Database Tables Configuration at ","Konfigurácia databázových tabuliek "}.
{"Database","Databáza"}.
{"Database Tables Configuration at ","Konfigurácia databázových tabuliek "}.
{"December","December"}.
{"Default users as participants","Užívatelia sú implicitne členmi"}.
{"Delete message of the day on all hosts","Zmazať správu dňa na všetkých serveroch"}.
@@ -91,10 +86,9 @@
{"Failed to extract JID from your voice request approval","Nepodarilo sa nájsť JID v súhlase o Voice."}.
{"Family Name","Priezvisko"}.
{"February","Február"}.
{"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)"}.
{"Friday","Piatok"}.
{"From ~s","Od ~s"}.
{"From","Od"}.
{"From ~s","Od ~s"}.
{"Full Name","Celé meno: "}.
{"Get Number of Online Users","Zobraziť počet pripojených užívateľov"}.
{"Get Number of Registered Users","Zobraziť počet registrovaných užívateľov"}.
@@ -104,10 +98,11 @@
{"Group ","Skupina "}.
{"Groups","Skupiny"}.
{"has been banned","bol(a) zablokovaný(á)"}.
{"has been kicked because of a system shutdown","bol vyhodený(á) kvôli reštartu systému"}.
{"has been kicked because of an affiliation change","bol vyhodený(á) kvôli zmene priradenia"}.
{"has been kicked because of a system shutdown","bol vyhodený(á) kvôli reštartu systému"}.
{"has been kicked because the room has been changed to members-only","bol vyhodený(á), pretože miestnosť bola vyhradená len pre členov"}.
{"has been kicked","bol(a) vyhodený(á) z miestnosti"}.
{" has set the subject to: ","zmenil(a) tému na: "}.
{"Host","Server"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Pokiaľ nevidíte obrázok CAPTCHA, navštívte webovú stránku."}.
{"Import Directory","Import adresára"}.
@@ -121,11 +116,10 @@
{"Improper message type","Nesprávny typ správy"}.
{"Incorrect password","Nesprávne heslo"}.
{"IP addresses","IP adresa"}.
{"IP","IP"}.
{"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"}.
{"It is not allowed to send private messages","Nieje povolené posielať súkromné správy"}.
{"Jabber Account Registration","Registrácia jabber účtu"}.
{"Jabber ID","Jabber ID"}.
{"January","Január"}.
@@ -138,8 +132,6 @@
{"Last year","Posledný rok"}.
{"leaves the room","odišiel(a) z miestnosti"}.
{"List of modules to start","Zoznam modulov, ktoré majú byť spustené"}.
{"Listened Ports at ","Otvorené porty na "}.
{"Listened Ports","Otvorené portov"}.
{"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"}.
@@ -159,20 +151,20 @@
{"Middle Name","Prostredné meno: "}.
{"Moderator privileges required","Sú potrebné práva moderátora"}.
{"Modified modules","Modifikované moduly"}.
{"Module","Modul"}.
{"Modules","Moduly"}.
{"Monday","Pondelok"}.
{"Name","Meno"}.
{"Name:","Meno:"}.
{"Never","Nikdy"}.
{"New Password:","Nové heslo:"}.
{"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"}.
{"Nickname","Prezývka"}.
{"No body provided for announce message","Správa neobsahuje text"}.
{"No Data","Žiadne dáta"}.
{"Node not found","Uzol nenájdený"}.
{"Nodes","Uzly"}.
{"No limit","Bez limitu"}.
{"None","Nič"}.
{"Not Found","Nebol nájdený"}.
{"November","November"}.
@@ -183,26 +175,25 @@
{"Offline Messages:","Offline správy"}.
{"OK","OK"}.
{"Old Password:","Staré heslo:"}.
{"Online","Online"}.
{"Online Users:","Online používatelia:"}.
{"Online Users","Online užívatelia"}.
{"Online","Online"}.
{"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 can approve voice requests","Len moderátori môžu schváliť žiadosť o Voice"}.
{"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"}.
{"Options","Nastavenia"}.
{"Organization Name","Meno organizácie: "}.
{"Organization Unit","Organizačná jednotka: "}.
{"Outgoing s2s Connections","Odchádzajúce s2s spojenia"}.
{"Outgoing s2s Connections:","Odchádzajúce s2s spojenia:"}.
{"Owner privileges required","Sú vyžadované práva vlastníka"}.
{"Packet","Paket"}.
{"Password Verification","Overenie hesla"}.
{"Password Verification:","Overenie hesla"}.
{"Password","Heslo"}.
{"Password:","Heslo:"}.
{"Password Verification","Overenie hesla"}.
{"Password Verification:","Overenie hesla"}.
{"Path to Dir","Cesta k adresáru"}.
{"Path to File","Cesta k súboru"}.
{"Pending","Čakajúce"}.
@@ -211,15 +202,12 @@
{"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."}.
{"Please, wait for a while before sending new voice request","Prosím počkate, predtým než pošlete novú žiadosť o Voice"}.
{"Pong","Pong"}.
{"Port","Port"}.
{"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","Surové dáta"}.
{"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"}.
{"Register a Jabber account","Zaregistrovať Jabber účet"}.
@@ -228,17 +216,17 @@
{"Register","Zoznam kontaktov"}.
{"Remote copy","Vzdialená kópia"}.
{"Remove All Offline Messages","Odstrániť všetky offline správy"}.
{"Remove User","Odstrániť užívateľa"}.
{"Remove","Odstrániť"}.
{"Remove User","Odstrániť užívateľa"}.
{"Replaced by new connection","Nahradené novým spojením"}.
{"Resources","Zdroje"}.
{"Restart Service","Reštartovať službu"}.
{"Restart","Reštart"}.
{"Restart Service","Reštartovať službu"}.
{"Restore Backup from File at ","Obnoviť zálohu zo súboru na "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Obnoviť binárnu zálohu pri nasledujúcom reštarte ejabberd (vyžaduje menej pamäte)"}.
{"Restore binary backup immediately:","Okamžite obnoviť binárnu zálohu:"}.
{"Restore plain text backup immediately:","Okamžite obnoviť zálohu z textového súboru:"}.
{"Restore","Obnoviť"}.
{"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"}.
@@ -249,16 +237,14 @@
{"Roster","Zoznam kontaktov"}.
{"RPC Call Error","Chyba RPC volania"}.
{"Running Nodes","Bežiace uzly"}.
{"~s access rule configuration","~s konfigurácia prístupového pravidla"}.
{"~s invites you to the room ~s","~s Vás pozýva do miestnosti ~s"}.
{"Saturday","Sobota"}.
{"Script check","Kontrola skriptu"}.
{"Search Results for ","Hľadať výsledky pre "}.
{"Search users in ","Hľadať užívateľov v "}.
{"Send announcement to all online users on all hosts","Odoslať oznam všetkým online používateľom na všetkých serveroch"}.
{"Send announcement to all online users","Odoslať zoznam všetkým online 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"}.
{"Send announcement to all online users on all hosts","Odoslať oznam všetkým online používateľom na všetkých serveroch"}.
{"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"}.
{"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"}.
@@ -266,11 +252,11 @@
{"Show Integral Table","Zobraziť kompletnú tabuľku"}.
{"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"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Niektorí Jabber klenti môžu ukladať heslá v počítači. Používajte túto funkciu len ak veríte, že sú tam v bezpečí. "}.
{"~s's Offline Messages Queue","~s Offline správy"}.
{"Start Modules at ","Spustiť moduly na "}.
{"Start Modules","Spustiť moduly"}.
{"Start","Štart"}.
{"Statistics of ~p","Štatistiky ~p"}.
{"Statistics","Štatistiky"}.
{"Stop Modules at ","Zastaviť moduly na "}.
@@ -289,8 +275,8 @@
{"That nickname is registered by another person","Prezývka je už zaregistrovaná inou osobou"}.
{"The CAPTCHA is valid.","Platná CAPTCHA."}.
{"The CAPTCHA verification has failed","Overenie pomocou CAPTCHA zlihalo"}.
{"The password is too weak","heslo je"}.
{"the password is","heslo je"}.
{"The password is too weak","heslo je"}.
{"The password of your Jabber account was successfully changed.","Heslo k Jabber účtu bolo úspešne zmenené."}.
{"There was an error changing the password: ","Pri zmene hesla nastala chyba: "}.
{"There was an error creating the account: ","Pri vytváraní účtu nastala chyba: "}.
@@ -300,11 +286,11 @@
{"This page allows to unregister a Jabber account in this Jabber server.","Na tejto stránke si môžete zrušiť Jabber účet registrovaný na tomto serveri."}.
{"This room is not anonymous","Táto miestnosť nie je anonymná"}.
{"Thursday","Štvrtok"}.
{"Time delay","Časový posun"}.
{"Time","Čas"}.
{"To ~s","Pre ~s"}.
{"Time delay","Časový posun"}.
{"Too many CAPTCHA requests","Príliš veľa žiadostí o CAPTCHA"}.
{"To","Pre"}.
{"To ~s","Pre ~s"}.
{"Traffic rate limit is exceeded","Bol prekročený prenosový limit"}.
{"Transactions Aborted:","Transakcie zrušená"}.
{"Transactions Committed:","Transakcie potvrdená"}.
@@ -315,11 +301,11 @@
{"Unauthorized","Neautorizovaný"}.
{"Unregister a Jabber account","Zrušiť Jabber účet"}.
{"Unregister","Zrušiť účet"}.
{"Update","Aktualizovať"}.
{"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"}.
{"Update script","Aktualizované skripty"}.
{"Update","Aktualizovať"}.
{"Uptime:","Uptime:"}.
{"User Management","Správa užívateľov"}.
{"Username:","IRC prezývka"}.
@@ -345,4 +331,3 @@
{"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 Jabber account was successfully created.","Jabber účet bol úspešne vytvorený."}.
{"Your Jabber account was successfully deleted.","Váš Jabber účet bol úspešne odstránený."}.
{"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"}.
+775 -657
View File
File diff suppressed because it is too large Load Diff
+20 -35
View File
@@ -1,31 +1,26 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," har satt ämnet till: "}.
{"Access Configuration","Åtkomstkonfiguration"}.
{"Access Control List Configuration","Konfiguera ACL"}.
{"Access Control Lists","ACL"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Åtkomst nekad enligt lokal policy"}.
{"Access Rules","Åtkomstregler"}.
{"Action on user","Handling mot användare"}.
{"Add Jabber ID","Lägg till Jabber ID"}.
{"Add New","Lägg till ny"}.
{"Add User","Lägg till användare"}.
{"Administration of ","Administration av "}.
{"Administration","Administration"}.
{"Administration of ","Administration av "}.
{"Administrator privileges required","Administrationsprivilegier krävs"}.
{"All activity","All aktivitet"}.
{"All Users","Alla användare"}.
{"Allow users to change the subject","Tillåt användare att byta ämne"}.
{"Allow users to query other users","Tillåt användare att söka efter andra användare"}.
{"Allow users to send invites","Tillåt användare att skicka inbjudningar"}.
{"Allow users to send private messages","Tillåt användare att skicka privata meddelanden"}.
{"Allow visitors to change nickname","Tillåt gäster att kunna ändra smeknamn"}.
{"Allow visitors to send status text in presence updates","Tillåt gäster att skicka statustext som uppdatering"}.
{"All Users","Alla användare"}.
{"Announcements","Meddelanden"}.
{"April","April"}.
{"August","Augusti"}.
{"Backup Management","Hantera säkerhetskopior"}.
{"Backup to File at ","Säkerhetskopiera till fil på "}.
{"Backup","Säkerhetskopiera"}.
{"Backup to File at ","Säkerhetskopiera till fil på "}.
{"Bad format","Dåligt format"}.
{"Birthday","Födelsedag"}.
{"Change Password","Ändra lösenord"}.
@@ -39,13 +34,13 @@
{"City","Stad"}.
{"Commands","Kommandon"}.
{"Conference room does not exist","Rummet finns inte"}.
{"Configuration of room ~s","Konfiguration för ~s"}.
{"Configuration","Konfiguration"}.
{"Configuration of room ~s","Konfiguration för ~s"}.
{"Connected Resources:","Anslutna resurser:"}.
{"Country","Land"}.
{"CPU Time:","CPU tid"}.
{"Database Tables Configuration at ","Databastabellers konfiguration"}.
{"Database","Databas"}.
{"Database Tables Configuration at ","Databastabellers konfiguration"}.
{"December","December"}.
{"Default users as participants","Gör om användare till deltagare"}.
{"Delete message of the day on all hosts","Ta bort dagens meddelande på alla värdar"}.
@@ -80,10 +75,9 @@
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportera data av användare i en host till PIEFXIS fil (XEP-0227):"}.
{"Family Name","Efternamn"}.
{"February","Februari"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Fyll i formuläret för att söka efter en användare (lägg till * på slutet av fältet för att hitta alla som börjar så)"}.
{"Friday","Fredag"}.
{"From ~s","Från ~s"}.
{"From","Från"}.
{"From ~s","Från ~s"}.
{"Full Name","Fullständigt namn"}.
{"Get Number of Online Users","Hämta antal inloggade användare"}.
{"Get Number of Registered Users","Hämta antal registrerade användare"}.
@@ -93,10 +87,11 @@
{"Group ","Grupp "}.
{"Groups","Grupper"}.
{"has been banned","har blivit bannad"}.
{"has been kicked because of a system shutdown","har blivit kickad p.g.a en systemnerstängning"}.
{"has been kicked because of an affiliation change","har blivit kickad p.g.a en ändring av tillhörighet"}.
{"has been kicked because of a system shutdown","har blivit kickad p.g.a en systemnerstängning"}.
{"has been kicked because the room has been changed to members-only","har blivit kickad p.g.a att rummet har ändrats till endast användare"}.
{"has been kicked","har blivit kickad"}.
{" has set the subject to: "," har satt ämnet till: "}.
{"Host","Server"}.
{"Import Directory","Importera katalog"}.
{"Import File","Importera fil"}.
@@ -109,11 +104,10 @@
{"Improper message type","Felaktig medelandetyp"}.
{"Incorrect password","Fel lösenord"}.
{"IP addresses","IP adresser"}.
{"IP","IP"}.
{"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"}.
{"It is not allowed to send private messages","Det ar inte tillåtet att skicka privata meddelanden"}.
{"Jabber ID","Jabber ID"}.
{"January","Januari"}.
{"joins the room","joinar rummet"}.
@@ -125,8 +119,6 @@
{"Last year","Senaste året"}.
{"leaves the room","lämnar rummet"}.
{"List of modules to start","Lista av moduler som skall startas"}.
{"Listened Ports at ","Lyssnande portar på "}.
{"Listened Ports","Lyssnarport"}.
{"Low level update script","Uppdaterade laglevel skript"}.
{"Make participants list public","Gör deltagarlistan publik"}.
{"Make room members-only","Gör om rummet till endast medlemmar"}.
@@ -144,7 +136,6 @@
{"Middle Name","Mellannamn"}.
{"Moderator privileges required","Moderatorprivilegier krävs"}.
{"Modified modules","Uppdaterade moduler"}.
{"Module","Modul"}.
{"Modules","Moduler"}.
{"Monday","Måndag"}.
{"Name","Namn"}.
@@ -157,6 +148,7 @@
{"No Data","Ingen data"}.
{"Node not found","Noden finns inte"}.
{"Nodes","Noder"}.
{"No limit","Ingen gräns"}.
{"None","Inga"}.
{"Not Found","Noden finns inte"}.
{"November","November"}.
@@ -166,23 +158,22 @@
{"Offline Messages","Offline meddelanden"}.
{"Offline Messages:","Offline meddelanden:"}.
{"OK","OK"}.
{"Online","Ansluten"}.
{"Online Users","Anslutna användare"}.
{"Online Users:","Inloggade användare"}.
{"Online","Ansluten"}.
{"Only moderators and participants are allowed to change the subject in this room","Endast moderatorer och deltagare har tillåtelse att ändra ämnet i det här rummet"}.
{"Only occupants are allowed to send messages to the conference","Utomstående får inte skicka medelanden till den här konferensen"}.
{"Only occupants are allowed to send queries to the conference","Utomstående får inte skicka iq-queries till den här konferensen"}.
{"Only service administrators are allowed to send service messages","Endast administratörer får skicka tjänstmeddelanden"}.
{"Options","Parametrar"}.
{"Organization Name","Organisationsnamn"}.
{"Organization Unit","Organisationsenhet"}.
{"Outgoing s2s Connections","Utgaende s2s anslutning"}.
{"Outgoing s2s Connections:","Utgående s2s anslutning"}.
{"Owner privileges required","Ägarprivilegier krävs"}.
{"Packet","Paket"}.
{"Password Verification","Lösenordsverifikation"}.
{"Password","Lösenord"}.
{"Password:","Lösenord:"}.
{"Password Verification","Lösenordsverifikation"}.
{"Path to Dir","Sökväg till katalog"}.
{"Path to File","Sökväg till fil"}.
{"Pending","Ännu inte godkända"}.
@@ -190,42 +181,37 @@
{"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","Port"}.
{"private, ","privat, "}.
{"Protocol","Protocol"}.
{"Publish-Subscribe","Publikprenumeration"}.
{"PubSub subscriber request","Pubsub prenumerationsforfrågan"}.
{"Queries to the conference members are not allowed in this room","Det är förbjudet att skicka iq-queries till konferensdeltagare"}.
{"RAM and disc copy","RAM- och diskkopia"}.
{"RAM copy","RAM-kopia"}.
{"Raw","Ra"}.
{"Really delete message of the day?","Verkligen ta bort dagens meddelanden?"}.
{"Recipient is not in the conference room","Mottagaren finns inte i rummet"}.
{"Registered Users","Registrerade användare"}.
{"Registered Users:","Registrerade användare"}.
{"Remote copy","Sparas inte lokalt"}.
{"Remove User","Ta bort användare"}.
{"Remove","Ta bort"}.
{"Remove User","Ta bort användare"}.
{"Replaced by new connection","Ersatt av ny anslutning"}.
{"Resources","Resurser"}.
{"Restart Service","Starta om servicen"}.
{"Restart","Omstart"}.
{"Restart Service","Starta om servicen"}.
{"Restore","Återställ"}.
{"Restore Backup from File at ","Återställ säkerhetskopia från fil på "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","återställ den binära backupen efter nästa ejabberd omstart"}.
{"Restore binary backup immediately:","återställ den binära backupen omedelbart"}.
{"Restore plain text backup immediately:","återställ textbackup omedelbart"}.
{"Restore","Återställ"}.
{"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","Kontaktlista"}.
{"Roster of ","Kontaktlista för "}.
{"Roster size","Roster storlek"}.
{"Roster","Kontaktlista"}.
{"RPC Call Error","RPC Uppringningserror"}.
{"Running Nodes","Körande noder"}.
{"~s access rule configuration","Åtkomstregelkonfiguration för ~s"}.
{"~s invites you to the room ~s","~s bjöd in dig till rummet ~s"}.
{"Saturday","Lördag"}.
{"Script check","Skript kollat"}.
{"Search Results for ","Sökresultat för"}.
@@ -241,10 +227,10 @@
{"Show Integral Table","Visa kumulativ tabell"}.
{"Show Ordinary Table","Visa normal tabell"}.
{"Shut Down Service","Stäng ner servicen"}.
{"~s invites you to the room ~s","~s bjöd in dig till rummet ~s"}.
{"~s's Offline Messages Queue","~s's offline meddelandekö"}.
{"Start Modules at ","Starta moduler på "}.
{"Start Modules","Starta moduler"}.
{"Start","Starta"}.
{"Statistics of ~p","Statistik på ~p"}.
{"Statistics","Statistik"}.
{"Stop Modules at ","Stoppa moduler på "}.
@@ -281,11 +267,11 @@
{"Update script","Uppdatera skript"}.
{"Update","Uppdatera"}.
{"Uptime:","Tid upp"}.
{"User Management","Användarmanagement"}.
{"User","Användarnamn"}.
{"User Management","Användarmanagement"}.
{"Users","Användare"}.
{"Users are not allowed to register accounts so quickly","Det är inte tillåtet för användare att skapa konton så fort"}.
{"Users Last Activity","Användarens senaste aktivitet"}.
{"Users","Användare"}.
{"Validate","Validera"}.
{"vCard User Search","vCard användare sök"}.
{"Virtual Hosts","Virtuella servrar"}.
@@ -296,4 +282,3 @@
{"You must fill in field \"Nickname\" in the form","Du måste fylla i fält \"smeknamn\" i formen"}.
{"You need an x:data capable client to 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"}.
+774 -657
View File
File diff suppressed because it is too large Load Diff
+6 -18
View File
@@ -1,10 +1,5 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," ตั้งหัวข้อว่า: "}.
{"Access Configuration","การกำหนดค่าการเข้าถึง"}.
{"Access Control List Configuration","การกำหนดค่ารายการควบคุมการเข้าถึง"}.
{"Access Control Lists","รายการควบคุมการเข้าถึง"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","การเข้าถึงถูกปฏิเสธโดยนโยบายการบริการ"}.
{"Access Rules","กฎการเข้าถึง"}.
{"Action on user","การดำเนินการกับผู้ใช้"}.
{"Add Jabber ID","เพิ่ม Jabber ID"}.
{"Add New","เพิ่มผู้ใช้ใหม่"}.
@@ -13,10 +8,10 @@
{"Administration","การดูแล"}.
{"Administrator privileges required","ต้องมีสิทธิพิเศษของผู้ดูแลระบบ"}.
{"All activity","กิจกรรมทั้งหมด"}.
{"All Users","ผู้ใช้ทั้งหมด"}.
{"Allow users to query other users","อนุญาตให้ผู้ใช้ถามคำถามกับผู้ใช้คนอื่นๆ ได้"}.
{"Allow users to send invites","อนุญาตให้ผู้ใช้ส่งคำเชิญถึงกันได้"}.
{"Allow users to send private messages","อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"}.
{"All Users","ผู้ใช้ทั้งหมด"}.
{"Announcements","ประกาศ"}.
{"April","เมษายน"}.
{"August","สิงหาคม"}.
@@ -70,7 +65,6 @@
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Family Name","นามสกุล"}.
{"February","กุมภาพันธ์"}.
{"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","จาก"}.
@@ -80,10 +74,11 @@
{"Get User Last Login Time","แสดงเวลาเข้าสู่ระบบครั้งล่าสุดของผู้ใช้"}.
{"Get User Password","ขอรับรหัสผ่านของผู้ใช้"}.
{"Get User Statistics","แสดงสถิติของผู้ใช้"}.
{"Group ","กลุ่ม"}.
{"Groups","กลุ่ม"}.
{"Group ","กลุ่ม"}.
{"has been banned","ถูกสั่งห้าม"}.
{"has been kicked","ถูกไล่ออก"}.
{" has set the subject to: "," ตั้งหัวข้อว่า: "}.
{"Host","โฮสต์"}.
{"Import Directory","อิมพอร์ตไดเร็กทอรี"}.
{"Import File","อิมพอร์ตไฟล์"}.
@@ -107,8 +102,6 @@
{"Last year","ปีที่แล้ว"}.
{"leaves the room","ออกจากห้อง"}.
{"List of modules to start","รายการของโมดูลที่จะเริ่มการทำงาน"}.
{"Listened Ports at ","พอร์ทฟังที่"}.
{"Listened Ports","พอร์ทฟัง"}.
{"Low level update script","อัพเดตสคริปต์ระดับต่ำ"}.
{"Make participants list public","สร้างรายการผู้เข้าร่วมสำหรับใช้งานโดยบุคคลทั่วไป"}.
{"Make room members-only","สร้างห้องสำหรับสมาชิกเท่านั้น"}.
@@ -124,7 +117,6 @@
{"Middle Name","ชื่อกลาง"}.
{"Moderator privileges required","ต้องมีสิทธิพิเศษของผู้ดูแลการสนทนา"}.
{"Modules","โมดูล"}.
{"Module","โมดูล"}.
{"Monday","วันจันทร์"}.
{"Name","ชื่อ"}.
{"Name:","ชื่อ:"}.
@@ -136,6 +128,7 @@
{"No Data","ไม่มีข้อมูล"}.
{"Node not found","ไม่พบโหนด"}.
{"Nodes","โหนด"}.
{"No limit","ไม่จำกัด"}.
{"None","ไม่มี"}.
{"November","พฤศจิกายน"}.
{"Number of online users","จำนวนผู้ใช้ออนไลน์"}.
@@ -150,7 +143,6 @@
{"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 ขาออก"}.
@@ -166,14 +158,12 @@
{"Period: ","ระยะเวลา:"}.
{"Ping","Ping"}.
{"Pong","Pong"}.
{"Port","พอร์ท"}.
{"private, ","ส่วนตัว, "}.
{"Publish-Subscribe","เผยแพร่-สมัครเข้าใช้งาน"}.
{"PubSub subscriber request","คำร้องขอของผู้สมัครเข้าใช้งาน PubSub"}.
{"Queries to the conference members are not allowed in this room","ห้องนี้ไม่อนุญาตให้ส่งกระทู้ถามถึงสมาชิกในห้องประชุม"}.
{"RAM and disc copy","คัดลอก RAM และดิสก์"}.
{"RAM copy","คัดลอก RAM"}.
{"Raw","ข้อมูลดิบ"}.
{"Really delete message of the day?","แน่ใจว่าต้องการลบข้อความของวันหรือไม่"}.
{"Recipient is not in the conference room","ผู้รับไม่ได้อยู่ในห้องประชุม"}.
{"Registered Users","ผู้ใช้ที่ลงทะเบียน"}.
@@ -198,8 +188,6 @@
{"Roster","บัญชีรายชื่อ"}.
{"RPC Call Error","ข้อผิดพลาดจากการเรียกใช้ RPC"}.
{"Running Nodes","โหนดที่ทำงาน"}.
{"~s access rule configuration","~s การกำหนดค่ากฎการเข้าถึง"}.
{"~s invites you to the room ~s","~s เชิญคุณเข้าร่วมสนทนาในห้อง ~s"}.
{"Saturday","วันเสาร์"}.
{"Script check","ตรวจสอบคริปต์"}.
{"Search Results for ","ผลการค้นหาสำหรับ "}.
@@ -215,10 +203,10 @@
{"Show Integral Table","แสดงตารางรวม"}.
{"Show Ordinary Table","แสดงตารางทั่วไป"}.
{"Shut Down Service","ปิดการบริการ"}.
{"~s invites you to the room ~s","~s เชิญคุณเข้าร่วมสนทนาในห้อง ~s"}.
{"~s's Offline Messages Queue","~s's ลำดับข้อความออฟไลน์"}.
{"Start Modules at ","เริ่มโมดูลที่"}.
{"Start Modules","เริ่มโมดูล"}.
{"Start","เริ่ม"}.
{"Statistics of ~p","สถิติของ ~p"}.
{"Statistics","สถิติ"}.
{"Stop Modules at ","หยุดโมดูลที่"}.
+770 -658
View File
File diff suppressed because it is too large Load Diff
+25 -40
View File
@@ -1,11 +1,5 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," konuyu değiştirdi: "}.
{"A password is required to enter this room","Bu odaya girmek için parola gerekiyor"}.
{"Access Configuration","Erişim Ayarları"}.
{"Access Control List Configuration","Erişim Kontrol Listelerinin Ayarlanması (ACL)"}.
{"Access Control Lists","Erişim Kontrol Listeleri (ACL)"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Servis politikası gereği erişim engellendi"}.
{"Access Rules","Erişim Kuralları"}.
{"Action on user","Kullanıcıya uygulanacak eylem"}.
{"Add Jabber ID","Jabber ID'si Ekle"}.
{"Add New","Yeni Ekle"}.
@@ -14,7 +8,6 @@
{"Administration","Yönetim"}.
{"Administrator privileges required","Yönetim yetkileri gerekli"}.
{"All activity","Tüm aktivite"}.
{"All Users","Tüm Kullanıcılar"}.
{"Allow users to change the 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"}.
@@ -22,7 +15,9 @@
{"Allow visitors to change nickname","Ziyaretçilerin takma isim değiştirmelerine izin ver"}.
{"Allow visitors to send private messages to","Ziyaretçilerin özel mesaj göndermelerine izin ver"}.
{"Allow visitors to send status text in presence updates","Ziyaretçilerin varlık (presence) güncellemelerinde durum metni göndermelerine izin ver"}.
{"All Users","Tüm Kullanıcılar"}.
{"Announcements","Duyurular"}.
{"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"}.
@@ -47,8 +42,8 @@
{"City","İl"}.
{"Commands","Komutlar"}.
{"Conference room does not exist","Konferans odası bulunamadı"}.
{"Configuration of room ~s","~s odasının ayarları"}.
{"Configuration","Ayarlar"}.
{"Configuration of room ~s","~s odasının ayarları"}.
{"Connected Resources:","Bağlı Kaynaklar:"}.
{"Country","Ülke"}.
{"CPU Time:","İşlemci Zamanı:"}.
@@ -56,8 +51,8 @@
{"Database","Veritabanı"}.
{"December","Aralık"}.
{"Default users as participants","Kullanıcılar öntanımlı olarak katılımcı olsun"}.
{"Delete message of the day on all hosts","Tüm sunuculardaki günün mesajını sil"}.
{"Delete message of the day","Günün mesajını sil"}.
{"Delete message of the day on all hosts","Tüm sunuculardaki günün mesajını sil"}.
{"Delete Selected","Seçilenleri Sil"}.
{"Delete User","Kullanıcıyı Sil"}.
{"Description:","Tanım:"}.
@@ -91,10 +86,9 @@
{"Failed to extract JID from your voice request approval","Ses isteği onayınızdan JID bilginize ulaşılamadı"}.
{"Family Name","Soyisim"}.
{"February","Şubat"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Eşleşen jabber kullanıcılarını aramak için formu doldurunuz (Alt dizgi eşlemek için alanın sonuna * ekleyin)"}.
{"Friday","Cuma"}.
{"From ~s","Kimden ~s"}.
{"From","Kimden"}.
{"From ~s","Kimden ~s"}.
{"Full Name","Tam İsim"}.
{"Get Number of Online Users","Bağlı Kullanıcı Sayısını Al"}.
{"Get Number of Registered Users","Kayıtlı Kullanıcı Sayısını Al"}.
@@ -104,10 +98,11 @@
{"Group ","Group "}.
{"Groups","Gruplar"}.
{"has been banned","odaya girmesi yasaklandı"}.
{"has been kicked because of a system shutdown","sistem kapandığından dolayı atıldı"}.
{"has been kicked because of an affiliation change","ilişki değişikliğinden dolayı atıldı"}.
{"has been kicked because of a system shutdown","sistem kapandığından dolayı atıldı"}.
{"has been kicked because the room has been changed to members-only","oda üyelere-özel hale getirildiğinden dolayı atıldı"}.
{"has been kicked","odadan atıldı"}.
{" has set the subject to: "," konuyu değiştirdi: "}.
{"Host","Sunucu"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Eğer burada CAPTCHA resmini göremiyorsanız, web sayfasını ziyaret edin."}.
{"Import Directory","Dizini İçe Aktar"}.
@@ -121,11 +116,10 @@
{"Improper message type","Uygunsuz mesaj tipi"}.
{"Incorrect password","Yanlış parola"}.
{"IP addresses","IP adresleri"}.
{"IP","IP"}.
{"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 to the conference","Konferansa ö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 Account Registration","Jabber Hesap Kaydı"}.
{"Jabber ID","Jabber ID"}.
{"January","Ocak"}.
@@ -138,8 +132,6 @@
{"Last year","Geçen yıl"}.
{"leaves the room","odadan ayrıldı"}.
{"List of modules to start","Başlatılacak modüllerin listesi"}.
{"Listened Ports at ","Dinlenen Kapılar (Portlar) : "}.
{"Listened Ports","Dinlenen Kapılar (Portlar)"}.
{"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"}.
@@ -159,7 +151,6 @@
{"Middle Name","Ortanca İsim"}.
{"Moderator privileges required","Moderatör yetkileri gerekli"}.
{"Modified modules","Değişen modüller"}.
{"Module","Modül"}.
{"Modules","Modüller"}.
{"Monday","Pazartesi"}.
{"Name","İsim"}.
@@ -173,6 +164,7 @@
{"No Data","Veri Yok"}.
{"Node not found","Düğüm bulunamadı"}.
{"Nodes","Düğümler"}.
{"No limit","Sınırsız"}.
{"None","Hiçbiri"}.
{"Not Found","Bulunamadı"}.
{"November","Kasım"}.
@@ -183,26 +175,25 @@
{"Offline Messages:","Çevirim-dışı Mesajlar:"}.
{"OK","Tamam"}.
{"Old Password:","Eski Parola:"}.
{"Online","Bağlı"}.
{"Online Users","Bağlı Kullanıcılar"}.
{"Online Users:","Bağlı Kullanıcılar:"}.
{"Online","Bağlı"}.
{"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 can approve voice requests","Yalnız moderatörler ses isteklerini onaylayabilir"}.
{"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"}.
{"Options","Seçenekler"}.
{"Organization Name","Kurum İsmi"}.
{"Organization Unit","Kurumun İlgili Birimi"}.
{"Outgoing s2s Connections","Giden s2s Bağlantıları"}.
{"Outgoing s2s Connections:","Giden s2s Bağlantıları:"}.
{"Owner privileges required","Sahip yetkileri gerekli"}.
{"Packet","Paket"}.
{"Password Verification","Parola Doğrulaması"}.
{"Password Verification:","Parola Doğrulaması:"}.
{"Password","Parola"}.
{"Password:","Parola:"}.
{"Password Verification","Parola Doğrulaması"}.
{"Password Verification:","Parola Doğrulaması:"}.
{"Path to Dir","Dizinin Yolu"}.
{"Path to File","Dosyanın Yolu"}.
{"Pending","Sıra Bekleyen"}.
@@ -211,15 +202,12 @@
{"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."}.
{"Please, wait for a while before sending new voice request","Lütfen yeni bir ses isteği göndermeden önce biraz bekleyin"}.
{"Pong","Pong"}.
{"Port","Kapı (Port)"}.
{"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"}.
{"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"}.
{"Register a Jabber account","Bir Jabber hesabı kaydet"}.
@@ -228,8 +216,8 @@
{"Register","Kayıt Ol"}.
{"Remote copy","Uzak kopyala"}.
{"Remove All Offline Messages","Tüm Çevirim-dışı Mesajları Kaldır"}.
{"Remove User","Kullanıcıyı Kaldır"}.
{"Remove","Kaldır"}.
{"Remove User","Kullanıcıyı Kaldır"}.
{"Replaced by new connection","Eski bağlantı yenisi ile değiştirildi"}.
{"Resources","Kaynaklar"}.
{"Restart Service","Servisi Tekrar Başlat"}.
@@ -244,21 +232,19 @@
{"Room description","Oda tanımı"}.
{"Room Occupants","Oda Sakini Sayısı"}.
{"Room title","Oda başlığı"}.
{"Roster","Kontak Listesi"}.
{"Roster of ","Kontak Listesi : "}.
{"Roster size","İsim listesi boyutu"}.
{"Roster","Kontak Listesi"}.
{"RPC Call Error","RPC Çağrı Hatası"}.
{"Running Nodes","Çalışan Düğümler"}.
{"~s access rule configuration","~s erişim kuralları ayarları"}.
{"~s invites you to the room ~s","~s sizi ~s odasına davet ediyor"}.
{"Saturday","Cumartesi"}.
{"Script check","Betik kontrolü"}.
{"Search Results for ","Arama sonuçları : "}.
{"Search users in ","Kullanıcılarda arama yap : "}.
{"Send announcement to all online users on all hosts","Duyuruyu tüm sunuculardaki tüm bağlı kullanıcılara yolla"}.
{"Send announcement to all online users","Duyuruyu tüm bağlı kullanıcılara yolla"}.
{"Send announcement to all users on all hosts","Tüm sunuculardaki tüm kullanıcılara duyuru yolla"}.
{"Send announcement to all online users on all hosts","Duyuruyu tüm sunuculardaki tüm bağlı kullanıcılara yolla"}.
{"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:","Sunucu:"}.
{"Set message of the day and send to online users","Günün mesajını belirle"}.
@@ -267,16 +253,16 @@
{"Show Integral Table","Önemli Tabloyu Göster"}.
{"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"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Bazı Jabber istemcileri parolanızı bilgisayarınızda saklayabilir. Bu özelliği ancak bilgisayarın güvenli olduğuna güveniyorsanız kullanın."}.
{"~s's Offline Messages Queue","~s Kullanıcısının Mesaj Kuyruğu"}.
{"Start Modules at ","Modülleri Başlat : "}.
{"Start Modules","Modülleri Başlat"}.
{"Start","Başlat"}.
{"Statistics of ~p","~p istatistikleri"}.
{"Statistics","İstatistikler"}.
{"Statistics of ~p","~p istatistikleri"}.
{"Stop","Durdur"}.
{"Stop Modules at ","Modülleri Durdur : "}.
{"Stop Modules","Modülleri Durdur"}.
{"Stop","Durdur"}.
{"Stopped Nodes","Durdurulmuş Düğümler"}.
{"Storage Type","Depolama Tipi"}.
{"Store binary backup:","İkili yedeği sakla:"}.
@@ -290,8 +276,8 @@
{"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 CAPTCHA verification has failed","CAPTCHA doğrulaması başarısız oldu"}.
{"The password is too weak","Parola çok zayıf"}.
{"the password is","parola :"}.
{"The password is too weak","Parola çok zayıf"}.
{"The password of your Jabber account was successfully changed.","Jabber hesabınızın parolası başarıyla değiştirildi."}.
{"There was an error changing the password: ","Parolanın değiştirilmesi sırasında bir hata oluştu:"}.
{"There was an error creating the account: ","Hesap oluşturulurken bir hata oluştu:"}.
@@ -303,9 +289,9 @@
{"Thursday","Perşembe"}.
{"Time delay","Zaman gecikmesi"}.
{"Time","Zaman"}.
{"To ~s","Kime ~s"}.
{"To","Kime"}.
{"Too many CAPTCHA requests","Çok fazla CAPTCHA isteği"}.
{"To ~s","Kime ~s"}.
{"Traffic rate limit is exceeded","Trafik oran sınırı aşıldı"}.
{"Transactions Aborted:","İptal Edilen Hareketler (Transactions):"}.
{"Transactions Committed:","Tamamlanan Hareketler (Transactions Committed):"}.
@@ -316,18 +302,18 @@
{"Unauthorized","Yetkisiz"}.
{"Unregister a Jabber account","Bir Jabber hesabı kaydı sil"}.
{"Unregister","Kaydı Sil"}.
{"Update","GÜncelle"}.
{"Update message of the day (don't send)","Günün mesajını güncelle (gönderme)"}.
{"Update message of the day on all hosts (don't send)","Tüm sunuculardaki günün mesajını güncelle (gönderme)"}.
{"Update plan","Planı güncelle"}.
{"Update script","Betiği Güncelle"}.
{"Update","GÜncelle"}.
{"Uptime:","Hizmet Süresi:"}.
{"User Management","Kullanıcı Yönetimi"}.
{"User","Kullanıcı"}.
{"User Management","Kullanıcı Yönetimi"}.
{"Username:","Kullanıcı adı:"}.
{"Users are not allowed to register accounts so quickly","Kullanıcıların bu kadar hızlı hesap açmalarına izin verilmiyor"}.
{"Users Last Activity","Kullanıcıların Son Aktiviteleri"}.
{"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ı"}.
@@ -346,4 +332,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Çevirim-dışı mesaj kuyruğunuz dolu. Mesajını dikkate alınmadı."}.
{"Your Jabber account was successfully created.","Jabber hesabınız başarıyla oluşturuldu."}.
{"Your Jabber account was successfully deleted.","Jabber hesabınız başarıyla silindi."}.
{"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."}.
+775 -657
View File
File diff suppressed because it is too large Load Diff
+11 -26
View File
@@ -1,12 +1,6 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," встановив(ла) тему: "}.
{"A password is required to enter this room","Щоб зайти в цю конференцію, необхідно ввести пароль"}.
%% -*- coding: utf-8 -*-
{"Accept","Прийняти"}.
{"Access Configuration","Конфігурація доступу"}.
{"Access Control List Configuration","Конфігурація списків керування доступом"}.
{"Access Control Lists","Списки керування доступом"}.
{"Access denied by service policy","Доступ заборонений політикою служби"}.
{"Access Rules","Правила доступу"}.
{"Action on user","Дія над користувачем"}.
{"Add Jabber ID","Додати Jabber ID"}.
{"Add New","Додати"}.
@@ -15,7 +9,6 @@
{"Administration","Адміністрування"}.
{"Administrator privileges required","Необхідні права адміністратора"}.
{"All activity","Вся статистика"}.
{"All Users","Всі користувачі"}.
{"Allow users to change the subject","Дозволити користувачам змінювати тему"}.
{"Allow users to query other users","Дозволити iq-запити до користувачів"}.
{"Allow users to send invites","Дозволити користувачам надсилати запрошення"}.
@@ -23,7 +16,9 @@
{"Allow visitors to change nickname","Дозволити відвідувачам змінювати псевдонім"}.
{"Allow visitors to send private messages to","Дозволити відвідувачам відсилати приватні повідомлення"}.
{"Allow visitors to send status text in presence updates","Дозволити відвідувачам відсилати текст статусу в оновленнях присутності"}.
{"All Users","Всі користувачі"}.
{"Announcements","Сповіщення"}.
{"A password is required to enter this room","Щоб зайти в цю конференцію, необхідно ввести пароль"}.
{"April","квітня"}.
{"August","серпня"}.
{"Backup Management","Керування резервним копіюванням"}.
@@ -96,7 +91,6 @@
{"Failed to extract JID from your voice request approval","Помилка витягнення JID з вашого схвалення голосового запиту"}.
{"Family Name","Прізвище"}.
{"February","лютого"}.
{"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","Від кого"}.
@@ -106,13 +100,14 @@
{"Get User Last Login Time","Отримати Час Останнього Підключення Користувача"}.
{"Get User Password","Отримати Пароль Користувача"}.
{"Get User Statistics","Отримати Статистику по Користувачу"}.
{"Group ","Група "}.
{"Groups","Групи"}.
{"Group ","Група "}.
{"has been banned","заборонили вхід в кімнату"}.
{"has been kicked because of a system shutdown","вигнано з кімнати внаслідок зупинки системи"}.
{"has been kicked because of an affiliation change","вигнано з кімнати внаслідок зміни рангу"}.
{"has been kicked because of a system shutdown","вигнано з кімнати внаслідок зупинки системи"}.
{"has been kicked because the room has been changed to members-only","вигнано з кімнати тому, що вона стала тільки для учасників"}.
{"has been kicked","вигнали з кімнати"}.
{" has set the subject to: "," встановив(ла) тему: "}.
{"Host","Хост"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Якщо ви не бачите зображення капчі, перейдіть за за цією адресою."}.
{"Import Directory","Імпорт з директорії"}.
@@ -127,7 +122,6 @@
{"Incoming s2s Connections:","Вхідні s2s-з'єднання:"}.
{"Incorrect password","Неправильний пароль"}.
{"IP addresses","IP адреси"}.
{"IP","IP"}.
{"is now known as","змінив(ла) псевдонім на"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Не дозволяється відправляти помилкові повідомлення в кімнату. Учасник (~s) відправив помилкове повідомлення (~s), та був виганий з кімнати"}.
{"It is not allowed to send private messages of type \"groupchat\"","Не дозволяється надсилати приватні повідомлення типу \"groupchat\""}.
@@ -146,8 +140,6 @@
{"leaves the room","вийшов(ла) з кімнати"}.
{"List of modules to start","Список завантажуваних модулів"}.
{"List of rooms","Перелік кімнат"}.
{"Listened Ports at ","Відкриті порти на "}.
{"Listened Ports","Відкриті порти"}.
{"Low level update script","Низькорівневий сценарій поновлення"}.
{"Make participants list public","Зробити список учасників видимим всім"}.
{"Make room CAPTCHA protected","Зробити кімнату захищеною капчею"}.
@@ -167,9 +159,7 @@
{"Middle Name","По-батькові"}.
{"Moderator privileges required","Необхідні права модератора"}.
{"Modified modules","Змінені модулі"}.
{"Modules at ~p","Модулі на ~p"}.
{"Modules","Модулі"}.
{"Module","Модуль"}.
{"Monday","Понеділок"}.
{"Multicast","Мультікаст"}.
{"Multi-User Chat","Багато-користувальницький чат"}.
@@ -185,6 +175,7 @@
{"Node not found","Вузол не знайдено"}.
{"Node ~p","Вузол ~p"}.
{"Nodes","Вузли"}.
{"No limit","Без обмежень"}.
{"None","Немає"}.
{"Not Found","не знайдено"}.
{"November","листопада"}.
@@ -205,7 +196,6 @@
{"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-з'єднання"}.
@@ -224,15 +214,12 @@
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Зауважте, що ця опція відповідає за резервне копіювання тільки вбудованної бази даних Mnesia. Якщо Ви також використовуєте інше сховище для даних (наприклад за допомогою модуля ODBC), то його резервне копіювання потрібно робити окремо."}.
{"Please, wait for a while before sending new voice request","Будь ласка, почекайте деякий час перед тим, як знову відправляти голосовий запит"}.
{"Pong","Понг"}.
{"Port","Порт"}.
{"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?","Насправді, видалити повідомлення дня?"}.
{"Recipient is not in the conference room","Адресата немає в конференції"}.
{"Register a Jabber account","Зареєструвати Jabber-акаунт"}.
@@ -262,8 +249,6 @@
{"Roster","Ростер"}.
{"RPC Call Error","Помилка виклику RPC"}.
{"Running Nodes","Працюючі вузли"}.
{"~s access rule configuration","Конфігурація правила доступу ~s"}.
{"~s invites you to the room ~s","~s запрошує вас до кімнати ~s"}.
{"Saturday","Субота"}.
{"Script check","Перевірка сценарію"}.
{"Search Results for ","Результати пошуку в "}.
@@ -280,11 +265,11 @@
{"Show Integral Table","Показати інтегральну таблицю"}.
{"Show Ordinary Table","Показати звичайну таблицю"}.
{"Shut Down Service","Вимкнути Сервіс"}.
{"~s invites you to the room ~s","~s запрошує вас до кімнати ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Деякі Jabber-клієнти можуть зберігати пароль на вашому комп'ютері. Користуйтесь цією функцією тільки у тому випадку, якщо вважаєте її безпечною."}.
{"~s's Offline Messages Queue","Черга офлайнових повідомлень ~s"}.
{"Start Modules at ","Запуск модулів на "}.
{"Start Modules","Запуск модулів"}.
{"Start","Запустити"}.
{"Statistics of ~p","Статистика вузла ~p"}.
{"Statistics","Статистика"}.
{"Stop Modules at ","Зупинка модулів на "}.
@@ -316,9 +301,10 @@
{"Thursday","Четвер"}.
{"Time delay","Час затримки"}.
{"Time","Час"}.
{"To ~s","До ~s"}.
{"Too many CAPTCHA requests","Надто багато CAPTCHA-запитів"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Забагато (~p) помилок авторизації з цієї IP адреси (~s). Адресу буде розблоковано о ~s UTC"}.
{"Too many unacked stanzas","Занадто багато пакетів без відповідей"}.
{"To ~s","До ~s"}.
{"Total rooms","Всього кімнат"}.
{"To","Кому"}.
{"Traffic rate limit is exceeded","Швидкість передачі інформації було перевищено"}.
@@ -339,10 +325,10 @@
{"Update","Обновити"}.
{"Uptime:","Час роботи:"}.
{"User Management","Управління Користувачами"}.
{"User ~s","Користувач ~s"}.
{"Username:","Ім'я користувача:"}.
{"Users are not allowed to register accounts so quickly","Користувачам не дозволено так часто реєструвати облікові записи"}.
{"Users Last Activity","Статистика останнього підключення користувачів"}.
{"User ~s","Користувач ~s"}.
{"Users","Користувачі"}.
{"User","Користувач"}.
{"Validate","Затвердити"}.
@@ -363,4 +349,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Черга повідомлень, що не були доставлені, переповнена. Повідомлення не було збережено."}.
{"Your Jabber account was successfully created.","Ваш Jabber-акаунт було успішно створено."}.
{"Your Jabber account was successfully deleted.","Ваш Jabber-акаунт було успішно видалено."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ваші повідомлення до ~s блокуються. Для розблокування відвідайте ~s"}.
+776 -663
View File
File diff suppressed because it is too large Load Diff
+19 -31
View File
@@ -1,10 +1,5 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," đã đặt chủ đề thành: "}.
{"Access Configuration","Cấu Hình Truy Cập"}.
{"Access Control List Configuration","Cấu Hình Danh Sách Kiểm Soát Truy Cập"}.
{"Access Control Lists","Danh Sách Kiểm Soát Truy Cập"}.
%% -*- coding: utf-8 -*-
{"Access denied by service policy","Sự truy cập bị chặn theo chính sách phục vụ"}.
{"Access Rules","Quy Tắc Truy Cập"}.
{"Action on user","Hành động đối với người sử dụng"}.
{"Add Jabber ID","Thêm Jabber ID"}.
{"Add New","Thêm Mới"}.
@@ -13,16 +8,16 @@
{"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"}.
{"All Users","Tất Cả Người Sử Dụng"}.
{"Allow users to query other users","Cho phép người sử dụng hỏi người sử dụng khác"}.
{"Allow users to send invites","Cho phép người sử dụng gửi lời mời"}.
{"Allow users to send private messages","Cho phép người sử dụng gửi thư riêng"}.
{"All Users","Tất Cả Người Sử Dụng"}.
{"Announcements","Thông báo"}.
{"April","Tháng Tư"}.
{"August","Tháng Tám"}.
{"Backup Management","Quản lý Sao Lưu Dự Phòng"}.
{"Backup to File at ","Sao lưu dự phòng ra Tập Tin tại"}.
{"Backup","Sao lưu dự phòng"}.
{"Backup to File at ","Sao lưu dự phòng ra Tập Tin tại"}.
{"Bad format","Định dạng hỏng"}.
{"Birthday","Ngày sinh"}.
{"Change Password","Thay Đổi Mật Khẩu"}.
@@ -40,8 +35,8 @@
{"Connected Resources:","Tài Nguyên Được Kết Nối:"}.
{"Country","Quốc gia"}.
{"CPU Time:","Thời Gian CPU:"}.
{"Database Tables Configuration at ","Cấu Hình Bảng Cơ Sở Dữ Liệu tại"}.
{"Database","Cơ sở dữ liệu"}.
{"Database Tables Configuration at ","Cấu Hình Bảng Cơ Sở Dữ Liệu tại"}.
{"December","Tháng Mười Hai"}.
{"Default users as participants","Người sử dụng mặc định là người tham dự"}.
{"Delete message of the day on all hosts","Xóa thư trong ngày trên tất cả các máy chủ"}.
@@ -70,7 +65,6 @@
{"Erlang Jabber Server","Erlang Jabber Server Bản quyền"}.
{"Family Name","Họ"}.
{"February","Tháng Hai"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Điền vào mẫu này để tìm kiếm bất kỳ thông tin nào khớp với Người sử dụng Jabber (Thêm dấu * vào cuối ô để thông tin khớp với chuỗi bên trong)"}.
{"Friday","Thứ Sáu"}.
{"From ~s","Nhận từ ~s"}.
{"From","Từ"}.
@@ -84,6 +78,7 @@
{"Groups","Nhóm"}.
{"has been banned","đã bị cấm"}.
{"has been kicked","đã bị đẩy ra khỏi"}.
{" has set the subject to: "," đã đặt chủ đề thành: "}.
{"Host","Máy chủ"}.
{"Import Directory","Nhập Thư Mục"}.
{"Import File","Nhập Tập Tin"}.
@@ -107,8 +102,6 @@
{"Last year","Năm trước"}.
{"leaves the room","rời khỏi phòng này"}.
{"List of modules to start","Danh sách các môđun khởi động"}.
{"Listened Ports at ","Cổng Liên Lạc tại"}.
{"Listened Ports","Cổng Kết Nối"}.
{"Low level update script","Lệnh cập nhật mức độ thấp"}.
{"Make participants list public","Tạo danh sách người tham dự công khai"}.
{"Make room members-only","Tạo phòng chỉ cho phép tư cách thành viên tham gia"}.
@@ -123,19 +116,19 @@
{"Message body","Thân thư"}.
{"Middle Name","Họ Đệm"}.
{"Moderator privileges required","Yêu cầu đặc quyền của nhà điều phối"}.
{"Module","Môđun"}.
{"Modules","Môđun"}.
{"Monday","Thứ Hai"}.
{"Name","Tên"}.
{"Name:","Tên:"}.
{"Never","Không bao giờ"}.
{"Nickname","Bí danh"}.
{"Nickname Registration at ","Đăng Ký Bí Danh tại"}.
{"Nickname ~s does not exist in the room","Bí danh ~s không tồn tại trong phòng này"}.
{"Nickname","Bí danh"}.
{"No body provided for announce message","Không có nội dung trong thư thông báo"}.
{"No Data","Không Dữ Liệu"}.
{"Node not found","Nút không tìm thấy"}.
{"Nodes","Nút"}.
{"No limit","Không giới hạn"}.
{"None","Không có"}.
{"November","Tháng Mười Một"}.
{"Number of online users","Số người sử dụng trực tuyến"}.
@@ -144,70 +137,65 @@
{"Offline Messages","Thư Ngoại Tuyến"}.
{"Offline Messages:","Thư Ngoại Tuyến:"}.
{"OK","OK"}.
{"Online","Trực tuyến"}.
{"Online Users","Người Sử Dụng Trực Tuyến"}.
{"Online Users:","Người Sử Dụng Trực Tuyến:"}.
{"Online","Trực tuyến"}.
{"Only occupants are allowed to send messages to the conference","Chỉ có những đối tượng tham gia mới được phép gửi thư đến phòng họp"}.
{"Only occupants are allowed to send queries to the conference","Chỉ có những đối tượng tham gia mới được phép gửi yêu cầu đến phòng họp"}.
{"Only service administrators are allowed to send service messages","Chỉ có người quản trị dịch vụ mới được phép gửi những thư dịch vụ"}.
{"Options","Tùy chọn"}.
{"Organization Name","Tên Tổ Chức"}.
{"Organization Unit","Bộ Phận"}.
{"Outgoing s2s Connections","Kết Nối Bên Ngoài s2s"}.
{"Outgoing s2s Connections:","Kết Nối Bên Ngoài s2s:"}.
{"Owner privileges required","Yêu cầu đặc quyền của người sở hữu"}.
{"Packet","Gói thông tin"}.
{"Password Verification","Kiểm Tra Mật Khẩu"}.
{"Password","Mật Khẩu"}.
{"Password:","Mật Khẩu:"}.
{"Password Verification","Kiểm Tra Mật Khẩu"}.
{"Path to Dir","Đường Dẫn đến Thư Mục"}.
{"Path to File","Đường dẫn đến Tập Tin"}.
{"Pending","Chờ"}.
{"Period: ","Giai đoạn: "}.
{"Ping","Ping"}.
{"Pong","Pong"}.
{"Port","Cổng"}.
{"private, ","riêng,"}.
{"Publish-Subscribe","Xuất Bản-Đăng Ký"}.
{"PubSub subscriber request","Yêu cầu người đăng ký môđun Xuất Bản Đăng Ký"}.
{"Queries to the conference members are not allowed in this room","Không được phép gửi các yêu cầu gửi đến các thành viên trong phòng họp này"}.
{"RAM and disc copy","Sao chép vào RAM và đĩa"}.
{"RAM copy","Sao chép vào RAM"}.
{"Raw","Thô"}.
{"Really delete message of the day?","Có thực sự xóa thư trong ngày này không?"}.
{"Recipient is not in the conference room","Người nhận không có trong phòng họp"}.
{"Registered Users","Người Sử Dụng Đã Đăng Ký"}.
{"Registered Users:","Người Sử Dụng Đã Đăng Ký:"}.
{"Remote copy","Sao chép từ xa"}.
{"Remove User","Gỡ Bỏ Người Sử Dụng"}.
{"Remove","Gỡ bỏ"}.
{"Remove User","Gỡ Bỏ Người Sử Dụng"}.
{"Replaced by new connection","Được thay thế bởi kết nối mới"}.
{"Resources","Nguồn tài nguyên"}.
{"Restart Service","Khởi Động Lại Dịch Vụ"}.
{"Restart","Khởi động lại"}.
{"Restart Service","Khởi Động Lại Dịch Vụ"}.
{"Restore Backup from File at ","Phục hồi Sao Lưu từ Tập Tin tại "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Khôi phục bản sao lưu dự phòng dạng nhị phân sau lần khởi động ejabberd kế tiếp (yêu cầu ít bộ nhớ hơn):"}.
{"Restore binary backup immediately:","Khôi phục bản sao lưu dự phòng dạng nhị phận ngay lập tức:"}.
{"Restore plain text backup immediately:","Khôi phục bản sao lưu dự phòng thuần văn bản ngay lập tức:"}.
{"Restore","Khôi phục"}.
{"Restore plain text backup immediately:","Khôi phục bản sao lưu dự phòng thuần văn bản ngay lập tức:"}.
{"Room Configuration","Cấu Hình Phòng"}.
{"Room creation is denied by service policy","Việc tạo phòng bị ngăn lại theo chính sách dịch vụ"}.
{"Room title","Tên phòng"}.
{"Roster","Bảng phân công"}.
{"Roster of ","Bảng phân công của "}.
{"Roster size","Kích thước bảng phân công"}.
{"Roster","Bảng phân công"}.
{"RPC Call Error","Lỗi Gọi RPC"}.
{"Running Nodes","Nút Hoạt Động"}.
{"~s access rule configuration","~s cấu hình quy tắc truy cập"}.
{"~s invites you to the room ~s","~s mời bạn vào phòng ~s"}.
{"Saturday","Thứ Bảy"}.
{"Script check","Lệnh kiểm tra"}.
{"Search Results for ","Kết Quả Tìm Kiếm cho "}.
{"Search users in ","Tìm kiếm người sử dụng trong"}.
{"Send announcement to all online users on all hosts","Gửi thông báo đến tất cả người sử dụng trực tuyến trên tất cả các máy chủ"}.
{"Send announcement to all online users","Gửi thông báo đến tất cả người sử dụng trực tuyến"}.
{"Send announcement to all users on all hosts","Gửi thông báo đến tất cả người sử dụng trên tất cả các máy chủ"}.
{"Send announcement to all online users on all hosts","Gửi thông báo đến tất cả người sử dụng trực tuyến trên tất cả các máy chủ"}.
{"Send announcement to all users","Gửi thông báo đến tất cả người sử dụng"}.
{"Send announcement to all users on all hosts","Gửi thông báo đến tất cả người sử dụng trên tất cả các máy chủ"}.
{"September","Tháng Chín"}.
{"Set message of the day and send to online users","Tạo lập thư trong ngày và gửi đến những người sử dụng trực tuyến"}.
{"Set message of the day on all hosts and send to online users","Tạo lập thư trong ngày trên tất cả các máy chủ và gửi đến những người sử dụng trực tuyến"}.
@@ -215,15 +203,15 @@
{"Show Integral Table","Hiển Thị Bảng Đầy Đủ"}.
{"Show Ordinary Table","Hiển Thị Bảng Thường"}.
{"Shut Down Service","Tắt Dịch Vụ"}.
{"~s invites you to the room ~s","~s mời bạn vào phòng ~s"}.
{"~s's Offline Messages Queue","~s's Danh Sách Chờ Thư Ngoại Tuyến"}.
{"Start Modules at ","Môđun Khởi Động tại "}.
{"Start Modules","Môđun Khởi Động"}.
{"Start","Khởi động"}.
{"Statistics of ~p","Thống kê về ~p"}.
{"Statistics","Số liệu thống kê"}.
{"Stop","Dừng"}.
{"Stop Modules at ","Môđun Dừng tại"}.
{"Stop Modules","Môđun Dừng"}.
{"Stop","Dừng"}.
{"Stopped Nodes","Nút Dừng"}.
{"Storage Type","Loại Lưu Trữ"}.
{"Store binary backup:","Lưu dữ liệu sao lưu dạng nhị phân:"}.
@@ -238,19 +226,19 @@
{"Thursday","Thứ Năm"}.
{"Time delay","Thời gian trì hoãn"}.
{"Time","Thời Gian"}.
{"To ~s","Gửi đến ~s"}.
{"To","Đến"}.
{"To ~s","Gửi đến ~s"}.
{"Traffic rate limit is exceeded","Quá giới hạn tỷ lệ lưu lượng truyền tải"}.
{"Transactions Aborted:","Giao Dịch Hủy Bỏ:"}.
{"Transactions Committed:","Giao Dịch Được Cam Kết:"}.
{"Transactions Logged:","Giao Dịch Được Ghi Nhận:"}.
{"Transactions Restarted:","Giao Dịch Khởi Động Lại:"}.
{"Tuesday","Thứ Ba"}.
{"Update","Cập Nhật"}.
{"Update message of the day (don't send)","Cập nhật thư trong ngày (không gửi)"}.
{"Update message of the day on all hosts (don't send)","Cập nhật thư trong ngày trên tất cả các máy chủ (không gửi)"}.
{"Update plan","Kế hoạch cập nhật"}.
{"Update script","Cập nhận lệnh"}.
{"Update","Cập Nhật"}.
{"Uptime:","Thời gian tải lên:"}.
{"User Management","Quản Lý Người Sử Dụng"}.
{"User","Người sử dụng"}.
+771 -659
View File
File diff suppressed because it is too large Load Diff
+34 -49
View File
@@ -1,21 +1,14 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: "," a candjî l' tite a: "}.
{"A password is required to enter this room","I fåt dner on scret po poleur intrer dins cisse såle ci"}.
%% -*- coding: utf-8 -*-
{"Accept","Accepter"}.
{"Access Configuration","Apontiaedje des accès"}.
{"Access Control List Configuration","Apontiaedje des droets (ACL)"}.
{"Access Control Lists","Droets (ACL)"}.
{"Access denied by service policy","L' accès a stî rfuzé pal politike do siervice"}.
{"Access Rules","Rîles d' accès"}.
{"Action on user","Accion so l' uzeu"}.
{"Add Jabber ID","Radjouter èn ID Jabber"}.
{"Add New","Radjouter"}.
{"Add User","Radjouter èn uzeu"}.
{"Administration of ","Manaedjaedje di "}.
{"Administration","Manaedjaedje"}.
{"Administration of ","Manaedjaedje di "}.
{"Administrator privileges required","I fåt des priviledjes di manaedjeu"}.
{"All activity","Dispoy todi"}.
{"All Users","Tos les uzeus"}.
{"Allow users to change the 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"}.
@@ -23,13 +16,15 @@
{"Allow visitors to change nickname","Permete ki les viziteus candjexhe leus metous nos"}.
{"Allow visitors to send private messages to","Les uzeus polèt evoyî des messaedjes privés"}.
{"Allow visitors to send status text in presence updates","Permete ki les viziteus evoyexhe des tecse d' estat dins leus messaedjes di prezince"}.
{"All Users","Tos les uzeus"}.
{"Announcements","Anonces"}.
{"A password is required to enter this room","I fåt dner on scret po poleur intrer dins cisse såle ci"}.
{"April","avri"}.
{"August","awousse"}.
{"Backup","Copeye di såvrité"}.
{"Backup Management","Manaedjaedje des copeyes di såvrité"}.
{"Backup of ~p","Copeye di såvrité po ~p"}.
{"Backup to File at ","Fé ene copeye di såvrité dins on fitchî so "}.
{"Backup","Copeye di såvrité"}.
{"Bad format","Mwais fôrmat"}.
{"Birthday","Date d' askepiaedje"}.
{"CAPTCHA web page","Pådje web CAPTCHA"}.
@@ -49,18 +44,18 @@
{"City","Veye"}.
{"Commands","Comandes"}.
{"Conference room does not exist","Li såle di conferince n' egzistêye nén"}.
{"Configuration of room ~s","Apontiaedje del såle ~s"}.
{"Configuration","Apontiaedjes"}.
{"Configuration of room ~s","Apontiaedje del såle ~s"}.
{"Connected Resources:","Raloyî avou les rsoûces:"}.
{"Country","Payis"}.
{"CPU Time:","Tins CPU:"}.
{"Database","Båze di dnêyes"}.
{"Database Tables at ~p","Tåves del båze di dnêyes so ~p"}.
{"Database Tables Configuration at ","Apontiaedje des tåves del båze di dnêyes so "}.
{"Database","Båze di dnêyes"}.
{"December","decimbe"}.
{"Default users as participants","Les uzeus sont des pårticipants come prémetowe dujhance"}.
{"Delete message of the day on all hosts","Disfacer l' messaedje do djoû so tos les lodjoes"}.
{"Delete message of the day","Disfacer l' messaedje do djoû"}.
{"Delete message of the day on all hosts","Disfacer l' messaedje do djoû so tos les lodjoes"}.
{"Delete Selected","Disfacer les elemints tchoezis"}.
{"Delete User","Disfacer èn uzeu"}.
{"Description:","Discrijhaedje:"}.
@@ -96,10 +91,9 @@
{"Failed to extract JID from your voice request approval","Nén moyén di rsaetchî on JID foû d' l' aprovaedje di vosse dimande di vwès"}.
{"Family Name","No d' famile"}.
{"February","fevrî"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","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"}.
{"Friday","vénrdi"}.
{"From ~s","Dispoy ~s"}.
{"From","Di"}.
{"From ~s","Dispoy ~s"}.
{"Full Name","No etir"}.
{"Get Number of Online Users","Riçure li nombe d' uzeus raloyîs"}.
{"Get Number of Registered Users","Riçure li nombe d' uzeus edjîstrés"}.
@@ -109,10 +103,11 @@
{"Group ","Groupe "}.
{"Groups","Groupes"}.
{"has been banned","a stî bani"}.
{"has been kicked because of a system shutdown","a stî pité evoye cåze d' èn arestaedje do sistinme"}.
{"has been kicked because of an affiliation change","a stî pité evoye cåze d' on candjmint d' afiyaedje"}.
{"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 been kicked","a stî pité evoye"}.
{"has been kicked because of an affiliation change","a stî pité evoye cåze d' on candjmint d' afiyaedje"}.
{"has been kicked because of a system shutdown","a stî pité evoye cåze d' èn arestaedje do sistinme"}.
{"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 don't see the CAPTCHA image here, visit the web page.","Si vos n' voeyoz nole imådje CAPTCHA chal, vizitez l' pådje waibe."}.
{"Import Directory","Sititchî d' on ridant"}.
@@ -127,12 +122,11 @@
{"Incoming s2s Connections:","Raloyaedjes s2s en intrêye:"}.
{"Incorrect password","Sicret nén corek"}.
{"IP addresses","Adresses IP"}.
{"IP","IP"}.
{"is now known as","est asteure kinoxhou come"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","On n' pout nén evoyî des messaedjes d' aroke sol såle. Li pårticipan (~s) a-st evoyî on messaedje d' aroke (~s) ey a stî tapé foû."}.
{"It is not allowed to send private messages","Ci n' est nén permetou d' evoyî des messaedjes privés"}.
{"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"}.
{"It is not allowed to send private messages","Ci n' est nén permetou d' evoyî des messaedjes privés"}.
{"Jabber Account Registration","Edjîstraedje di conte Jabber"}.
{"Jabber ID","ID Jabber"}.
{"January","djanvî"}.
@@ -146,8 +140,6 @@
{"leaves the room","cwite li såle"}.
{"List of modules to start","Djivêye di modules a-z enonder"}.
{"List of rooms","Djivêye des såles"}.
{"Listened Ports at ","Pôrts drovous so "}.
{"Listened Ports","Pôrts drovous"}.
{"Low level update script","Sicripe di metaedje a djoû d' bas livea"}.
{"Make participants list public","Rinde publike li djivêye des pårticipants"}.
{"Make room CAPTCHA protected","Rinde li såle di berdelaedje protedjeye pa CAPTCHA"}.
@@ -167,8 +159,6 @@
{"Middle Name","No do mitan"}.
{"Moderator privileges required","I fåt des priviledjes di moderateu"}.
{"Modified modules","Modules di candjîs"}.
{"Module","Module"}.
{"Modules at ~p","Modules so ~p"}.
{"Modules","Modules"}.
{"Monday","londi"}.
{"Multicast","Multicast"}.
@@ -177,14 +167,15 @@
{"Name:","Pitit no:"}.
{"Never","Måy"}.
{"New Password:","Novea scret:"}.
{"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"}.
{"Nickname","Metou no"}.
{"No body provided for announce message","I n' a nou coir do messaedje po ciste anonce la"}.
{"No Data","Nole dinêye disponibe"}.
{"Node not found","Nuk nén trové"}.
{"Node ~p","Nuk ~p"}.
{"Nodes","Nuks"}.
{"No limit","Pont d' limite"}.
{"None","Nole"}.
{"Not Found","Nén trové"}.
{"November","nôvimbe"}.
@@ -195,9 +186,9 @@
{"Offline Messages:","Messaedjes ki ratindèt:"}.
{"OK","'l est bon"}.
{"Old Password:","Vî scret:"}.
{"Online","Raloyî"}.
{"Online Users","Uzeus raloyîs"}.
{"Online Users:","Uzeus raloyîs:"}.
{"Online","Raloyî"}.
{"Only members may query archives of this room","Seulmint les mimbes polèt cweri les årtchives dins cisse såle ci"}.
{"Only moderators and participants are allowed to change the 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 the subject in this room","Seulmint les moderateus polèt candjî l' sudjet dins cisse såle ci"}.
@@ -205,17 +196,16 @@
{"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"}.
{"Options","Tchuzes"}.
{"Organization Name","No d' l' organizåcion"}.
{"Organization Unit","Unité d' l' organizåcion"}.
{"Outgoing s2s Connections","Raloyaedjes s2s e rexhowe"}.
{"Outgoing s2s Connections:","Raloyaedjes s2s e rexhowe:"}.
{"Owner privileges required","I fåt des priviledjes di prôpietaire"}.
{"Packet","Paket"}.
{"Password Verification","Acertinaedje do scret"}.
{"Password Verification:","Acertinaedje do scret:"}.
{"Password","Sicret"}.
{"Password:","Sicret:"}.
{"Password Verification","Acertinaedje do scret"}.
{"Password Verification:","Acertinaedje do scret:"}.
{"Path to Dir","Tchimin viè l' ridant"}.
{"Path to File","Tchimin viè l' fitchî"}.
{"Pending","Ratindant"}.
@@ -224,29 +214,26 @@
{"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.","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."}.
{"Please, wait for a while before sending new voice request","Ratindez ene miete s' i vs plait divant d' rivoyî ene nouve dimande di vwès"}.
{"Pong","Pong"}.
{"Port","Pôrt"}.
{"private, ","privé, "}.
{"Protocol","Protocole"}.
{"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"}.
{"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"}.
{"Register a Jabber account","Edjîstrer on conte Jabber"}.
{"Register","Edjîstrer"}.
{"Registered Users","Uzeus edjistrés"}.
{"Registered Users:","Uzeus edjistrés:"}.
{"Register","Edjîstrer"}.
{"Remote copy","Copeye å lon"}.
{"Remove All Offline Messages","Oister tos les messaedjes ki ratindèt"}.
{"Remove User","Disfacer l' uzeu"}.
{"Remove","Oister"}.
{"Remove User","Disfacer l' uzeu"}.
{"Replaced by new connection","Replaecî pa on novea raloyaedje"}.
{"Resources","Rissoûces"}.
{"Restart Service","Renonder siervice"}.
{"Restart","Renonder"}.
{"Restart Service","Renonder siervice"}.
{"Restore Backup from File at ","Rapexhî dispoy li fitchî copeye di såvrité so "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Rapexhî l' copeye di såvrité binaire après l' renondaedje ki vént d' ejabberd (çoula prind moens d' memwere del fé insi):"}.
{"Restore binary backup immediately:","Rapexhî do côp foû d' ene copeye di såvrité binaire:"}.
@@ -257,21 +244,19 @@
{"Room description","Discrijhaedje del såle"}.
{"Room Occupants","Prezints el såle"}.
{"Room title","Tite del såle"}.
{"Roster","Djivêye des soçons"}.
{"Roster of ","Djivêye des soçons da "}.
{"Roster size","Grandeu del djivêye des soçons"}.
{"Roster","Djivêye des soçons"}.
{"RPC Call Error","Aroke di houcaedje RPC"}.
{"Running Nodes","Nuks en alaedje"}.
{"~s access rule configuration","Apontiaedje des rîles d' accès a ~s"}.
{"~s invites you to the room ~s","~s vos preye sol såle ~s"}.
{"Saturday","semdi"}.
{"Script check","Acertinaedje do scripe"}.
{"Search Results for ","Rizultats do cweraedje po "}.
{"Search users in ","Cweri des uzeus dins "}.
{"Send announcement to all online users on all hosts","Evoyî l' anonce a tos les uzeus raloyîs so tos les lodjoes"}.
{"Send announcement to all online users","Evoyî l' anonce a tos les uzeus raloyîs"}.
{"Send announcement to all users on all hosts","Evoyî l' anonce a tos les uzeus so tos les lodjoes"}.
{"Send announcement to all online users on all hosts","Evoyî l' anonce a tos les uzeus raloyîs so tos les lodjoes"}.
{"Send announcement to all users","Evoyî l' anonce a tos les uzeus"}.
{"Send announcement to all users on all hosts","Evoyî l' anonce a tos les uzeus so tos les lodjoes"}.
{"September","setimbe"}.
{"Server:","Sierveu:"}.
{"Set message of the day and send to online users","Defini l' messaedje do djoû et l' evoyî åzès uzeus raloyîs"}.
@@ -280,16 +265,16 @@
{"Show Integral Table","Mostrer totå"}.
{"Show Ordinary Table","Mostrer crexhince"}.
{"Shut Down Service","Arester siervice"}.
{"~s invites you to the room ~s","~s vos preye sol såle ~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Des cliyints Jabber k' i gn a polèt wårder vosse sicret sol copiutrece, mins vos n' duvrîz fé çoula ki sol copiutrece da vosse, po des råjhons di såvrité."}.
{"~s's Offline Messages Queue","messaedjes ki ratindèt el cawêye po ~s"}.
{"Start Modules at ","Renonder les modules so "}.
{"Start Modules","Enonder des modules"}.
{"Start","Enonder"}.
{"Statistics of ~p","Sitatistikes di ~p"}.
{"Statistics","Sitatistikes"}.
{"Stop Modules at ","Arester les modules so "}.
{"Stop Modules","Arester des modules"}.
{"Stop","Arester"}.
{"Stop Modules","Arester des modules"}.
{"Stop Modules at ","Arester les modules so "}.
{"Stopped Nodes","Nuks essoctés"}.
{"Storage Type","Sôre di wårdaedje"}.
{"Store binary backup:","Copeye di såvrité binaire:"}.
@@ -303,8 +288,8 @@
{"That nickname is registered by another person","Li metou no est ddja edjîstré pa ene ôte sakî"}.
{"The CAPTCHA is valid.","Li CAPTCHA est valide."}.
{"The CAPTCHA verification has failed","Li verifiaedje CAPTCHA a fwait berwete"}.
{"The password is too weak","li scret est trop flåw"}.
{"the password is","li scret est"}.
{"The password is too weak","li scret est trop flåw"}.
{"The password of your Jabber account was successfully changed.","Li scret do conte Jabber da vosse a stî candjî comifåt."}.
{"There was an error changing the password: ","Åk n' a nén stî tot candjant l' sicret: "}.
{"There was an error creating the account: ","Åk n' a nén stî tot ahivant l' conte: "}.
@@ -314,12 +299,13 @@
{"This page allows to unregister a Jabber account in this Jabber server.","Cisse pådje permete di disdjîstrer on conte Jabber so ç' sierveu ci."}.
{"This room is not anonymous","Cisse såle ci n' est nén anonime"}.
{"Thursday","djudi"}.
{"Time delay","Tårdjaedje"}.
{"Time","Date"}.
{"To ~s","Viè ~s"}.
{"Time delay","Tårdjaedje"}.
{"Too many CAPTCHA requests","Pår trop di dmandes CAPTCHA"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","I gn a-st avou pår trop (~p) d' otintifiaedjes k' ont fwait berwete vinant di ciste adresse IP la (~s). L' adresse serè disblokêye a ~s UTC"}.
{"Too many unacked stanzas","Pår trop di messaedjes sins acertinaedje di rçuvaedje"}.
{"To","Po"}.
{"To ~s","Viè ~s"}.
{"Total rooms","Totå di såles"}.
{"Traffic rate limit is exceeded","Li limite pol volume di trafik a stî passêye"}.
{"Transactions Aborted:","Transaccions arestêyes:"}.
@@ -333,16 +319,16 @@
{"Unregister","Disdjîstrer"}.
{"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","Mete a djoû"}.
{"Update plan","Plan d' metaedje a djoû"}.
{"Update ~p","Metaedje a djoû di ~p"}.
{"Update script","Sicripe di metaedje a djoû"}.
{"Update","Mete a djoû"}.
{"Uptime:","Tins dispoy l' enondaedje:"}.
{"User Management","Manaedjaedje des uzeus"}.
{"User ~s","Uzeu ~s"}.
{"Username:","No d' uzeu:"}.
{"Users are not allowed to register accounts so quickly","Les noveas uzeus n' si polèt nén edjîstrer si raddimint"}.
{"Users Last Activity","Dierinne activité des uzeus"}.
{"User ~s","Uzeu ~s"}.
{"Users","Uzeus"}.
{"User","Uzeu"}.
{"Validate","Valider"}.
@@ -363,4 +349,3 @@
{"Your contact offline message queue is full. The message has been discarded.","Li cawêye di messaedjes e môde disraloyî di vosse soçon est plinne. Li messaedje a stî tapé å diale."}.
{"Your Jabber account was successfully created.","Li conte Jabber da vosse a stî ahivé comifåt."}.
{"Your Jabber account was successfully deleted.","Li conte Jabber da vosse a stî disfacé comifåt."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Vos messaedjes po ~s sont blokés. Po les disbloker, alez vey ~s"}.
+776 -663
View File
File diff suppressed because it is too large Load Diff
+25 -44
View File
@@ -1,12 +1,6 @@
%% -*- coding: latin-1 -*-
{" has set the subject to: ","已将标题设置为: "}.
{"A password is required to enter this room","进入此房间需要密码"}.
%% -*- coding: utf-8 -*-
{"Accept","接受"}.
{"Access Configuration","访问配置"}.
{"Access Control List Configuration","访问控制列表(ACL)配置"}.
{"Access Control Lists","访问控制列表(ACL)"}.
{"Access denied by service policy","访问被服务策略拒绝"}.
{"Access Rules","访问规则"}.
{"Action on user","对用户的动作"}.
{"Add Jabber ID","添加Jabber ID"}.
{"Add New","添加新用户"}.
@@ -15,7 +9,6 @@
{"Administration","管理"}.
{"Administrator privileges required","需要管理员权限"}.
{"All activity","所有活动"}.
{"All Users","所有用户"}.
{"Allow users to change the subject","允许用户更改主题"}.
{"Allow users to query other users","允许用户查询其它用户"}.
{"Allow users to send invites","允许用户发送邀请"}.
@@ -23,7 +16,9 @@
{"Allow visitors to change nickname","允许用户更改昵称"}.
{"Allow visitors to send private messages to","允许访客发送私聊消息至"}.
{"Allow visitors to send status text in presence updates","更新在线状态时允许用户发送状态文本"}.
{"All Users","所有用户"}.
{"Announcements","通知"}.
{"A password is required to enter this room","进入此房间需要密码"}.
{"April","四月"}.
{"August","八月"}.
{"Automatic node creation is not enabled","未启用自动节点创建"}.
@@ -114,7 +109,6 @@
{"Family Name","姓氏"}.
{"February","二月"}.
{"File larger than ~w bytes","文件大于 ~w 字节"}.
{"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","从"}.
@@ -125,13 +119,14 @@
{"Get User Password","获取用户密码"}.
{"Get User Statistics","获取用户统计"}.
{"Given Name","中间名"}.
{"Group ","组"}.
{"Groups","组"}.
{"Group ","组"}.
{"has been banned","已被禁止"}.
{"has been kicked because of a system shutdown","因系统关机而被踢出"}.
{"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 unknown","主人未知"}.
{"Host","主机"}.
{"If you don't see the CAPTCHA image here, visit the web page.","如果您在这里没有看到验证码图片, 请访问网页."}.
@@ -156,7 +151,6 @@
{"Invalid 'from' attribute in forwarded message","转发的信息中 'from' 属性的值无效"}.
{"Invitations are not allowed in this conference","此会议不允许邀请"}.
{"IP addresses","IP地址"}.
{"IP","IP"}.
{"is now known as","现在称呼为"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","不允许将错误消息发送到该房间. 参与者(~s)已发送过一条消息(~s)并已被踢出房间"}.
{"It is not allowed to send private messages of type \"groupchat\"","\"群组聊天\"类型不允许发送私聊消息"}.
@@ -175,8 +169,6 @@
{"leaves the room","离开房间"}.
{"List of modules to start","要启动的模块列表"}.
{"List of rooms","房间列表"}.
{"Listened Ports at ","监听的端口位于"}.
{"Listened Ports","被监听的端口"}.
{"Low level update script","低级别更新脚本"}.
{"Make participants list public","公开参与人列表"}.
{"Make room CAPTCHA protected","保护房间验证码"}.
@@ -199,9 +191,7 @@
{"Moderator privileges required","需要主持人权限"}.
{"Modified modules","被修改模块"}.
{"Module failed to handle the query","模块未能处理查询"}.
{"Modules at ~p","位于~p的模块"}.
{"Modules","模块"}.
{"Module","模块"}.
{"Monday","星期一"}.
{"Multicast","多重映射"}.
{"Multiple <item/> elements are not allowed by RFC6121","按照 RFC6121,多个 <item/> 元素是不允许的"}.
@@ -215,20 +205,26 @@
{"Nickname Registration at ","昵称注册于"}.
{"Nickname ~s does not exist in the room","昵称~s不在该房间"}.
{"Nickname","昵称"}.
{"No 'access' found in data form","数据表单中未发现 'access'"}.
{"No 'acls' found in data form","数据表单中未发现 'acls'"}.
{"No 'affiliation' attribute found","未发现 'affiliation' 属性"}.
{"No available resource found","没发现可用资源"}.
{"No body provided for announce message","通知消息无正文内容"}.
{"No data form found","没有找到数据表单"}.
{"No Data","没有数据"}.
{"Node already exists","节点已存在"}.
{"Node index not found","没有找到节点索引"}.
{"Node not found","没有找到节点"}.
{"Nodeprep has failed","Nodeprep 已失效"}.
{"Node ~p","节点~p"}.
{"Nodes","节点"}.
{"No features available","没有可用特征"}.
{"No hook has processed this command","没有任何钩子已处理此命令"}.
{"No info about last activity found","未找到上次活动的信息"}.
{"No 'item' element found","没有找到 'item' 元素"}.
{"No items found in this query","此查询中没发现任何项"}.
{"No limit","不限"}.
{"No module is handling this query","没有正在处理此查询的模块"}.
{"No 'modules' found in data form","数据表单中未发现 'module'"}.
{"None","无"}.
{"No node specified","无指定节点"}.
{"No 'password' found in data form","数据表单中未发现 'password'"}.
{"No 'password' found in this query","此查询中未发现 'password'"}.
@@ -239,15 +235,8 @@
{"No running node found","没有找到运行中的节点"}.
{"No services available","无可用服务"}.
{"No statistics found for this item","未找到此项的统计数据"}.
{"No 'to' attribute found in the invitation","邀请中未发现 'to' 标签"}.
{"Node already exists","节点已存在"}.
{"Node index not found","没有找到节点索引"}.
{"Node not found","没有找到节点"}.
{"Node ~p","节点~p"}.
{"Nodeprep has failed","Nodeprep 已失效"}.
{"Nodes","节点"}.
{"None","无"}.
{"Not Found","没有找到"}.
{"No 'to' attribute found in the invitation","邀请中未发现 'to' 标签"}.
{"Not subscribed","未订阅"}.
{"November","十一月"}.
{"Number of online users","在线用户数"}.
@@ -269,7 +258,6 @@
{"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 连接"}.
@@ -285,23 +273,19 @@
{"Path to File","文件路径"}.
{"Pending","挂起"}.
{"Period: ","持续时间: "}.
{"Ping query is incorrect","Ping 查询不正确"}.
{"Ping","Ping"}.
{"Ping query is incorrect","Ping 查询不正确"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","注意:这些选项仅将备份内置的 Mnesia 数据库. 如果您正在使用 ODBC 模块, 您还需要分别备份您的数据库."}.
{"Please, wait for a while before sending new voice request","请稍后再发送新的声音请求"}.
{"Pong","Pong"}.
{"Port","端口"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","按照 RFC6121 不允许有 'ask' 属性"}.
{"private, ","保密, "}.
{"Protocol","协议"}.
{"Publishing items to collection node is not allowed","不允许"}.
{"Publish-Subscribe","发行-订阅"}.
{"PubSub subscriber request","PubSub订阅人请求"}.
{"Queries to the conference members are not allowed in this room","本房间不可以查询会议成员信息"}.
{"Query to another users is forbidden","禁止查询其他用户"}.
{"RAM and disc copy","内存与磁盘复制"}.
{"RAM copy","内存(RAM)复制"}.
{"Raw","原始格式"}.
{"Really delete message of the day?","确实要删除每日消息吗?"}.
{"Recipient is not in the conference room","接收人不在会议室"}.
{"Register a Jabber account","注册Jabber帐户"}.
@@ -332,8 +316,6 @@
{"Roster","花名册"}.
{"RPC Call Error","RPC 调用错误"}.
{"Running Nodes","运行中的节点"}.
{"~s access rule configuration","~s访问规则配置"}.
{"~s invites you to the room ~s","~s邀请你到房间~s"}.
{"Saturday","星期六"}.
{"Scan failed","扫描失败."}.
{"Script check","脚本检查"}.
@@ -352,11 +334,11 @@
{"Show Integral Table","显示完整列表"}.
{"Show Ordinary Table","显示普通列表"}.
{"Shut Down Service","关闭服务"}.
{"~s invites you to the room ~s","~s邀请你到房间~s"}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","某些 Jabber 客户端可以在你的计算机里存储密码. 请仅在你确认你的计算机安全的情况下使用该功能."}.
{"~s's Offline Messages Queue","~s的离线消息队列"}.
{"Start Modules at ","要启动的模块位于 "}.
{"Start Modules","启动模块"}.
{"Start","开始"}.
{"Statistics of ~p","~p的统计"}.
{"Statistics","统计"}.
{"Stop Modules at ","要停止的模块位于 "}.
@@ -383,10 +365,10 @@
{"The password of your Jabber account was successfully changed.","你的Jabber帐户密码已成功更新."}.
{"The query is only allowed from local users","仅本地用户可以查询"}.
{"The query must not contain <item/> elements","查询不能包含 <item/> 元素"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","本节必须只含一个 <active/> 元素, <default/> 元素,或 <list/> 元素"}.
{"There was an error changing the password: ","修改密码出错: "}.
{"There was an error creating the account: ","帐户创建出错: "}.
{"There was an error deleting the account: ","帐户删除失败: "}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","本节必须只含一个 <active/> 元素, <default/> 元素,或 <list/> 元素"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","此处不区分大小写: macbeth 与 MacBeth 和 Macbeth 是一样的."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","本页面允许在此服务器上创建Jabber帐户. 你的JID (Jabber ID) 的形式如下: 用户名@服务器. 请仔细阅读说明并正确填写相应字段."}.
{"This page allows to unregister a Jabber account in this Jabber server.","此页面允许在此Jabber服务器上注销Jabber帐户"}.
@@ -394,15 +376,16 @@
{"Thursday","星期四"}.
{"Time delay","时间延迟"}.
{"Time","时间"}.
{"To register, visit ~s","要注册,请访问 ~s"}.
{"To ~s","发送给~s"}.
{"Token TTL","TTL令牌"}.
{"Too many active bytestreams","活跃的字节流太多"}.
{"Too many CAPTCHA requests","验证码请求太多"}.
{"Too many <item/> elements","太多 <item/> 元素"}.
{"Too many <list/> elements","太多 <list/> 元素"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","来自IP地址(~p)的(~s)失败认证太多. 该地址将在UTC时间~s被禁用."}.
{"Too many unacked stanzas","未被确认的节太多"}.
{"Too many users in this conference","该会议的用户太多"}.
{"To register, visit ~s","要注册,请访问 ~s"}.
{"To ~s","发送给~s"}.
{"Total rooms","所有房间"}.
{"To","到"}.
{"Traffic rate limit is exceeded","已经超过传输率限制"}.
@@ -428,14 +411,13 @@
{"User already exists","用户已存在"}.
{"User (jid)","用户 (jid)"}.
{"User Management","用户管理"}.
{"User part of JID in 'from' is empty","'from' 中 JID 值的用户部分为空"}.
{"User session not found","用户会话未找到"}.
{"User session terminated","用户会话已终止"}.
{"User ~s","用户~s"}.
{"Username:","用户名:"}.
{"Users are not allowed to register accounts so quickly","不允许用户太频繁地注册帐户"}.
{"User session not found","用户会话未找到"}.
{"User session terminated","用户会话已终止"}.
{"Users Last Activity","用户上次活动"}.
{"Users","用户"}.
{"User ~s","用户~s"}.
{"User","用户"}.
{"Validate","确认"}.
{"Value 'get' of 'type' attribute is not allowed","不允许 'type' 属性的 'get' 值"}.
@@ -459,7 +441,6 @@
{"You need an x:data capable client to search","您需要一个兼容 x:data 的客户端来搜索"}.
{"Your active privacy list has denied the routing of this stanza.","你的活跃私聊列表拒绝了在此房间进行路由分发."}.
{"Your contact offline message queue is full. The message has been discarded.","您的联系人离线消息队列已满. 消息已被丢弃"}.
{"You're not allowed to create nodes","您不可以创建节点"}.
{"Your Jabber account was successfully created.","你的Jabber帐户已成功创建."}.
{"Your Jabber account was successfully deleted.","你的 Jabber 帐户已成功删除."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","您发送给~s的消息已被阻止. 要解除阻止, 请访问 ~s"}.
{"You're not allowed to create nodes","您不可以创建节点"}.
+787 -660
View File
File diff suppressed because it is too large Load Diff
+22 -17
View File
@@ -19,21 +19,24 @@
%%%----------------------------------------------------------------------
{deps, [{lager, ".*", {git, "https://github.com/erlang-lager/lager", "3.6.10"}},
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.15"}}},
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.19"}}},
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.1"}}},
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.16"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.36"}}},
{xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.3.4"}}},
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.19"}}},
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.16"}}},
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.20"}}},
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.2"}}},
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.17"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.37"}}},
{idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}},
{xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.4.2"}}},
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.21"}}},
{yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.1"}}},
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "0.14.8"}}},
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.5"}}},
{pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.2"}}},
{pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.4"}}},
{jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.8.4"}}},
{eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.11"}}},
{mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.3"}}},
{if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.28"}}}},
{if_var_true, sip, {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.29"}}}},
{eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.12"}}},
{mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.5"}}},
{p1_acme, ".*", {git, "https://github.com/processone/p1_acme.git", {tag, "1.0.1"}}},
{if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.29"}}}},
{if_var_true, sip, {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.30"}}}},
{if_var_true, mysql, {p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql",
{tag, "1.0.11"}}}},
{if_var_true, pgsql, {p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql",
@@ -44,8 +47,6 @@
{tag, "1.0.6"}}}},
{if_var_true, zlib, {ezlib, ".*", {git, "https://github.com/processone/ezlib",
{tag, "1.0.6"}}}},
{if_var_true, riak, {riakc, ".*", {git, "https://github.com/processone/riak-erlang-client",
{tag, {if_version_above, "19", "develop", "2.5.3"}}}}},
%% Elixir support, needed to run tests
{if_var_true, elixir, {elixir, ".*", {git, "https://github.com/elixir-lang/elixir",
{tag, {if_version_above, "17", "v1.4.4", "v1.1.1"}}}}},
@@ -74,7 +75,9 @@
ezlib,
eimp,
mqtree,
pkix]}}.
pkix,
yconf,
p1_acme]}}.
{erl_first_files, ["src/ejabberd_sql_pt.erl", "src/ejabberd_config.erl",
"src/gen_mod.erl", "src/mod_muc_room.erl",
@@ -95,6 +98,7 @@
{if_var_true, elixir, {d, 'ELIXIR_ENABLED'}},
{if_var_true, new_sql_schema, {d, 'NEW_SQL_SCHEMA'}},
{if_var_true, hipe, native},
{if_have_fun, {erl_error, format_exception, 6}, {d, 'HAVE_ERL_ERROR'}},
{src_dirs, [src,
{if_var_true, tools, tools},
{if_var_true, elixir, include}]}]}.
@@ -127,8 +131,6 @@
{if_var_false, mysql, "(\".*mysql.*\":_/_)"},
{if_var_false, pgsql, "(\".*pgsql.*\":_/_)"},
{if_var_false, pam, "(\"epam\":_/_)"},
{if_var_false, riak, "(\"riak.*\":_/_)"},
{if_var_true, riak, "(\"riak_object\":_/_)"},
{if_var_false, zlib, "(\"ezlib\":_/_)"},
{if_var_false, http, "(\"lhttpc\":_/_)"},
{if_var_false, odbc, "(\"odbc\":_/_)"},
@@ -146,6 +148,9 @@
{cover_export_enabled, true}.
{recursive_cmds, ['configure-deps']}.
{overrides, [
{del, [{erl_opts, [warnings_as_errors]}]}]}.
{post_hook_configure, [{"fast_tls", []},
{"stringprep", []},
{"fast_yaml", []},
+1 -1
View File
@@ -299,7 +299,7 @@ fun(Hooks) ->
lists:map(fun({Pkg, Flags}) ->
DepPath = ResolveDepPath("deps/" ++ Pkg ++ "/"),
Line = lists:flatten(GenDepConfigureLine(DepPath, Flags)),
{add, list_to_atom(Pkg), [{pre_hooks, [{'compile', Line}, {'configure-deps', Line}]}]}
{add, list_to_atom(Pkg), [{pre_hooks, [{{pc, compile}, Line}, {'compile', Line}, {'configure-deps', Line}]}]}
end, Hooks)
end,
+24 -24
View File
@@ -18,7 +18,7 @@
CREATE TABLE users (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
password text NOT NULL,
serverkey varchar(64) NOT NULL DEFAULT '',
salt varchar(64) NOT NULL DEFAULT '',
@@ -34,7 +34,7 @@ CREATE TABLE users (
CREATE TABLE last (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
seconds text NOT NULL,
state text NOT NULL,
PRIMARY KEY (server_host(191), username)
@@ -43,7 +43,7 @@ CREATE TABLE last (
CREATE TABLE rosterusers (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
jid varchar(191) NOT NULL,
nick text NOT NULL,
subscription character(1) NOT NULL,
@@ -61,7 +61,7 @@ CREATE INDEX i_rosteru_sh_jid ON rosterusers(server_host(191), jid);
CREATE TABLE rostergroups (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
jid varchar(191) NOT NULL,
grp text NOT NULL
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -70,7 +70,7 @@ CREATE INDEX i_rosterg_sh_user_jid ON rostergroups(server_host(191), username(75
CREATE TABLE sr_group (
name varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
opts text NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (server_host(191), name)
@@ -78,7 +78,7 @@ CREATE TABLE sr_group (
CREATE TABLE sr_user (
jid varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
grp varchar(191) NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (server_host(191), jid, grp)
@@ -89,7 +89,7 @@ CREATE INDEX i_sr_user_sh_grp ON sr_user(server_host(191), grp);
CREATE TABLE spool (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
xml mediumtext NOT NULL,
seq BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
@@ -100,7 +100,7 @@ CREATE INDEX i_spool_created_at USING BTREE ON spool(created_at);
CREATE TABLE archive (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
timestamp BIGINT UNSIGNED NOT NULL,
peer varchar(191) NOT NULL,
bare_peer varchar(191) NOT NULL,
@@ -120,7 +120,7 @@ CREATE INDEX i_archive_sh_timestamp USING BTREE ON archive(server_host(191), tim
CREATE TABLE archive_prefs (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
def text NOT NULL,
always text NOT NULL,
never text NOT NULL,
@@ -130,7 +130,7 @@ CREATE TABLE archive_prefs (
CREATE TABLE vcard (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
vcard mediumtext NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (server_host(191), username)
@@ -139,7 +139,7 @@ CREATE TABLE vcard (
CREATE TABLE vcard_search (
username varchar(191) NOT NULL,
lusername varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
fn text NOT NULL,
lfn varchar(191) NOT NULL,
family text NOT NULL,
@@ -179,14 +179,14 @@ CREATE INDEX i_vcard_search_sh_lorgunit ON vcard_search(server_host(191), lorgu
CREATE TABLE privacy_default_list (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
name varchar(191) NOT NULL,
PRIMARY KEY (server_host(191), username)
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE privacy_list (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
name varchar(191) NOT NULL,
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
@@ -212,7 +212,7 @@ CREATE INDEX i_privacy_list_data_id ON privacy_list_data(id);
CREATE TABLE private_storage (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
namespace varchar(191) NOT NULL,
data text NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -224,7 +224,7 @@ CREATE INDEX i_private_storage_sh_username USING BTREE ON private_storage(server
-- Not tested in mysql
CREATE TABLE roster_version (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
version text NOT NULL,
PRIMARY KEY (server_host(191), username)
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -292,7 +292,7 @@ CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt(subid(3
CREATE TABLE muc_room (
name text NOT NULL,
host text NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
opts mediumtext NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -302,7 +302,7 @@ CREATE UNIQUE INDEX i_muc_room_name_host USING BTREE ON muc_room(name(75), host(
CREATE TABLE muc_registered (
jid text NOT NULL,
host text NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
nick text NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -313,7 +313,7 @@ CREATE UNIQUE INDEX i_muc_registered_jid_host USING BTREE ON muc_registered(jid(
CREATE TABLE muc_online_room (
name text NOT NULL,
host text NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
node text NOT NULL,
pid text NOT NULL
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -326,7 +326,7 @@ CREATE TABLE muc_online_users (
resource text NOT NULL,
name text NOT NULL,
host text NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
node text NOT NULL
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -347,7 +347,7 @@ CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers
CREATE TABLE motd (
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
xml text,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (server_host(191), username)
@@ -367,7 +367,7 @@ CREATE TABLE sm (
pid text NOT NULL,
node text NOT NULL,
username varchar(191) NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
resource varchar(191) NOT NULL,
priority text NOT NULL,
info text NOT NULL,
@@ -386,7 +386,7 @@ CREATE TABLE oauth_token (
CREATE TABLE route (
domain text NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
node text NOT NULL,
pid text NOT NULL,
local_hint text NOT NULL
@@ -417,7 +417,7 @@ CREATE INDEX i_proxy65_jid ON proxy65 (jid_i(191));
CREATE TABLE push_session (
username text NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
timestamp bigint NOT NULL,
service text NOT NULL,
node text NOT NULL,
@@ -471,7 +471,7 @@ CREATE INDEX i_mix_subscription_chan_serv ON mix_subscription (channel(191), ser
CREATE TABLE mix_pam (
username text NOT NULL,
server_host text NOT NULL,
server_host varchar(191) NOT NULL,
channel text NOT NULL,
service text NOT NULL,
id text NOT NULL,
+147 -146
View File
File diff suppressed because it is too large Load Diff
+298 -700
View File
File diff suppressed because it is too large Load Diff
-144
View File
@@ -1,144 +0,0 @@
-module(acme_challenge).
-export ([key_authorization/2,
solve_challenge/3,
process/2,
register_hooks/1,
unregister_hooks/1,
acme_handler/3
]).
%% Challenge Types
%% ================
%% 1. http-01: https://tools.ietf.org/html/draft-ietf-acme-acme-05#section-7.2
%% 2. dns-01: https://tools.ietf.org/html/draft-ietf-acme-acme-05#section-7.3
%% 3. tls-sni-01: https://tools.ietf.org/html/draft-ietf-acme-acme-05#section-7.4
%% 4. (?) oob-01: https://tools.ietf.org/html/draft-ietf-acme-acme-05#section-7.5
-include("logger.hrl").
-include("xmpp.hrl").
-include("ejabberd_http.hrl").
-include("ejabberd_acme.hrl").
%% This is the default endpoint for the http challenge
%% This hooks is called from ejabberd_http
acme_handler(Handlers, _Host, Request) ->
case Request#request.path of
[<<".well-known">>|_] ->
[{[<<".well-known">>],acme_challenge}|Handlers];
_ ->
Handlers
end.
%% TODO: Maybe validate request here??
process(LocalPath, _Request) ->
Result = ets_get_key_authorization(LocalPath),
{200,
[{<<"Content-Type">>, <<"text/plain">>}],
Result}.
register_hooks(_Domain) ->
?INFO_MSG("Registering hook for ACME HTTP headers", []),
ejabberd_hooks:add(http_request_handlers, ?MODULE, acme_handler, 50).
unregister_hooks(_Domain) ->
?INFO_MSG("Unregistering hook for ACME HTTP headers", []),
ejabberd_hooks:delete(http_request_handlers, ?MODULE, acme_handler, 50).
-spec key_authorization(bitstring(), jose_jwk:key()) -> bitstring().
key_authorization(Token, Key) ->
Thumbprint = jose_jwk:thumbprint(Key),
KeyAuthorization = erlang:iolist_to_binary([Token, <<".">>, Thumbprint]),
KeyAuthorization.
-spec parse_challenge({proplist()}) -> {ok, acme_challenge()} | {error, _}.
parse_challenge(Challenge0) ->
try
{Challenge} = Challenge0,
{<<"type">>,Type} = proplists:lookup(<<"type">>, Challenge),
{<<"status">>,Status} = proplists:lookup(<<"status">>, Challenge),
{<<"uri">>,Uri} = proplists:lookup(<<"uri">>, Challenge),
{<<"token">>,Token} = proplists:lookup(<<"token">>, Challenge),
Res =
#challenge{
type = Type,
status = list_to_atom(bitstring_to_list(Status)),
uri = bitstring_to_list(Uri),
token = Token
},
{ok, Res}
catch
_:Error ->
{error, Error}
end.
-spec solve_challenge(bitstring(), [{proplist()}], _) ->
{ok, url(), bitstring()} | {error, _}.
solve_challenge(ChallengeType, Challenges, Options) ->
ParsedChallenges = [parse_challenge(Chall) || Chall <- Challenges],
case lists:any(fun is_error/1, ParsedChallenges) of
true ->
?ERROR_MSG("Error parsing challenges: ~p~n", [Challenges]),
{error, parse_challenge};
false ->
case [C || {ok, C} <- ParsedChallenges, is_challenge_type(ChallengeType, C)] of
[Challenge] ->
solve_challenge1(Challenge, Options);
_ ->
?ERROR_MSG("Challenge ~p not found in challenges: ~p~n", [ChallengeType, Challenges]),
{error, not_found}
end
end.
-spec solve_challenge1(acme_challenge(), {jose_jwk:key(), string()}) ->
{ok, url(), bitstring()} | {error, _}.
solve_challenge1(Chal = #challenge{type = <<"http-01">>, token=Tkn}, Key) ->
KeyAuthz = key_authorization(Tkn, Key),
%% save_key_authorization(Chal, Tkn, KeyAuthz, HttpDir);
ets_put_key_authorization(Tkn, KeyAuthz),
{ok, Chal#challenge.uri, KeyAuthz};
solve_challenge1(Challenge, _Key) ->
?ERROR_MSG("Unknown Challenge Type: ~p", [Challenge]),
{error, unknown_challenge}.
-spec ets_put_key_authorization(bitstring(), bitstring()) -> ok.
ets_put_key_authorization(Tkn, KeyAuthz) ->
Tab = ets_get_acme_table(),
Key = [<<"acme-challenge">>, Tkn],
ets:insert(Tab, {Key, KeyAuthz}),
ok.
-spec ets_get_key_authorization([bitstring()]) -> bitstring().
ets_get_key_authorization(Key) ->
Tab = ets_get_acme_table(),
case ets:lookup(Tab, Key) of
[{Key, KeyAuthz}] ->
ets:delete(Tab, Key),
KeyAuthz;
_ ->
?ERROR_MSG("Unable to serve key authorization in: ~p", [Key]),
<<"">>
end.
-spec ets_get_acme_table() -> atom().
ets_get_acme_table() ->
case ets:info(acme) of
undefined ->
ets:new(acme, [named_table, public]);
_ ->
acme
end.
%% Useful functions
is_challenge_type(DesiredType, #challenge{type = Type}) when DesiredType =:= Type ->
true;
is_challenge_type(_DesiredType, #challenge{type = _Type}) ->
false.
-spec is_error({'error', _}) -> 'true';
({'ok', _}) -> 'false'.
is_error({error, _}) -> true;
is_error(_) -> false.
+720
View File
@@ -0,0 +1,720 @@
%%%----------------------------------------------------------------------
%%% File : econf.erl
%%% Purpose : Validator for ejabberd configuration options
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2019 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.,
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%%%
%%%----------------------------------------------------------------------
-module(econf).
%% API
-export([parse/3, validate/2, fail/1, format_error/2, replace_macros/1]).
%% Simple types
-export([pos_int/0, pos_int/1, non_neg_int/0, non_neg_int/1]).
-export([int/0, int/2, number/1, octal/0]).
-export([binary/0, binary/1, binary/2]).
-export([string/0, string/1, string/2]).
-export([enum/1, bool/0, atom/0, any/0]).
%% Complex types
-export([url/0, url/1]).
-export([file/0, file/1]).
-export([directory/0, directory/1]).
-export([ip/0, ipv4/0, ipv6/0, ip_mask/0, port/0]).
-export([re/0, re/1, glob/0, glob/1]).
-export([path/0, binary_sep/1]).
-export([beam/0, beam/1, base64/0]).
-export([timeout/1, timeout/2]).
%% Composite types
-export([list/1, list/2]).
-export([list_or_single/1, list_or_single/2]).
-export([map/2, map/3]).
-export([either/2, and_then/2, non_empty/1]).
-export([options/1, options/2]).
%% Custom types
-export([acl/0, shaper/0, url_or_file/0, lang/0]).
-export([pem/0, queue_type/0]).
-export([jid/0, user/0, domain/0, resource/0]).
-export([db_type/1, ldap_filter/0]).
-export([host/0, hosts/0]).
-export([vcard_temp/0]).
-ifdef(SIP).
-export([sip_uri/0]).
-endif.
-type error_reason() :: term().
-type error_return() :: {error, error_reason(), yconf:ctx()}.
-type validator() :: yconf:validator().
-type validator(T) :: yconf:validator(T).
-type validators() :: yconf:validators().
-export_type([validator/0, validator/1, validators/0]).
-export_type([error_reason/0, error_return/0]).
%%%===================================================================
%%% API
%%%===================================================================
parse(File, Validators, Options) ->
try yconf:parse(File, Validators, Options)
catch _:{?MODULE, Reason, Ctx} ->
{error, Reason, Ctx}
end.
validate(Validator, Y) ->
try yconf:validate(Validator, Y)
catch _:{?MODULE, Reason, Ctx} ->
{error, Reason, Ctx}
end.
replace_macros(Y) ->
yconf:replace_macros(Y).
-spec fail(error_reason()) -> no_return().
fail(Reason) ->
yconf:fail(?MODULE, Reason).
format_error({bad_module, Mod}, Ctx)
when Ctx == [listen, module];
Ctx == [listen, request_handlers] ->
Mods = ejabberd_config:beams(all),
format("~ts: unknown ~ts: ~ts. Did you mean ~ts?",
[yconf:format_ctx(Ctx),
format_module_type(Ctx),
format_module(Mod),
format_module(misc:best_match(Mod, Mods))]);
format_error({bad_module, Mod}, Ctx)
when Ctx == [modules] ->
Mods = lists:filter(
fun(M) ->
case atom_to_list(M) of
"mod_" ++ _ -> true;
"Elixir.Mod" ++ _ -> true;
_ -> false
end
end, ejabberd_config:beams(all)),
format("~ts: unknown ~ts: ~ts. Did you mean ~ts?",
[yconf:format_ctx(Ctx),
format_module_type(Ctx),
format_module(Mod),
format_module(misc:best_match(Mod, Mods))]);
format_error({bad_export, {F, A}, Mod}, Ctx)
when Ctx == [listen, module];
Ctx == [listen, request_handlers];
Ctx == [modules] ->
Type = format_module_type(Ctx),
Slogan = yconf:format_ctx(Ctx),
case lists:member(Mod, ejabberd_config:beams(local)) of
true ->
format("~ts: '~ts' is not a ~ts",
[Slogan, format_module(Mod), Type]);
false ->
case lists:member(Mod, ejabberd_config:beams(external)) of
true ->
format("~ts: third-party ~ts '~ts' doesn't export "
"function ~ts/~B. If it's really a ~ts, "
"consider to upgrade it",
[Slogan, Type, format_module(Mod),F, A, Type]);
false ->
format("~ts: '~ts' doesn't match any known ~ts",
[Slogan, format_module(Mod), Type])
end
end;
format_error({unknown_option, [], _} = Why, Ctx) ->
format("~ts. There are no available options",
[yconf:format_error(Why, Ctx)]);
format_error({unknown_option, Known, Opt} = Why, Ctx) ->
format("~ts. Did you mean ~ts? ~ts",
[yconf:format_error(Why, Ctx),
misc:best_match(Opt, Known),
format_known("Available options", Known)]);
format_error({bad_enum, Known, Bad} = Why, Ctx) ->
format("~ts. Did you mean ~ts? ~ts",
[yconf:format_error(Why, Ctx),
misc:best_match(Bad, Known),
format_known("Possible values", Known)]);
format_error({bad_yaml, _, _} = Why, _) ->
format_error(Why);
format_error(Reason, Ctx) ->
[H|T] = format_error(Reason),
yconf:format_ctx(Ctx) ++ ": " ++ [string:to_lower(H)|T].
format_error({bad_db_type, _, Atom}) ->
format("unsupported database: ~ts", [Atom]);
format_error({bad_lang, Lang}) ->
format("Invalid language tag: ~ts", [Lang]);
format_error({bad_pem, Why, Path}) ->
format("Failed to read PEM file '~ts': ~ts",
[Path, pkix:format_error(Why)]);
format_error({bad_cert, Why, Path}) ->
format_error({bad_pem, Why, Path});
format_error({bad_jwt_key, Path}) ->
format("No valid JWT key found in file: ~ts", [Path]);
format_error({bad_jid, Bad}) ->
format("Invalid XMPP address: ~ts", [Bad]);
format_error({bad_user, Bad}) ->
format("Invalid user part: ~ts", [Bad]);
format_error({bad_domain, Bad}) ->
format("Invalid domain: ~ts", [Bad]);
format_error({bad_resource, Bad}) ->
format("Invalid resource part: ~ts", [Bad]);
format_error({bad_ldap_filter, Bad}) ->
format("Invalid LDAP filter: ~ts", [Bad]);
format_error({bad_sip_uri, Bad}) ->
format("Invalid SIP URI: ~ts", [Bad]);
format_error({route_conflict, R}) ->
format("Failed to reuse route '~ts' because it's "
"already registered on a virtual host",
[R]);
format_error({listener_dup, AddrPort}) ->
format("Overlapping listeners found at ~ts",
[format_addr_port(AddrPort)]);
format_error({listener_conflict, AddrPort1, AddrPort2}) ->
format("Overlapping listeners found at ~ts and ~ts",
[format_addr_port(AddrPort1),
format_addr_port(AddrPort2)]);
format_error({invalid_syntax, Reason}) ->
format("~ts", [Reason]);
format_error({missing_module_dep, Mod, DepMod}) ->
format("module ~ts depends on module ~ts, "
"which is not found in the config",
[Mod, DepMod]);
format_error(eimp_error) ->
format("ejabberd is built without image converter support", []);
format_error({mqtt_codec, Reason}) ->
mqtt_codec:format_error(Reason);
format_error(Reason) ->
yconf:format_error(Reason).
-spec format_module(atom()) -> string().
format_module(Mod) ->
case atom_to_list(Mod) of
"Elixir." ++ M -> M;
M -> M
end.
format_module_type([listen, module]) ->
"listening module";
format_module_type([listen, request_handlers]) ->
"HTTP request handler";
format_module_type([modules]) ->
"ejabberd module".
format_known(_, Known) when length(Known) > 20 ->
"";
format_known(Prefix, Known) ->
[Prefix, " are: ", format_join(Known)].
format_join([]) ->
"(empty)";
format_join([H|_] = L) when is_atom(H) ->
format_join([atom_to_binary(A, utf8) || A <- L]);
format_join(L) ->
str:join(lists:sort(L), <<", ">>).
%%%===================================================================
%%% Validators from yconf
%%%===================================================================
pos_int() ->
yconf:pos_int().
pos_int(Inf) ->
yconf:pos_int(Inf).
non_neg_int() ->
yconf:non_neg_int().
non_neg_int(Inf) ->
yconf:non_neg_int(Inf).
int() ->
yconf:int().
int(Min, Max) ->
yconf:int(Min, Max).
number(Min) ->
yconf:number(Min).
octal() ->
yconf:octal().
binary() ->
yconf:binary().
binary(Re) ->
yconf:binary(Re).
binary(Re, Opts) ->
yconf:binary(Re, Opts).
enum(L) ->
yconf:enum(L).
bool() ->
yconf:bool().
atom() ->
yconf:atom().
string() ->
yconf:string().
string(Re) ->
yconf:string(Re).
string(Re, Opts) ->
yconf:string(Re, Opts).
any() ->
yconf:any().
url() ->
yconf:url().
url(Schemes) ->
yconf:url(Schemes).
file() ->
yconf:file().
file(Type) ->
yconf:file(Type).
directory() ->
yconf:directory().
directory(Type) ->
yconf:directory(Type).
ip() ->
yconf:ip().
ipv4() ->
yconf:ipv4().
ipv6() ->
yconf:ipv6().
ip_mask() ->
yconf:ip_mask().
port() ->
yconf:port().
re() ->
yconf:re().
re(Opts) ->
yconf:re(Opts).
glob() ->
yconf:glob().
glob(Opts) ->
yconf:glob(Opts).
path() ->
yconf:path().
binary_sep(Sep) ->
yconf:binary_sep(Sep).
timeout(Units) ->
yconf:timeout(Units).
timeout(Units, Inf) ->
yconf:timeout(Units, Inf).
base64() ->
yconf:base64().
non_empty(F) ->
yconf:non_empty(F).
list(F) ->
yconf:list(F).
list(F, Opts) ->
yconf:list(F, Opts).
list_or_single(F) ->
yconf:list_or_single(F).
list_or_single(F, Opts) ->
yconf:list_or_single(F, Opts).
map(F1, F2) ->
yconf:map(F1, F2).
map(F1, F2, Opts) ->
yconf:map(F1, F2, Opts).
either(F1, F2) ->
yconf:either(F1, F2).
and_then(F1, F2) ->
yconf:and_then(F1, F2).
options(V) ->
yconf:options(V).
options(V, O) ->
yconf:options(V, O).
%%%===================================================================
%%% Custom validators
%%%===================================================================
beam() ->
beam([]).
beam(Exports) ->
and_then(
non_empty(binary()),
fun(<<"Elixir.", _/binary>> = Val) ->
(yconf:beam(Exports))(Val);
(<<C, _/binary>> = Val) when C >= $A, C =< $Z ->
(yconf:beam(Exports))(<<"Elixir.", Val/binary>>);
(Val) ->
(yconf:beam(Exports))(Val)
end).
acl() ->
either(
atom(),
acl:access_rules_validator()).
shaper() ->
either(
atom(),
ejabberd_shaper:shaper_rules_validator()).
-spec url_or_file() -> yconf:validator({file | url, binary()}).
url_or_file() ->
either(
and_then(url(), fun(URL) -> {url, URL} end),
and_then(file(), fun(File) -> {file, File} end)).
-spec lang() -> yconf:validator(binary()).
lang() ->
and_then(
binary(),
fun(Lang) ->
try xmpp_lang:check(Lang)
catch _:_ -> fail({bad_lang, Lang})
end
end).
-spec pem() -> yconf:validator(binary()).
pem() ->
and_then(
path(),
fun(Path) ->
case pkix:is_pem_file(Path) of
true -> Path;
{false, Reason} ->
fail({bad_pem, Reason, Path})
end
end).
-spec jid() -> yconf:validator(jid:jid()).
jid() ->
and_then(
binary(),
fun(Val) ->
try jid:decode(Val)
catch _:{bad_jid, _} = Reason -> fail(Reason)
end
end).
-spec user() -> yconf:validator(binary()).
user() ->
and_then(
binary(),
fun(Val) ->
case jid:nodeprep(Val) of
error -> fail({bad_user, Val});
U -> U
end
end).
-spec domain() -> yconf:validator(binary()).
domain() ->
and_then(
non_empty(binary()),
fun(Val) ->
try jid:tolower(jid:decode(Val)) of
{<<"">>, Domain, <<"">>} -> Domain;
_ -> fail({bad_domain, Val})
catch _:{bad_jid, _} ->
fail({bad_domain, Val})
end
end).
-spec resource() -> yconf:validator(binary()).
resource() ->
and_then(
binary(),
fun(Val) ->
case jid:resourceprep(Val) of
error -> fail({bad_resource, Val});
R -> R
end
end).
-spec db_type(module()) -> yconf:validator(atom()).
db_type(M) ->
and_then(
atom(),
fun(T) ->
case code:ensure_loaded(db_module(M, T)) of
{module, _} -> T;
{error, _} -> fail({bad_db_type, M, T})
end
end).
-spec queue_type() -> yconf:validator(ram | file).
queue_type() ->
enum([ram, file]).
-spec ldap_filter() -> yconf:validator(binary()).
ldap_filter() ->
and_then(
binary(),
fun(Val) ->
case eldap_filter:parse(Val) of
{ok, _} -> Val;
_ -> fail({bad_ldap_filter, Val})
end
end).
-ifdef(SIP).
sip_uri() ->
and_then(
binary(),
fun(Val) ->
case esip:decode_uri(Val) of
error -> fail({bad_sip_uri, Val});
URI -> URI
end
end).
-endif.
-spec host() -> yconf:validator(binary()).
host() ->
fun(Domain) ->
Host = ejabberd_config:get_myname(),
Hosts = ejabberd_config:get_option(hosts),
Domain1 = (binary())(Domain),
Domain2 = misc:expand_keyword(<<"@HOST@">>, Domain1, Host),
Domain3 = (domain())(Domain2),
case lists:member(Domain3, Hosts) of
true -> fail({route_conflict, Domain3});
false -> Domain3
end
end.
-spec hosts() -> yconf:validator([binary()]).
hosts() ->
list(host(), [unique]).
-spec vcard_temp() -> yconf:validator().
vcard_temp() ->
vcard_validator(
vcard_temp, undefined,
[{version, undefined, binary()},
{fn, undefined, binary()},
{n, undefined, vcard_name()},
{nickname, undefined, binary()},
{photo, undefined, vcard_photo()},
{bday, undefined, binary()},
{adr, [], list(vcard_adr())},
{label, [], list(vcard_label())},
{tel, [], list(vcard_tel())},
{email, [], list(vcard_email())},
{jabberid, undefined, binary()},
{mailer, undefined, binary()},
{tz, undefined, binary()},
{geo, undefined, vcard_geo()},
{title, undefined, binary()},
{role, undefined, binary()},
{logo, undefined, vcard_logo()},
{org, undefined, vcard_org()},
{categories, [], list(binary())},
{note, undefined, binary()},
{prodid, undefined, binary()},
{rev, undefined, binary()},
{sort_string, undefined, binary()},
{sound, undefined, vcard_sound()},
{uid, undefined, binary()},
{url, undefined, binary()},
{class, undefined, enum([confidential, private, public])},
{key, undefined, vcard_key()},
{desc, undefined, binary()}]).
-spec vcard_name() -> yconf:validator().
vcard_name() ->
vcard_validator(
vcard_name, undefined,
[{family, undefined, binary()},
{given, undefined, binary()},
{middle, undefined, binary()},
{prefix, undefined, binary()},
{suffix, undefined, binary()}]).
-spec vcard_photo() -> yconf:validator().
vcard_photo() ->
vcard_validator(
vcard_photo, undefined,
[{type, undefined, binary()},
{binval, undefined, base64()},
{extval, undefined, binary()}]).
-spec vcard_adr() -> yconf:validator().
vcard_adr() ->
vcard_validator(
vcard_adr, [],
[{home, false, bool()},
{work, false, bool()},
{postal, false, bool()},
{parcel, false, bool()},
{dom, false, bool()},
{intl, false, bool()},
{pref, false, bool()},
{pobox, undefined, binary()},
{extadd, undefined, binary()},
{street, undefined, binary()},
{locality, undefined, binary()},
{region, undefined, binary()},
{pcode, undefined, binary()},
{ctry, undefined, binary()}]).
-spec vcard_label() -> yconf:validator().
vcard_label() ->
vcard_validator(
vcard_label, [],
[{home, false, bool()},
{work, false, bool()},
{postal, false, bool()},
{parcel, false, bool()},
{dom, false, bool()},
{intl, false, bool()},
{pref, false, bool()},
{line, [], list(binary())}]).
-spec vcard_tel() -> yconf:validator().
vcard_tel() ->
vcard_validator(
vcard_tel, [],
[{home, false, bool()},
{work, false, bool()},
{voice, false, bool()},
{fax, false, bool()},
{pager, false, bool()},
{msg, false, bool()},
{cell, false, bool()},
{video, false, bool()},
{bbs, false, bool()},
{modem, false, bool()},
{isdn, false, bool()},
{pcs, false, bool()},
{pref, false, bool()},
{number, undefined, binary()}]).
-spec vcard_email() -> yconf:validator().
vcard_email() ->
vcard_validator(
vcard_email, [],
[{home, false, bool()},
{work, false, bool()},
{internet, false, bool()},
{pref, false, bool()},
{x400, false, bool()},
{userid, undefined, binary()}]).
-spec vcard_geo() -> yconf:validator().
vcard_geo() ->
vcard_validator(
vcard_geo, undefined,
[{lat, undefined, binary()},
{lon, undefined, binary()}]).
-spec vcard_logo() -> yconf:validator().
vcard_logo() ->
vcard_validator(
vcard_logo, undefined,
[{type, undefined, binary()},
{binval, undefined, base64()},
{extval, undefined, binary()}]).
-spec vcard_org() -> yconf:validator().
vcard_org() ->
vcard_validator(
vcard_org, undefined,
[{name, undefined, binary()},
{units, [], list(binary())}]).
-spec vcard_sound() -> yconf:validator().
vcard_sound() ->
vcard_validator(
vcard_sound, undefined,
[{phonetic, undefined, binary()},
{binval, undefined, base64()},
{extval, undefined, binary()}]).
-spec vcard_key() -> yconf:validator().
vcard_key() ->
vcard_validator(
vcard_key, undefined,
[{type, undefined, binary()},
{cred, undefined, binary()}]).
%%%===================================================================
%%% Internal functions
%%%===================================================================
-spec db_module(module(), atom()) -> module().
db_module(M, Type) ->
try list_to_atom(atom_to_list(M) ++ "_" ++ atom_to_list(Type))
catch _:system_limit ->
fail({bad_length, 255})
end.
format_addr_port({IP, Port}) ->
IPStr = case tuple_size(IP) of
4 -> inet:ntoa(IP);
8 -> "[" ++ inet:ntoa(IP) ++ "]"
end,
IPStr ++ ":" ++ integer_to_list(Port).
-spec format(iolist(), list()) -> string().
format(Fmt, Args) ->
lists:flatten(io_lib:format(Fmt, Args)).
-spec vcard_validator(atom(), term(), [{atom(), term(), validator()}]) -> validator().
vcard_validator(Name, Default, Schema) ->
Defaults = [{Key, Val} || {Key, Val, _} <- Schema],
and_then(
options(
maps:from_list([{Key, Fun} || {Key, _, Fun} <- Schema]),
[{return, map}, {unique, true}]),
fun(Options) ->
merge(Defaults, Options, Name, Default)
end).
-spec merge([{atom(), term()}], #{atom() => term()}, atom(), T) -> tuple() | T.
merge(_, Options, _, Default) when Options == #{} ->
Default;
merge(Defaults, Options, Name, _) ->
list_to_tuple([Name|[maps:get(Key, Options, Val) || {Key, Val} <- Defaults]]).
+40 -23
View File
@@ -38,7 +38,7 @@
-protocol({xep, 270, '1.0'}).
-export([start/0, stop/0, halt/0, start_app/1, start_app/2,
get_pid_file/0, check_app/1, module_name/1, is_loaded/0]).
get_pid_file/0, check_apps/0, module_name/1, is_loaded/0]).
-include("logger.hrl").
@@ -49,8 +49,8 @@ stop() ->
application:stop(ejabberd).
halt() ->
application:stop(lager),
application:stop(sasl),
_ = application:stop(lager),
_ = application:stop(sasl),
erlang:halt(1, [{flush, true}]).
%% @spec () -> false | string()
@@ -71,21 +71,15 @@ start_app(App, Type) ->
StartFlag = not is_loaded(),
start_app(App, Type, StartFlag).
check_app(App) ->
StartFlag = not is_loaded(),
spawn(fun() -> check_app_modules(App, StartFlag) end),
ok.
is_loaded() ->
Apps = application:which_applications(),
lists:keymember(ejabberd, 1, Apps).
start_app(App, Type, StartFlag) when not is_list(App) ->
start_app(App, Type, StartFlag) when is_atom(App) ->
start_app([App], Type, StartFlag);
start_app([App|Apps], Type, StartFlag) ->
case application:start(App,Type) of
ok ->
spawn(fun() -> check_app_modules(App, StartFlag) end),
start_app(Apps, Type, StartFlag);
{error, {already_started, _}} ->
start_app(Apps, Type, StartFlag);
@@ -93,23 +87,23 @@ start_app([App|Apps], Type, StartFlag) ->
case lists:member(DepApp, [App|Apps]) of
true ->
Reason = io_lib:format(
"failed to start application '~p': "
"circular dependency on '~p' detected",
"Failed to start Erlang application '~ts': "
"circular dependency with '~ts' detected",
[App, DepApp]),
exit_or_halt(Reason, StartFlag);
false ->
start_app([DepApp,App|Apps], Type, StartFlag)
end;
Err ->
Reason = io_lib:format("failed to start application '~p': ~p",
[App, Err]),
{error, Why} ->
Reason = io_lib:format(
"Failed to start Erlang application '~ts': ~ts. ~ts",
[App, format_error(Why), hint()]),
exit_or_halt(Reason, StartFlag)
end;
start_app([], _Type, _StartFlag) ->
ok.
check_app_modules(App, StartFlag) ->
sleep(5000),
case application:get_key(App, modules) of
{ok, Mods} ->
lists:foreach(
@@ -118,12 +112,12 @@ check_app_modules(App, StartFlag) ->
non_existing ->
File = get_module_file(App, Mod),
Reason = io_lib:format(
"couldn't find module ~s "
"needed for application '~p'",
[File, App]),
"Couldn't find file ~ts needed "
"for Erlang application '~ts'. ~ts",
[File, App, hint()]),
exit_or_halt(Reason, StartFlag);
_ ->
sleep(10)
ok
end
end, Mods);
_ ->
@@ -131,6 +125,23 @@ check_app_modules(App, StartFlag) ->
ok
end.
check_apps() ->
spawn(
fun() ->
Apps = [ejabberd |
[App || {App, _, _} <- application:which_applications(),
App /= ejabberd]],
?DEBUG("Checking consistency of applications: ~ts",
[misc:join_atoms(Apps, <<", ">>)]),
misc:peach(
fun(App) ->
check_app_modules(App, true)
end, Apps),
?DEBUG("All applications are intact", []),
lists:foreach(fun erlang:garbage_collect/1, processes())
end).
-spec exit_or_halt(iodata(), boolean()) -> no_return().
exit_or_halt(Reason, StartFlag) ->
?CRITICAL_MSG(Reason, []),
if StartFlag ->
@@ -140,9 +151,6 @@ exit_or_halt(Reason, StartFlag) ->
erlang:error(application_start_failed)
end.
sleep(N) ->
timer:sleep(p1_rand:uniform(N)).
get_module_file(App, Mod) ->
BaseName = atom_to_list(Mod),
case code:lib_dir(App, ebin) of
@@ -177,3 +185,12 @@ erlang_name(Atom) when is_atom(Atom) ->
misc:atom_to_binary(Atom);
erlang_name(Bin) when is_binary(Bin) ->
Bin.
format_error({Reason, File}) when is_list(Reason), is_list(File) ->
Reason ++ ": " ++ File;
format_error(Term) ->
io_lib:format("~p", [Term]).
hint() ->
"This usually means that ejabberd or Erlang "
"was compiled/installed incorrectly.".
+171 -346
View File
@@ -29,17 +29,13 @@
-include("logger.hrl").
-behaviour(gen_server).
-behaviour(ejabberd_config).
%% API
-export([start_link/0,
parse_api_permissions/1,
can_access/2,
invalidate/0,
opt_type/1,
show_current_definitions/0,
register_permission_addon/2,
unregister_permission_addon/1]).
validator/0,
show_current_definitions/0]).
%% gen_server callbacks
-export([init/1,
@@ -51,16 +47,29 @@
-define(SERVER, ?MODULE).
-record(state, {
definitions = none,
fragments_generators = []
}).
-record(state,
{definitions = none :: none | [definition()]}).
-type state() :: #state{}.
-type rule() :: {access, acl:access()} |
{acl, all | none | acl:acl_rule()}.
-type what() :: all | none | [atom() | {tag, atom()}].
-type who() :: rule() | {oauth, {[binary()], [rule()]}}.
-type from() :: atom().
-type permission() :: {binary(), {[from()], [who()], {what(), what()}}}.
-type definition() :: {binary(), {[from()], [who()], [atom()] | all}}.
-type caller_info() :: #{caller_module => module(),
caller_host => global | binary(),
tag => binary() | none,
extra_permissions => [definition()],
atom() => term()}.
-export_type([permission/0]).
%%%===================================================================
%%% API
%%%===================================================================
-spec can_access(atom(), map()) -> allow | deny.
-spec can_access(atom(), caller_info()) -> allow | deny.
can_access(Cmd, CallerInfo) ->
gen_server:call(?MODULE, {can_access, Cmd, CallerInfo}).
@@ -68,65 +77,24 @@ can_access(Cmd, CallerInfo) ->
invalidate() ->
gen_server:cast(?MODULE, invalidate).
-spec register_permission_addon(atom(), fun()) -> ok.
register_permission_addon(Name, Fun) ->
gen_server:call(?MODULE, {register_config_fragment_generator, Name, Fun}).
-spec unregister_permission_addon(atom()) -> ok.
unregister_permission_addon(Name) ->
gen_server:call(?MODULE, {unregister_config_fragment_generator, Name}).
-spec show_current_definitions() -> any().
-spec show_current_definitions() -> [definition()].
show_current_definitions() ->
gen_server:call(?MODULE, show_current_definitions).
%%--------------------------------------------------------------------
%% @doc
%% Starts the server
%%
%% @end
%%--------------------------------------------------------------------
-spec start_link() -> {ok, Pid :: pid()} | ignore | {error, Reason :: term()}.
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
%%--------------------------------------------------------------------
%% @private
%% @doc
%% Initializes the server
%%
%% @spec init(Args) -> {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% @end
%%--------------------------------------------------------------------
-spec init(Args :: term()) ->
{ok, State :: #state{}} | {ok, State :: #state{}, timeout() | hibernate} |
{stop, Reason :: term()} | ignore.
-spec init([]) -> {ok, state()}.
init([]) ->
ejabberd_hooks:add(config_reloaded, ?MODULE, invalidate, 90),
{ok, #state{}}.
%%--------------------------------------------------------------------
%% @private
%% @doc
%% Handling call messages
%%
%% @end
%%--------------------------------------------------------------------
-spec handle_call(Request :: term(), From :: {pid(), Tag :: term()},
State :: #state{}) ->
{reply, Reply :: term(), NewState :: #state{}} |
{reply, Reply :: term(), NewState :: #state{}, timeout() | hibernate} |
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
{stop, Reason :: term(), NewState :: #state{}}.
-spec handle_call({can_access, atom(), caller_info()} |
show_current_definitions | term(),
term(), state()) -> {reply, term(), state()}.
handle_call({can_access, Cmd, CallerInfo}, _From, State) ->
CallerModule = maps:get(caller_module, CallerInfo, none),
Host = maps:get(caller_host, CallerInfo, global),
@@ -134,123 +102,64 @@ handle_call({can_access, Cmd, CallerInfo}, _From, State) ->
{State2, Defs0} = get_definitions(State),
Defs = maps:get(extra_permissions, CallerInfo, []) ++ Defs0,
Res = lists:foldl(
fun({Name, _} = Def, none) ->
case matches_definition(Def, Cmd, CallerModule, Tag, Host, CallerInfo) of
true ->
?DEBUG("Command '~p' execution allowed by rule '~s' (CallerInfo=~p)", [Cmd, Name, CallerInfo]),
allow;
_ ->
none
end;
(_, Val) ->
Val
end, none, Defs),
fun({Name, _} = Def, none) ->
case matches_definition(Def, Cmd, CallerModule, Tag, Host, CallerInfo) of
true ->
?DEBUG("Command '~p' execution allowed by rule "
"'~ts' (CallerInfo=~p)", [Cmd, Name, CallerInfo]),
allow;
_ ->
none
end;
(_, Val) ->
Val
end, none, Defs),
Res2 = case Res of
allow -> allow;
_ ->
?DEBUG("Command '~p' execution denied (CallerInfo=~p)", [Cmd, CallerInfo]),
?DEBUG("Command '~p' execution denied "
"(CallerInfo=~p)", [Cmd, CallerInfo]),
deny
end,
{reply, Res2, State2};
handle_call(show_current_definitions, _From, State) ->
{State2, Defs} = get_definitions(State),
{reply, Defs, State2};
handle_call({register_config_fragment_generator, Name, Fun}, _From, #state{fragments_generators = Gens} = State) ->
NGens = lists:keystore(Name, 1, Gens, {Name, Fun}),
{reply, ok, State#state{fragments_generators = NGens}};
handle_call({unregister_config_fragment_generator, Name}, _From, #state{fragments_generators = Gens} = State) ->
NGens = lists:keydelete(Name, 1, Gens),
{reply, ok, State#state{fragments_generators = NGens}};
handle_call(_Request, _From, State) ->
{reply, ok, State}.
handle_call(Request, From, State) ->
?WARNING_MSG("Unexpected call from ~p: ~p", [From, Request]),
{noreply, State}.
%%--------------------------------------------------------------------
%% @private
%% @doc
%% Handling cast messages
%%
%% @end
%%--------------------------------------------------------------------
-spec handle_cast(Request :: term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}.
-spec handle_cast(invalidate | term(), state()) -> {noreply, state()}.
handle_cast(invalidate, State) ->
{noreply, State#state{definitions = none}};
handle_cast(_Request, State) ->
handle_cast(Msg, State) ->
?WARNING_MSG("Unexpected cast: ~p", [Msg]),
{noreply, State}.
%%--------------------------------------------------------------------
%% @private
%% @doc
%% Handling all non call/cast messages
%%
%% @spec handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% @end
%%--------------------------------------------------------------------
-spec handle_info(Info :: timeout() | term(), State :: #state{}) ->
{noreply, NewState :: #state{}} |
{noreply, NewState :: #state{}, timeout() | hibernate} |
{stop, Reason :: term(), NewState :: #state{}}.
handle_info(_Info, State) ->
handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]),
{noreply, State}.
%%--------------------------------------------------------------------
%% @private
%% @doc
%% 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.
%%
%% @spec terminate(Reason, State) -> void()
%% @end
%%--------------------------------------------------------------------
-spec terminate(Reason :: (normal | shutdown | {shutdown, term()} | term()),
State :: #state{}) -> term().
terminate(_Reason, _State) ->
ejabberd_hooks:delete(config_reloaded, ?MODULE, invalidate, 90).
%%--------------------------------------------------------------------
%% @private
%% @doc
%% Convert process state when code is changed
%%
%% @spec code_change(OldVsn, State, Extra) -> {ok, NewState}
%% @end
%%--------------------------------------------------------------------
-spec code_change(OldVsn :: term() | {down, term()}, State :: #state{},
Extra :: term()) ->
{ok, NewState :: #state{}} | {error, Reason :: term()}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
-spec get_definitions(#state{}) -> {#state{}, any()}.
-spec get_definitions(state()) -> {state(), [definition()]}.
get_definitions(#state{definitions = Defs} = State) when Defs /= none ->
{State, Defs};
get_definitions(#state{definitions = none, fragments_generators = Gens} = State) ->
DefaultOptions = [{<<"admin access">>,
{[],
[{acl,{acl,admin}},
{oauth,[<<"ejabberd:admin">>],[{acl,{acl,admin}}]}],
{all, [start, stop]}}}],
ApiPerms = ejabberd_config:get_option(api_permissions, DefaultOptions),
get_definitions(#state{definitions = none} = State) ->
ApiPerms = ejabberd_option:api_permissions(),
AllCommands = ejabberd_commands:get_commands_definition(),
Frags = lists:foldl(
fun({_Name, Generator}, Acc) ->
Acc ++ Generator()
end, [], Gens),
NDefs0 = lists:map(
fun({Name, {From, Who, {Add, Del}}}) ->
Cmds = filter_commands_with_permissions(AllCommands, Add, Del),
{Name, {From, Who, Cmds}}
end, ApiPerms ++ Frags),
end, ApiPerms),
NDefs = case lists:keyfind(<<"console commands">>, 1, NDefs0) of
false ->
[{<<"console commands">>,
@@ -262,6 +171,8 @@ get_definitions(#state{definitions = none, fragments_generators = Gens} = State)
end,
{State#state{definitions = NDefs}, NDefs}.
-spec matches_definition(definition(), atom(), module(),
atom(), global | binary(), caller_info()) -> boolean().
matches_definition({_Name, {From, Who, What}}, Cmd, Module, Tag, Host, CallerInfo) ->
case What == all orelse lists:member(Cmd, What) of
true ->
@@ -271,25 +182,29 @@ matches_definition({_Name, {From, Who, What}}, Cmd, Module, Tag, Host, CallerInf
true ->
Scope = maps:get(oauth_scope, CallerInfo, none),
lists:any(
fun({access, Access}) when Scope == none ->
acl:access_matches(Access, CallerInfo, Host) == allow;
({acl, Acl}) when Scope == none ->
acl:acl_rule_matches(Acl, CallerInfo, Host);
({oauth, Scopes, List}) when Scope /= none ->
case ejabberd_oauth:scope_in_scope_list(Scope, Scopes) of
true ->
lists:any(
fun({access, Access}) ->
acl:access_matches(Access, CallerInfo, Host) == allow;
({acl, Acl}) ->
acl:acl_rule_matches(Acl, CallerInfo, Host)
end, List);
_ ->
false
end;
(_) ->
false
end, Who);
fun({access, Access}) when Scope == none ->
acl:match_rule(Host, Access, CallerInfo) == allow;
({acl, Name} = Acl) when Scope == none, is_atom(Name) ->
acl:match_acl(Host, Acl, CallerInfo);
({acl, Acl}) when Scope == none ->
acl:match_acl(Host, Acl, CallerInfo);
({oauth, {Scopes, List}}) when Scope /= none ->
case ejabberd_oauth:scope_in_scope_list(Scope, Scopes) of
true ->
lists:any(
fun({access, Access}) ->
acl:match_rule(Host, Access, CallerInfo) == allow;
({acl, Name} = Acl) when is_atom(Name) ->
acl:match_acl(Host, Acl, CallerInfo);
({acl, Acl}) ->
acl:match_acl(Host, Acl, CallerInfo)
end, List);
_ ->
false
end;
(_) ->
false
end, Who);
_ ->
false
end;
@@ -297,12 +212,15 @@ matches_definition({_Name, {From, Who, What}}, Cmd, Module, Tag, Host, CallerInf
false
end.
-spec filter_commands_with_permissions([#ejabberd_commands{}], what(), what()) -> [atom()].
filter_commands_with_permissions(AllCommands, Add, Del) ->
CommandsAdd = filter_commands_with_patterns(AllCommands, Add, []),
CommandsDel = filter_commands_with_patterns(CommandsAdd, Del, []),
lists:map(fun(#ejabberd_commands{name = N}) -> N end,
CommandsAdd -- CommandsDel).
-spec filter_commands_with_patterns([#ejabberd_commands{}], what(),
[#ejabberd_commands{}]) -> [#ejabberd_commands{}].
filter_commands_with_patterns([], _Patterns, Acc) ->
Acc;
filter_commands_with_patterns([C | CRest], Patterns, Acc) ->
@@ -313,6 +231,7 @@ filter_commands_with_patterns([C | CRest], Patterns, Acc) ->
filter_commands_with_patterns(CRest, Patterns, Acc)
end.
-spec command_matches_patterns(#ejabberd_commands{}, what()) -> boolean().
command_matches_patterns(_, all) ->
true;
command_matches_patterns(_, none) ->
@@ -332,125 +251,26 @@ command_matches_patterns(C, [_ | Tail]) ->
command_matches_patterns(C, Tail).
%%%===================================================================
%%% Options parsing code
%%% Validators
%%%===================================================================
parse_api_permissions(Data) when is_list(Data) ->
[parse_api_permission(Name, Args) || {Name, Args} <- Data].
parse_api_permission(Name, Args0) ->
Args = lists:flatten(Args0),
{From, Who, What} = case key_split(Args, [{from, []}, {who, none}, {what, []}]) of
{error, Msg} ->
report_error(<<"~s inside api_permission '~s' section">>, [Msg, Name]);
Val -> Val
end,
{Name, {parse_from(Name, From), parse_who(Name, Who, oauth), parse_what(Name, What)}}.
parse_from(_Name, Module) when is_atom(Module) ->
[Module];
parse_from(Name, Modules) when is_list(Modules) ->
lists:map(
fun(Module) when is_atom(Module) ->
Module;
([{tag, Tag}]) when is_binary(Tag) ->
{tag, Tag};
(Val) ->
report_error(<<"Invalid value '~p' used inside 'from' section for api_permission '~s'">>,
[Val, Name])
end, Modules);
parse_from(Name, Val) ->
report_error(<<"Invalid value '~p' used inside 'from' section for api_permission '~s'">>,
[Val, Name]).
parse_who(Name, Atom, ParseOauth) when is_atom(Atom) ->
parse_who(Name, [Atom], ParseOauth);
parse_who(Name, Defs, ParseOauth) when is_list(Defs) ->
lists:map(
fun([Val]) ->
[NVal] = parse_who(Name, [Val], ParseOauth),
NVal;
({access, Val}) ->
try acl:access_rules_validator(Val) of
Rule ->
{access, Rule}
catch
throw:{invalid_syntax, Msg} ->
report_error(<<"Invalid access rule: '~s' used inside 'who' section for api_permission '~s'">>,
[Msg, Name]);
error:_ ->
report_error(<<"Invalid access rule '~p' used inside 'who' section for api_permission '~s'">>,
[Val, Name])
end;
({oauth, OauthList}) when is_list(OauthList) ->
case ParseOauth of
oauth ->
Nested = parse_who(Name, lists:flatten(OauthList), scope),
{Scopes, Rest} = lists:partition(
fun({scope, _}) -> true;
(_) -> false
end, Nested),
case Scopes of
[] ->
report_error(<<"Oauth rule must contain at least one scope rule in 'who' section for api_permission '~s'">>,
[Name]);
_ ->
{oauth, lists:foldl(fun({scope, S}, A) -> S ++ A end, [], Scopes), Rest}
end;
scope ->
report_error(<<"Oauth rule can't be embedded inside other oauth rule in 'who' section for api_permission '~s'">>,
[Name])
end;
({scope, ScopeList}) ->
case ParseOauth of
oauth ->
report_error(<<"Scope can be included only inside oauth rule in 'who' section for api_permission '~s'">>,
[Name]);
scope ->
ScopeList2 = case ScopeList of
V when is_binary(V) -> [V];
V2 when is_list(V2) -> V2;
V3 ->
report_error(<<"Invalid value for scope '~p' in 'who' section for api_permission '~s'">>,
[V3, Name])
end,
{scope, ScopeList2}
end;
(Atom) when is_atom(Atom) ->
{acl, {acl, Atom}};
(Other) ->
try acl:normalize_spec(Other) of
Rule2 ->
{acl, Rule2}
catch
_:_ ->
report_error(<<"Invalid value '~p' used inside 'who' section for api_permission '~s'">>,
[Other, Name])
end
end, Defs);
parse_who(Name, Val, _ParseOauth) ->
report_error(<<"Invalid value '~p' used inside 'who' section for api_permission '~s'">>,
[Val, Name]).
parse_what(Name, Binary) when is_binary(Binary) ->
parse_what(Name, [Binary]);
parse_what(Name, Defs) when is_list(Defs) ->
{A, D} = lists:foldl(
fun(Def, {Add, Del}) ->
case parse_single_what(Def) of
{error, Err} ->
report_error(<<"~s used in value '~p' in 'what' section for api_permission '~s'">>,
[Err, Def, Name]);
all ->
{case Add of none -> none; _ -> all end, Del};
{neg, all} ->
{none, all};
{neg, Value} ->
{Add, case Del of L when is_list(L) -> [Value | L]; L2 -> L2 end};
Value ->
{case Add of L when is_list(L) -> [Value | L]; L2 -> L2 end, Del}
end
end, {[], []}, Defs),
-spec parse_what([binary()]) -> {what(), what()}.
parse_what(Defs) ->
{A, D} =
lists:foldl(
fun(Def, {Add, Del}) ->
case parse_single_what(Def) of
{error, Err} ->
econf:fail({invalid_syntax, [Err, ": ", Def]});
all ->
{case Add of none -> none; _ -> all end, Del};
{neg, all} ->
{none, all};
{neg, Value} ->
{Add, case Del of L when is_list(L) -> [Value | L]; L2 -> L2 end};
Value ->
{case Add of L when is_list(L) -> [Value | L]; L2 -> L2 end, Del}
end
end, {[], []}, Defs),
case {A, D} of
{[], _} ->
{none, all};
@@ -458,11 +278,9 @@ parse_what(Name, Defs) when is_list(Defs) ->
{A2, none};
V ->
V
end;
parse_what(Name, Val) ->
report_error(<<"Invalid value '~p' used inside 'what' section for api_permission '~s'">>,
[Val, Name]).
end.
-spec parse_single_what(binary()) -> atom() | {neg, atom()} | {tag, atom()} | {error, string()}.
parse_single_what(<<"*">>) ->
all;
parse_single_what(<<"!*">>) ->
@@ -470,7 +288,7 @@ parse_single_what(<<"!*">>) ->
parse_single_what(<<"!", Rest/binary>>) ->
case parse_single_what(Rest) of
{neg, _} ->
{error, <<"Double negation">>};
{error, "double negation"};
{error, _} = Err ->
Err;
V ->
@@ -485,71 +303,78 @@ parse_single_what(<<"[tag:", Rest/binary>>) ->
V when is_atom(V) ->
{tag, V};
_ ->
{error, <<"Invalid tag">>}
{error, "invalid tag"}
end;
_ ->
{error, <<"Invalid tag">>}
{error, "invalid tag"}
end;
parse_single_what(Binary) when is_binary(Binary) ->
case is_valid_command_name(Binary) of
true ->
binary_to_atom(Binary, latin1);
_ ->
{error, <<"Invalid value">>}
end;
parse_single_what(Atom) when is_atom(Atom) ->
parse_single_what(atom_to_binary(Atom, latin1));
parse_single_what(_) ->
{error, <<"Invalid value">>}.
is_valid_command_name(<<>>) ->
false;
is_valid_command_name(Val) ->
is_valid_command_name2(Val).
is_valid_command_name2(<<>>) ->
true;
is_valid_command_name2(<<K:8, Rest/binary>>) when (K >= $a andalso K =< $z)
orelse (K >= $0 andalso K =< $9)
orelse K == $_ orelse K == $- ->
is_valid_command_name2(Rest);
is_valid_command_name2(_) ->
false.
key_split(Args, Fields) ->
{_, Order1, Results1, Required1} = lists:foldl(
fun({Field, Default}, {Idx, Order, Results, Required}) ->
{Idx + 1, maps:put(Field, Idx, Order), [Default | Results], Required};
(Field, {Idx, Order, Results, Required}) ->
{Idx + 1, maps:put(Field, Idx, Order), [none | Results], maps:put(Field, 1, Required)}
end, {1, #{}, [], #{}}, Fields),
key_split(Args, list_to_tuple(Results1), Order1, Required1, #{}).
key_split([], _Results, _Order, Required, _Duplicates) when map_size(Required) > 0 ->
parse_error(<<"Missing fields '~s">>, [str:join(maps:keys(Required), <<", ">>)]);
key_split([], Results, _Order, _Required, _Duplicates) ->
Results;
key_split([{Arg, Value} | Rest], Results, Order, Required, Duplicates) ->
case maps:find(Arg, Order) of
{ok, Idx} ->
case maps:is_key(Arg, Duplicates) of
false ->
Results2 = setelement(Idx, Results, Value),
key_split(Rest, Results2, Order, maps:remove(Arg, Required), maps:put(Arg, 1, Duplicates));
true ->
parse_error(<<"Duplicate field '~s'">>, [Arg])
end;
_ ->
parse_error(<<"Unknown field '~s'">>, [Arg])
parse_single_what(B) ->
case re:run(B, "^[a-z0-9_\\-]*$") of
nomatch -> {error, "invalid command"};
_ -> binary_to_atom(B, latin1)
end.
report_error(Format, Args) ->
throw({invalid_syntax, (str:format(Format, Args))}).
validator(Map, Opts) ->
econf:and_then(
fun(L) when is_list(L) ->
lists:map(
fun({K, V}) -> {(econf:atom())(K), V};
(A) -> {acl, (econf:atom())(A)}
end, lists:flatten(L));
(A) ->
[{acl, (econf:atom())(A)}]
end,
econf:and_then(
econf:options(maps:merge(acl:validators(), Map), Opts),
fun(Rules) ->
lists:flatmap(
fun({Type, Rs}) when is_list(Rs) ->
case maps:is_key(Type, acl:validators()) of
true -> [{acl, {Type, R}} || R <- Rs];
false -> [{Type, Rs}]
end;
(Other) ->
[Other]
end, Rules)
end)).
parse_error(Format, Args) ->
{error, (str:format(Format, Args))}.
validator(from) ->
fun(L) when is_list(L) ->
lists:map(
fun({K, V}) -> {(econf:enum([tag]))(K), (econf:binary())(V)};
(A) -> (econf:enum([ejabberd_xmlrpc, mod_http_api, ejabberd_ctl]))(A)
end, lists:flatten(L));
(A) ->
[(econf:enum([ejabberd_xmlrpc, mod_http_api, ejabberd_ctl]))(A)]
end;
validator(what) ->
econf:and_then(
econf:list_or_single(econf:non_empty(econf:binary())),
fun parse_what/1);
validator(who) ->
validator(#{access => econf:acl(), oauth => validator(oauth)}, []);
validator(oauth) ->
econf:and_then(
validator(#{access => econf:acl(),
scope => econf:non_empty(
econf:list_or_single(econf:binary()))},
[{required, [scope]}]),
fun(Os) ->
{[Scopes], Rest} = proplists:split(Os, [scope]),
{lists:flatten([S || {_, S} <- Scopes]), Rest}
end).
opt_type(api_permissions) ->
fun parse_api_permissions/1;
opt_type(_) ->
[api_permissions].
validator() ->
econf:map(
econf:binary(),
econf:and_then(
econf:options(
#{from => validator(from),
what => validator(what),
who => validator(who)}),
fun(Os) ->
{proplists:get_value(from, Os, []),
proplists:get_value(who, Os, none),
proplists:get_value(what, Os, [])}
end),
[unique]).
+607 -1179
View File
File diff suppressed because it is too large Load Diff
-407
View File
@@ -1,407 +0,0 @@
-module(ejabberd_acme_comm).
-export([%% Directory
directory/1,
%% Account
new_account/4,
update_account/4,
get_account/3,
delete_account/3,
%% Authorization
new_authz/4,
get_authz/1,
complete_challenge/4,
%% Authorization polling
get_authz_until_valid/1,
%% Certificate
new_cert/4,
get_cert/1,
revoke_cert/4,
get_issuer_cert/1
%% Not yet implemented
%% key_roll_over/5
%% delete_authz/3
]).
-include("logger.hrl").
-include("xmpp.hrl").
-include("ejabberd_acme.hrl").
-include_lib("public_key/include/public_key.hrl").
-define(REQUEST_TIMEOUT, 5000). % 5 seconds.
-define(MAX_POLL_REQUESTS, 20).
-define(POLL_WAIT_TIME, 500). % 500 ms.
%%%
%%% This module contains functions that implement all necessary http
%%% requests to the ACME Certificate Authority. Its purpose is to
%%% facilitate the acme client implementation by separating the
%%% handling/validating/parsing of all the needed http requests.
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Directory
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec directory(url()) -> {ok, dirs(), nonce()} | {error, _}.
directory(CAUrl) ->
Url = CAUrl ++ "/directory",
prepare_get_request(Url, fun get_dirs/1).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Account Handling
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec new_account(dirs(), jose_jwk:key(), proplist(), nonce()) ->
{ok, {url(), proplist()}, nonce()} | {error, _}.
new_account(Dirs, PrivateKey, Req, Nonce) ->
#{"new-reg" := Url} = Dirs,
EJson = {[{ <<"resource">>, <<"new-reg">>}] ++ Req},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response_tos/1).
-spec update_account({url(), string()}, jose_jwk:key(), proplist(), nonce()) ->
{ok, proplist(), nonce()} | {error, _}.
update_account({CAUrl, AccId}, PrivateKey, Req, Nonce) ->
Url = CAUrl ++ "/acme/reg/" ++ AccId,
EJson = {[{ <<"resource">>, <<"reg">>}] ++ Req},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response/1).
-spec get_account({url(), string()}, jose_jwk:key(), nonce()) ->
{ok, {url(), proplist()}, nonce()} | {error, _}.
get_account({CAUrl, AccId}, PrivateKey, Nonce) ->
Url = CAUrl ++ "/acme/reg/" ++ AccId,
EJson = {[{<<"resource">>, <<"reg">>}]},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response_tos/1).
-spec delete_account({url(), string()}, jose_jwk:key(), nonce()) ->
{ok, proplist(), nonce()} | {error, _}.
delete_account({CAUrl, AccId}, PrivateKey, Nonce) ->
Url = CAUrl ++ "/acme/reg/" ++ AccId,
EJson =
{[{<<"resource">>, <<"reg">>},
{<<"status">>, <<"deactivated">>}]},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response/1).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Authorization Handling
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec new_authz(dirs(), jose_jwk:key(), proplist(), nonce()) ->
{ok, {url(), proplist()}, nonce()} | {error, _}.
new_authz(Dirs, PrivateKey, Req, Nonce) ->
#{"new-authz" := Url} = Dirs,
EJson = {[{<<"resource">>, <<"new-authz">>}] ++ Req},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response_location/1).
-spec get_authz({url(), string()}) -> {ok, proplist(), nonce()} | {error, _}.
get_authz({CAUrl, AuthzId}) ->
Url = CAUrl ++ "/acme/authz/" ++ AuthzId,
prepare_get_request(Url, fun get_response/1).
-spec complete_challenge({url(), string(), string()}, jose_jwk:key(), proplist(), nonce()) ->
{ok, proplist(), nonce()} | {error, _}.
complete_challenge({CAUrl, AuthzId, ChallId}, PrivateKey, Req, Nonce) ->
Url = CAUrl ++ "/acme/challenge/" ++ AuthzId ++ "/" ++ ChallId,
EJson = {[{<<"resource">>, <<"challenge">>}] ++ Req},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response/1).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Certificate Handling
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec new_cert(dirs(), jose_jwk:key(), proplist(), nonce()) ->
{ok, {url(), list()}, nonce()} | {error, _}.
new_cert(Dirs, PrivateKey, Req, Nonce) ->
#{"new-cert" := Url} = Dirs,
EJson = {[{<<"resource">>, <<"new-cert">>}] ++ Req},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response_link_up/1,
"application/pkix-cert").
-spec get_cert({url(), string()}) -> {ok, list(), nonce()} | {error, _}.
get_cert({CAUrl, CertId}) ->
Url = CAUrl ++ "/acme/cert/" ++ CertId,
prepare_get_request(Url, fun get_response/1, "application/pkix-cert").
-spec revoke_cert(dirs(), jose_jwk:key(), proplist(), nonce()) ->
{ok, _, nonce()} | {error, _}.
revoke_cert(Dirs, PrivateKey, Req, Nonce) ->
#{"revoke-cert" := Url} = Dirs,
EJson = {[{<<"resource">>, <<"revoke-cert">>}] ++ Req},
prepare_post_request(Url, PrivateKey, EJson, Nonce, fun get_response/1,
"application/pkix-cert").
-spec get_issuer_cert(url()) -> {ok, list(), nonce()} | {error, _}.
get_issuer_cert(IssuerCertUrl) ->
prepare_get_request(IssuerCertUrl, fun get_response/1, "application/pkix-cert").
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Handle Response Functions
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec get_dirs({ok, proplist(), proplist()}) -> {ok, map(), nonce()}.
get_dirs({ok, Head, Return}) ->
NewNonce = get_nonce(Head),
StrDirectories = [{bitstring_to_list(X), bitstring_to_list(Y)} ||
{X, Y} <- Return, is_bitstring(X) andalso is_bitstring(Y)],
NewDirs = maps:from_list(StrDirectories),
{ok, NewDirs, NewNonce}.
-spec get_response({ok, proplist(), proplist()}) -> {ok, proplist(), nonce()}.
get_response({ok, Head, Return}) ->
NewNonce = get_nonce(Head),
{ok, Return, NewNonce}.
-spec get_response_tos({ok, proplist(), proplist()}) -> {ok, {url(), proplist()}, nonce()}.
get_response_tos({ok, Head, Return}) ->
TOSUrl = get_tos(Head),
NewNonce = get_nonce(Head),
{ok, {TOSUrl, Return}, NewNonce}.
-spec get_response_location({ok, proplist(), proplist()}) -> {ok, {url(), proplist()}, nonce()}.
get_response_location({ok, Head, Return}) ->
Location = get_location(Head),
NewNonce = get_nonce(Head),
{ok, {Location, Return}, NewNonce}.
-spec get_response_link_up({ok, proplist(), proplist()}) -> {ok, {url(), proplist()}, nonce()}.
get_response_link_up({ok, Head, Return}) ->
LinkUp = get_link_up(Head),
NewNonce = get_nonce(Head),
{ok, {LinkUp, Return}, NewNonce}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Authorization Polling
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec get_authz_until_valid({url(), string()}) -> {ok, proplist(), nonce()} | {error, _}.
get_authz_until_valid({CAUrl, AuthzId}) ->
get_authz_until_valid({CAUrl, AuthzId}, ?MAX_POLL_REQUESTS).
-spec get_authz_until_valid({url(), string()}, non_neg_integer()) ->
{ok, proplist(), nonce()} | {error, _}.
get_authz_until_valid({_CAUrl, _AuthzId}, 0) ->
?ERROR_MSG("Maximum request limit waiting for validation reached", []),
{error, max_request_limit};
get_authz_until_valid({CAUrl, AuthzId}, N) ->
case get_authz({CAUrl, AuthzId}) of
{ok, Resp, Nonce} ->
case is_authz_valid(Resp) of
true ->
{ok, Resp, Nonce};
false ->
timer:sleep(?POLL_WAIT_TIME),
get_authz_until_valid({CAUrl, AuthzId}, N-1)
end;
{error, _} = Err ->
Err
end.
-spec is_authz_valid(proplist()) -> boolean().
is_authz_valid(Authz) ->
case proplists:lookup(<<"status">>, Authz) of
{<<"status">>, <<"valid">>} ->
true;
_ ->
false
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Request Functions
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TODO: Fix the duplicated code at the below 4 functions
-spec make_post_request(url(), bitstring(), string()) ->
{ok, proplist(), proplist()} | {error, _}.
make_post_request(Url, ReqBody, ResponseType) ->
Options = [],
HttpOptions = [{timeout, ?REQUEST_TIMEOUT}],
case httpc:request(post,
{Url, [], "application/jose+json", ReqBody}, HttpOptions, Options) of
{ok, {{_, Code, _}, Head, Body}} when Code >= 200, Code =< 299 ->
decode_response(Head, Body, ResponseType);
Error ->
failed_http_request(Error, Url)
end.
-spec make_get_request(url(), string()) ->
{ok, proplist(), proplist()} | {error, _}.
make_get_request(Url, ResponseType) ->
Options = [],
HttpOptions = [{timeout, ?REQUEST_TIMEOUT}],
case httpc:request(get, {Url, []}, HttpOptions, Options) of
{ok, {{_, Code, _}, Head, Body}} when Code >= 200, Code =< 299 ->
decode_response(Head, Body, ResponseType);
Error ->
failed_http_request(Error, Url)
end.
-spec prepare_post_request(url(), jose_jwk:key(), jiffy:json_value(),
nonce(), handle_resp_fun()) -> {ok, _, nonce()} | {error, _}.
prepare_post_request(Url, PrivateKey, EJson, Nonce, HandleRespFun) ->
prepare_post_request(Url, PrivateKey, EJson, Nonce, HandleRespFun, "application/jose+json").
-spec prepare_post_request(url(), jose_jwk:key(), jiffy:json_value(),
nonce(), handle_resp_fun(), string()) -> {ok, _, nonce()} | {error, _}.
prepare_post_request(Url, PrivateKey, EJson, Nonce, HandleRespFun, ResponseType) ->
case encode(EJson) of
{ok, ReqBody} ->
FinalBody = sign_encode_json_jose(PrivateKey, ReqBody, Nonce),
case make_post_request(Url, FinalBody, ResponseType) of
{ok, Head, Return} ->
HandleRespFun({ok, Head, Return});
Error ->
Error
end;
{error, Reason} ->
?ERROR_MSG("Error: ~p when encoding: ~p", [Reason, EJson]),
{error, Reason}
end.
-spec prepare_get_request(url(), handle_resp_fun()) ->
{ok, _, nonce()} | {error, _}.
prepare_get_request(Url, HandleRespFun) ->
prepare_get_request(Url, HandleRespFun, "application/jose+json").
-spec prepare_get_request(url(), handle_resp_fun(), string()) ->
{ok, _, nonce()} | {error, _}.
prepare_get_request(Url, HandleRespFun, ResponseType) ->
case make_get_request(Url, ResponseType) of
{ok, Head, Return} ->
HandleRespFun({ok, Head, Return});
Error ->
Error
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Jose Json Functions
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec sign_json_jose(jose_jwk:key(), bitstring(), nonce()) -> {_, jws()}.
sign_json_jose(Key, Json, Nonce) ->
PubKey = ejabberd_acme:to_public(Key),
{_, BinaryPubKey} = jose_jwk:to_binary(PubKey),
PubKeyJson = jiffy:decode(BinaryPubKey),
%% TODO: Ensure this works for all cases
AlgMap = jose_jwk:signer(Key),
JwsMap =
#{ <<"jwk">> => PubKeyJson,
%% <<"b64">> => true,
<<"nonce">> => list_to_bitstring(Nonce)
},
JwsObj0 = maps:merge(JwsMap, AlgMap),
JwsObj = jose_jws:from(JwsObj0),
jose_jws:sign(Key, Json, JwsObj).
-spec sign_encode_json_jose(jose_jwk:key(), bitstring(), nonce()) -> bitstring().
sign_encode_json_jose(Key, Json, Nonce) ->
{_, Signed} = sign_json_jose(Key, Json, Nonce),
%% This depends on jose library, so we can consider it safe
jiffy:encode(Signed).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Useful funs
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec get_nonce(proplist()) -> nonce() | 'none'.
get_nonce(Head) ->
case proplists:lookup("replay-nonce", Head) of
{"replay-nonce", Nonce} -> Nonce;
none -> none
end.
-spec get_location(proplist()) -> url() | 'none'.
get_location(Head) ->
case proplists:lookup("location", Head) of
{"location", Location} -> Location;
none -> none
end.
-spec get_tos(proplist()) -> url() | 'none'.
get_tos(Head) ->
get_header_link(Head, "\"terms-of-service\"").
-spec get_link_up(proplist()) -> url() | 'none'.
get_link_up(Head) ->
get_header_link(Head, "rel=\"up\"").
%% TODO: Find a more reliable way to extract this
-spec get_header_link(proplist(), string()) -> url() | 'none'.
get_header_link(Head, Suffix) ->
try
[{_, Link}] = [{K, V} || {K, V} <- Head,
K =:= "link" andalso
lists:suffix(Suffix, V)],
[Link1, _] = string:tokens(Link, ";"),
Link2 = string:strip(Link1, left, $<),
string:strip(Link2, right, $>)
catch
_:_ ->
none
end.
decode_response(Head, Body, "application/pkix-cert") ->
{ok, Head, Body};
decode_response(Head, Body, "application/jose+json") ->
case decode(Body) of
{ok, Return} ->
{ok, Head, Return};
{error, Reason} ->
?ERROR_MSG("Problem decoding: ~s", [Body]),
{error, Reason}
end.
encode(EJson) ->
try
{ok, jiffy:encode(EJson)}
catch
_:Reason ->
{error, Reason}
end.
decode(Json) ->
try
{Result} = jiffy:decode(Json),
{ok, Result}
catch
_:Reason ->
{error, Reason}
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Handle Failed HTTP Requests
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec failed_http_request({ok, _} | {error, _}, url()) -> {error, _}.
failed_http_request({ok, {{_, Code, Reason}, _Head, Body}}, Url) ->
?ERROR_MSG("Got unexpected status code from <~s>: ~B, Body: ~s",
[Url, Code, Body]),
throw({error, {unexpected_code, Code, Reason}});
failed_http_request({error, Reason}, Url) ->
?ERROR_MSG("Error making a request to <~s>: ~p",
[Url, Reason]),
throw({error, Reason}).
+92 -43
View File
@@ -35,6 +35,8 @@
stop_kindly/2, send_service_message_all_mucs/2,
registered_vhosts/0,
reload_config/0,
dump_config/1,
convert_to_yaml/2,
%% Cluster
join_cluster/1, leave_cluster/1, list_cluster/0,
%% Erlang
@@ -75,14 +77,16 @@ init([]) ->
ejabberd_commands:register_commands(get_commands_spec()),
{ok, #state{}}.
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
handle_call(Request, From, State) ->
?WARNING_MSG("Unexpected call from ~p: ~p", [From, Request]),
{noreply, State}.
handle_info(_Info, State) ->
handle_cast(Msg, State) ->
?WARNING_MSG("Unexpected cast: ~p", [Msg]),
{noreply, State}.
handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]),
{noreply, State}.
terminate(_Reason, _State) ->
@@ -152,7 +156,7 @@ get_commands_spec() ->
result_desc = "The type of logger module used",
result_example = lager,
args = [{loglevel, integer}],
result = {logger, atom}},
result = {res, rescode}},
#ejabberd_commands{name = update_list, tags = [server],
desc = "List modified modules that can be updated",
@@ -274,7 +278,7 @@ get_commands_spec() ->
args_example = ["example.com"],
args = [{host, binary}], result = {res, rescode}},
#ejabberd_commands{name = import_prosody, tags = [mnesia, sql, riak],
#ejabberd_commands{name = import_prosody, tags = [mnesia, sql],
desc = "Import data from Prosody",
longdesc = "Note: this method requires ejabberd compiled with optional tools support "
"and package must provide optional luerl dependency.",
@@ -285,11 +289,18 @@ get_commands_spec() ->
#ejabberd_commands{name = convert_to_yaml, tags = [config],
desc = "Convert the input file from Erlang to YAML format",
module = ejabberd_config, function = convert_to_yaml,
module = ?MODULE, function = convert_to_yaml,
args_desc = ["Full path to the original configuration file", "And full path to final file"],
args_example = ["/etc/ejabberd/ejabberd.cfg", "/etc/ejabberd/ejabberd.yml"],
args = [{in, string}, {out, string}],
result = {res, rescode}},
#ejabberd_commands{name = dump_config, tags = [config],
desc = "Dump configuration in YAML format as seen by ejabberd",
module = ?MODULE, function = dump_config,
args_desc = ["Full path to output file"],
args_example = ["/tmp/ejabberd.yml"],
args = [{out, string}],
result = {res, rescode}},
#ejabberd_commands{name = delete_expired_messages, tags = [purge],
desc = "Delete expired offline messages from database",
@@ -394,7 +405,7 @@ status() ->
false ->
{ejabberd_not_running, "ejabberd is not running in that node."};
{value, {_, _, Version}} ->
{ok, io_lib:format("ejabberd ~s is running in that node", [Version])}
{ok, io_lib:format("ejabberd ~ts is running in that node", [Version])}
end,
{Is_running, String1 ++ String2}.
@@ -407,9 +418,7 @@ rotate_log() ->
ejabberd_logger:rotate_log().
set_loglevel(LogLevel) ->
{module, Module} = ejabberd_logger:set(LogLevel),
Module.
ejabberd_logger:set(LogLevel).
%%%
%%% Stop Kindly
@@ -440,7 +449,7 @@ stop_kindly(DelaySeconds, AnnouncementTextString) ->
SecondsDiff =
calendar:datetime_to_gregorian_seconds({date(), time()})
- TimestampStart,
io:format("[~p/~p ~ps] ~s... ",
io:format("[~p/~p ~ps] ~ts... ",
[NumberThis, NumberLast, SecondsDiff, Desc]),
Result = (catch apply(Mod, Func, Args)),
io:format("~p~n", [Result]),
@@ -451,14 +460,16 @@ stop_kindly(DelaySeconds, AnnouncementTextString) ->
ok.
send_service_message_all_mucs(Subject, AnnouncementText) ->
Message = str:format("~s~n~s", [Subject, AnnouncementText]),
Message = str:format("~ts~n~ts", [Subject, AnnouncementText]),
lists:foreach(
fun(ServerHost) ->
MUCHost = gen_mod:get_module_opt_host(
ServerHost, mod_muc, <<"conference.@HOST@">>),
mod_muc:broadcast_service_message(ServerHost, MUCHost, Message)
MUCHosts = gen_mod:get_module_opt_hosts(ServerHost, mod_muc),
lists:foreach(
fun(MUCHost) ->
mod_muc:broadcast_service_message(ServerHost, MUCHost, Message)
end, MUCHosts)
end,
ejabberd_config:get_myhosts()).
ejabberd_option:hosts()).
%%%
%%% ejabberd_update
@@ -489,33 +500,69 @@ update_module(ModuleNameString) ->
%%%
register(User, Host, Password) ->
case ejabberd_auth:try_register(User, Host, Password) of
ok ->
{ok, io_lib:format("User ~s@~s successfully registered", [User, Host])};
{error, exists} ->
Msg = io_lib:format("User ~s@~s already registered", [User, Host]),
{error, conflict, 10090, Msg};
{error, Reason} ->
String = io_lib:format("Can't register user ~s@~s at node ~p: ~s",
[User, Host, node(),
mod_register:format_error(Reason)]),
{error, cannot_register, 10001, String}
case is_my_host(Host) of
true ->
case ejabberd_auth:try_register(User, Host, Password) of
ok ->
{ok, io_lib:format("User ~ts@~ts successfully registered", [User, Host])};
{error, exists} ->
Msg = io_lib:format("User ~ts@~ts already registered", [User, Host]),
{error, conflict, 10090, Msg};
{error, Reason} ->
String = io_lib:format("Can't register user ~ts@~ts at node ~p: ~ts",
[User, Host, node(),
mod_register:format_error(Reason)]),
{error, cannot_register, 10001, String}
end;
false ->
{error, cannot_register, 10001, "Unknown virtual host"}
end.
unregister(User, Host) ->
ejabberd_auth:remove_user(User, Host),
{ok, ""}.
case is_my_host(Host) of
true ->
ejabberd_auth:remove_user(User, Host),
{ok, ""};
false ->
{error, "Unknown virtual host"}
end.
registered_users(Host) ->
Users = ejabberd_auth:get_users(Host),
SUsers = lists:sort(Users),
lists:map(fun({U, _S}) -> U end, SUsers).
case is_my_host(Host) of
true ->
Users = ejabberd_auth:get_users(Host),
SUsers = lists:sort(Users),
lists:map(fun({U, _S}) -> U end, SUsers);
false ->
{error, "Unknown virtual host"}
end.
registered_vhosts() ->
ejabberd_config:get_myhosts().
ejabberd_option:hosts().
reload_config() ->
ejabberd_config:reload_file().
case ejabberd_config:reload() of
ok -> {ok, ""};
Err ->
Reason = ejabberd_config:format_error(Err),
{invalid_config, Reason}
end.
dump_config(Path) ->
case ejabberd_config:dump(Path) of
ok -> {ok, ""};
Err ->
Reason = ejabberd_config:format_error(Err),
{invalid_file, Reason}
end.
convert_to_yaml(In, Out) ->
case ejabberd_config:convert_to_yaml(In, Out) of
ok -> {ok, ""};
Err ->
Reason = ejabberd_config:format_error(Err),
{invalid_config, Reason}
end.
%%%
%%% Cluster management
@@ -562,13 +609,13 @@ delete_expired_messages() ->
lists:foreach(
fun(Host) ->
{atomic, ok} = mod_offline:remove_expired_messages(Host)
end, ejabberd_config:get_myhosts()).
end, ejabberd_option:hosts()).
delete_old_messages(Days) ->
lists:foreach(
fun(Host) ->
{atomic, _} = mod_offline:remove_old_messages(Days, Host)
end, ejabberd_config:get_myhosts()).
end, ejabberd_option:hosts()).
%%%
%%% Mnesia management
@@ -602,10 +649,6 @@ restore_mnesia(Path) ->
case ejabberd_admin:restore(Path) of
{atomic, _} ->
{ok, ""};
{error, Reason} ->
String = io_lib:format("Can't restore backup from ~p at node ~p: ~p",
[filename:absname(Path), node(), Reason]),
{cannot_restore, String};
{aborted,{no_exists,Table}} ->
String = io_lib:format("Can't restore backup from ~p at node ~p: Table ~p does not exist.",
[filename:absname(Path), node(), Table]),
@@ -786,3 +829,9 @@ mnesia_change_nodename(FromString, ToString, Source, Target) ->
clear_cache() ->
Nodes = ejabberd_cluster:get_nodes(),
lists:foreach(fun(T) -> ets_cache:clear(T, Nodes) end, ets_cache:all()).
-spec is_my_host(binary()) -> boolean().
is_my_host(Host) ->
try ejabberd_router:is_my_host(Host)
catch _:{invalid_domain, _} -> false
end.
+70 -57
View File
@@ -32,42 +32,48 @@
-export([start/2, prep_stop/1, stop/1]).
-include("logger.hrl").
-include("ejabberd_stacktrace.hrl").
%%%
%%% Application API
%%%
start(normal, _Args) ->
{T1, _} = statistics(wall_clock),
ejabberd_logger:start(),
write_pid_file(),
start_included_apps(),
start_elixir_application(),
ejabberd:check_app(ejabberd),
setup_if_elixir_conf_used(),
case ejabberd_config:start() of
ok ->
ejabberd_mnesia:start(),
file_queue_init(),
maybe_add_nameservers(),
case ejabberd_sup:start_link() of
{ok, SupPid} ->
ejabberd_system_monitor:start(),
register_elixir_config_hooks(),
ejabberd_cluster:wait_for_sync(infinity),
ejabberd_hooks:run(ejabberd_started, []),
{T2, _} = statistics(wall_clock),
?INFO_MSG("ejabberd ~s is started in the node ~p in ~.2fs",
[ejabberd_config:get_version(),
node(), (T2-T1)/1000]),
lists:foreach(fun erlang:garbage_collect/1, processes()),
{ok, SupPid};
Err ->
?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Err]),
ejabberd:halt()
end;
{error, Reason} ->
?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Reason]),
try
{T1, _} = statistics(wall_clock),
ejabberd_logger:start(),
write_pid_file(),
start_included_apps(),
start_elixir_application(),
setup_if_elixir_conf_used(),
case ejabberd_config:load() of
ok ->
ejabberd_mnesia:start(),
file_queue_init(),
maybe_add_nameservers(),
case ejabberd_sup:start_link() of
{ok, SupPid} ->
ejabberd_system_monitor:start(),
register_elixir_config_hooks(),
ejabberd_cluster:wait_for_sync(infinity),
ejabberd_hooks:run(ejabberd_started, []),
ejabberd:check_apps(),
{T2, _} = statistics(wall_clock),
?INFO_MSG("ejabberd ~ts is started in the node ~p in ~.2fs",
[ejabberd_option:version(),
node(), (T2-T1)/1000]),
{ok, SupPid};
Err ->
?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Err]),
ejabberd:halt()
end;
Err ->
?CRITICAL_MSG("Failed to start ejabberd application: ~ts",
[ejabberd_config:format_error(Err)]),
ejabberd:halt()
end
catch throw:{?MODULE, Error} ->
?DEBUG("Failed to start ejabberd application: ~p", [Error]),
ejabberd:halt()
end;
start(_, _) ->
@@ -91,19 +97,18 @@ start_included_apps() ->
%% before shutting down the processes of the application.
prep_stop(State) ->
ejabberd_hooks:run(ejabberd_stopping, []),
ejabberd_listener:stop_listeners(),
ejabberd_listener:stop(),
ejabberd_sm:stop(),
gen_mod:stop_modules(),
ejabberd_service:stop(),
ejabberd_s2s:stop(),
gen_mod:stop(),
State.
%% All the processes were killed when this function is called
stop(_State) ->
?INFO_MSG("ejabberd ~s is stopped in the node ~p",
[ejabberd_config:get_version(), node()]),
delete_pid_file(),
%%ejabberd_debug:stop(),
ok.
?INFO_MSG("ejabberd ~ts is stopped in the node ~p",
[ejabberd_option:version(), node()]),
delete_pid_file().
%%%
%%% Internal functions
@@ -134,13 +139,13 @@ write_pid_file() ->
end.
write_pid_file(Pid, PidFilename) ->
case file:open(PidFilename, [write]) of
{ok, Fd} ->
io:format(Fd, "~s~n", [Pid]),
file:close(Fd);
{error, Reason} ->
?ERROR_MSG("Cannot write PID file ~s~nReason: ~p", [PidFilename, Reason]),
throw({cannot_write_pid_file, PidFilename, Reason})
case file:write_file(PidFilename, io_lib:format("~ts~n", [Pid])) of
ok ->
ok;
{error, Reason} = Err ->
?CRITICAL_MSG("Cannot write PID file ~ts: ~ts",
[PidFilename, file:format_error(Reason)]),
throw({?MODULE, Err})
end.
delete_pid_file() ->
@@ -152,34 +157,42 @@ delete_pid_file() ->
end.
file_queue_init() ->
QueueDir = case ejabberd_config:queue_dir() of
QueueDir = case ejabberd_option:queue_dir() of
undefined ->
MnesiaDir = mnesia:system_info(directory),
filename:join(MnesiaDir, "queue");
Path ->
Path
end,
p1_queue:start(QueueDir).
case p1_queue:start(QueueDir) of
ok -> ok;
Err -> throw({?MODULE, Err})
end.
-ifdef(ELIXIR_ENABLED).
is_using_elixir_config() ->
Config = ejabberd_config:path(),
'Elixir.Ejabberd.ConfigUtil':is_elixir_config(Config).
setup_if_elixir_conf_used() ->
case ejabberd_config:is_using_elixir_config() of
case is_using_elixir_config() of
true -> 'Elixir.Ejabberd.Config.Store':start_link();
false -> ok
end.
register_elixir_config_hooks() ->
case ejabberd_config:is_using_elixir_config() of
case is_using_elixir_config() of
true -> 'Elixir.Ejabberd.Config':start_hooks();
false -> ok
end.
start_elixir_application() ->
case ejabberd_config:is_elixir_enabled() of
true ->
case application:ensure_started(elixir) of
ok -> ok;
{error, _Msg} -> ?ERROR_MSG("Elixir application not started.", [])
end;
_ ->
ok
case application:ensure_started(elixir) of
ok -> ok;
{error, _Msg} -> ?ERROR_MSG("Elixir application not started.", [])
end.
-else.
setup_if_elixir_conf_used() -> ok.
register_elixir_config_hooks() -> ok.
start_elixir_application() -> ok.
-endif.
+90 -114
View File
@@ -1,7 +1,7 @@
%%%----------------------------------------------------------------------
%%% File : ejabberd_auth.erl
%%% Author : Alexey Shchepin <alexey@process-one.net>
%%% Purpose : Authentification
%%% Purpose : Authentication
%%% Created : 23 Nov 2002 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
@@ -25,7 +25,6 @@
-module(ejabberd_auth).
-behaviour(gen_server).
-behaviour(ejabberd_config).
-author('alexey@process-one.net').
@@ -47,15 +46,16 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([auth_modules/1, opt_type/1]).
-export([auth_modules/1]).
-include("scram.hrl").
-include("logger.hrl").
-define(SALT_LENGTH, 16).
-record(state, {host_modules = #{} :: map()}).
-record(state, {host_modules = #{} :: host_modules()}).
-type host_modules() :: #{binary => [module()]}.
-type password() :: binary() | #scram{}.
-type digest_fun() :: fun((binary()) -> binary()).
-export_type([password/0]).
@@ -72,14 +72,16 @@
-callback reload(binary()) -> any().
-callback plain_password_required(binary()) -> boolean().
-callback store_type(binary()) -> plain | external | scram.
-callback set_password(binary(), binary(), binary()) -> ok | {error, atom()}.
-callback remove_user(binary(), binary()) -> ok | {error, any()}.
-callback user_exists(binary(), binary()) -> boolean() | {error, atom()}.
-callback check_password(binary(), binary(), binary(), binary()) -> boolean().
-callback try_register(binary(), binary(), password()) -> ok | {error, atom()}.
-callback set_password(binary(), binary(), password()) ->
{ets_cache:tag(), {ok, password()} | {error, db_failure | not_allowed}}.
-callback remove_user(binary(), binary()) -> ok | {error, db_failure | not_allowed}.
-callback user_exists(binary(), binary()) -> {ets_cache:tag(), boolean() | {error, db_failure}}.
-callback check_password(binary(), binary(), binary(), binary()) -> {ets_cache:tag(), boolean() | {stop, boolean()}}.
-callback try_register(binary(), binary(), password()) ->
{ets_cache:tag(), {ok, password()} | {error, exists | db_failure | not_allowed}}.
-callback get_users(binary(), opts()) -> [{binary(), binary()}].
-callback count_users(binary(), opts()) -> number().
-callback get_password(binary(), binary()) -> {ok, password()} | error.
-callback get_password(binary(), binary()) -> {ets_cache:tag(), {ok, password()} | error}.
-callback use_cache(binary()) -> boolean().
-callback cache_nodes(binary()) -> boolean().
@@ -107,7 +109,7 @@ init([]) ->
fun(Host, Acc) ->
Modules = auth_modules(Host),
maps:put(Host, Modules, Acc)
end, #{}, ejabberd_config:get_myhosts()),
end, #{}, ejabberd_option:hosts()),
lists:foreach(
fun({Host, Modules}) ->
start(Host, Modules)
@@ -115,9 +117,9 @@ init([]) ->
init_cache(HostModules),
{ok, #state{host_modules = HostModules}}.
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_call(Request, From, State) ->
?WARNING_MSG("Unexpected call from ~p: ~p", [From, Request]),
{noreply, State}.
handle_cast({host_up, Host}, #state{host_modules = HostModules} = State) ->
Modules = auth_modules(Host),
@@ -141,19 +143,20 @@ handle_cast(config_reloaded, #state{host_modules = HostModules} = State) ->
stop(Host, OldModules -- NewModules),
reload(Host, misc:intersection(OldModules, NewModules)),
maps:put(Host, NewModules, Acc)
end, HostModules, ejabberd_config:get_myhosts()),
end, HostModules, ejabberd_option:hosts()),
init_cache(NewHostModules),
{noreply, State#state{host_modules = NewHostModules}};
handle_cast(Msg, State) ->
?WARNING_MSG("unexpected cast: ~p", [Msg]),
?WARNING_MSG("Unexpected cast: ~p", [Msg]),
{noreply, State}.
handle_info(_Info, State) ->
handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]),
{noreply, State}.
terminate(_Reason, State) ->
ejabberd_hooks:delete(host_up, ?MODULE, start, 30),
ejabberd_hooks:delete(host_down, ?MODULE, stop, 80),
ejabberd_hooks:delete(host_up, ?MODULE, host_up, 30),
ejabberd_hooks:delete(host_down, ?MODULE, host_down, 80),
ejabberd_hooks:delete(config_reloaded, ?MODULE, config_reloaded, 40),
lists:foreach(
fun({Host, Modules}) ->
@@ -234,23 +237,28 @@ check_password_with_authmodule(User, AuthzId, Server, Password, Digest, DigestGe
error ->
false;
LAuthzId ->
lists:foldl(
fun(Mod, false) ->
case db_check_password(
LUser, LAuthzId, LServer, Password,
Digest, DigestGen, Mod) of
true -> {true, Mod};
false -> false
end;
(_, Acc) ->
Acc
end, false, auth_modules(LServer))
untag_stop(
lists:foldl(
fun(Mod, false) ->
case db_check_password(
LUser, LAuthzId, LServer, Password,
Digest, DigestGen, Mod) of
true -> {true, Mod};
false -> false;
{stop, true} -> {stop, {true, Mod}};
{stop, false} -> {stop, false}
end;
(_, Acc) ->
Acc
end, false, auth_modules(LServer)))
end;
_ ->
false
end.
-spec set_password(binary(), binary(), password()) -> ok | {error, atom()}.
-spec set_password(binary(), binary(), password()) -> ok | {error,
db_failure | not_allowed |
invalid_jid | invalid_password}.
set_password(User, Server, Password) ->
case validate_credentials(User, Server, Password) of
{ok, LUser, LServer} ->
@@ -264,7 +272,9 @@ set_password(User, Server, Password) ->
Err
end.
-spec try_register(binary(), binary(), password()) -> ok | {error, atom()}.
-spec try_register(binary(), binary(), password()) -> ok | {error,
db_failure | not_allowed | exists |
invalid_jid | invalid_password}.
try_register(User, Server, Password) ->
case validate_credentials(User, Server, Password) of
{ok, LUser, LServer} ->
@@ -477,7 +487,11 @@ remove_user(User, Server, Password) ->
<<"">>, undefined, Mod) of
true ->
db_remove_user(LUser, LServer, Mod);
{stop, true} ->
db_remove_user(LUser, LServer, Mod);
false ->
{error, not_allowed};
{stop, false} ->
{error, not_allowed}
end
end, {error, not_allowed}, auth_modules(Server)) of
@@ -530,11 +544,12 @@ backend_type(Mod) ->
-spec password_format(binary() | global) -> plain | scram.
password_format(LServer) ->
ejabberd_config:get_option({auth_password_format, LServer}, plain).
ejabberd_option:auth_password_format(LServer).
%%%----------------------------------------------------------------------
%%% Backend calls
%%%----------------------------------------------------------------------
-spec db_try_register(binary(), binary(), password(), module()) -> ok | {error, exists | db_failure | not_allowed}.
db_try_register(User, Server, Password, Mod) ->
case erlang:function_exported(Mod, try_register, 3) of
true ->
@@ -542,22 +557,24 @@ db_try_register(User, Server, Password, Mod) ->
scram -> password_to_scram(Password);
_ -> Password
end,
case use_cache(Mod, Server) of
true ->
case ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, Password},
fun() -> Mod:try_register(User, Server, Password1) end,
cache_nodes(Mod, Server)) of
{ok, _} -> ok;
{error, _} = Err -> Err
end;
false ->
ets_cache:untag(Mod:try_register(User, Server, Password1))
Ret = case use_cache(Mod, Server) of
true ->
ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, Password},
fun() -> Mod:try_register(User, Server, Password1) end,
cache_nodes(Mod, Server));
false ->
ets_cache:untag(Mod:try_register(User, Server, Password1))
end,
case Ret of
{ok, _} -> ok;
{error, _} = Err -> Err
end;
false ->
{error, not_allowed}
end.
-spec db_set_password(binary(), binary(), password(), module()) -> ok | {error, db_failure | not_allowed}.
db_set_password(User, Server, Password, Mod) ->
case erlang:function_exported(Mod, set_password, 3) of
true ->
@@ -565,17 +582,18 @@ db_set_password(User, Server, Password, Mod) ->
scram -> password_to_scram(Password);
_ -> Password
end,
case use_cache(Mod, Server) of
true ->
case ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, Password},
fun() -> Mod:set_password(User, Server, Password1) end,
cache_nodes(Mod, Server)) of
{ok, _} -> ok;
{error, _} = Err -> Err
end;
false ->
ets_cache:untag(Mod:set_password(User, Server, Password1))
Ret = case use_cache(Mod, Server) of
true ->
ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, Password},
fun() -> Mod:set_password(User, Server, Password1) end,
cache_nodes(Mod, Server));
false ->
ets_cache:untag(Mod:set_password(User, Server, Password1))
end,
case Ret of
{ok, _} -> ok;
{error, _} = Err -> Err
end;
false ->
{error, not_allowed}
@@ -610,9 +628,6 @@ db_user_exists(User, Server, Mod) ->
cache_tab(Mod), {User, Server},
fun() ->
case Mod:user_exists(User, Server) of
true -> {ok, exists};
false -> error;
{error, _} = Err -> Err;
{CacheTag, true} -> {CacheTag, {ok, exists}};
{CacheTag, false} -> {CacheTag, error};
{_, {error, _}} = Err -> Err
@@ -645,10 +660,10 @@ db_check_password(User, AuthzId, Server, ProvidedPassword,
fun() ->
case Mod:check_password(
User, AuthzId, Server, ProvidedPassword) of
true -> {ok, ProvidedPassword};
false -> error;
{CacheTag, true} -> {CacheTag, {ok, ProvidedPassword}};
{CacheTag, false} -> {CacheTag, error}
{CacheTag, {stop, true}} -> {CacheTag, {ok, ProvidedPassword}};
{CacheTag, false} -> {CacheTag, error};
{CacheTag, {stop, false}} -> {CacheTag, error}
end
end) of
{ok, _} ->
@@ -667,7 +682,7 @@ db_check_password(User, AuthzId, Server, ProvidedPassword,
db_remove_user(User, Server, Mod) ->
case erlang:function_exported(Mod, remove_user, 2) of
true ->
case ets_cache:untag(Mod:remove_user(User, Server)) of
case Mod:remove_user(User, Server) of
ok ->
case use_cache(Mod, Server) of
true ->
@@ -686,7 +701,7 @@ db_remove_user(User, Server, Mod) ->
db_get_users(Server, Opts, Mod) ->
case erlang:function_exported(Mod, get_users, 2) of
true ->
ets_cache:untag(Mod:get_users(Server, Opts));
Mod:get_users(Server, Opts);
false ->
case use_cache(Mod, Server) of
true ->
@@ -704,7 +719,7 @@ db_get_users(Server, Opts, Mod) ->
db_count_users(Server, Opts, Mod) ->
case erlang:function_exported(Mod, count_users, 2) of
true ->
ets_cache:untag(Mod:count_users(Server, Opts));
Mod:count_users(Server, Opts);
false ->
case use_cache(Mod, Server) of
true ->
@@ -752,7 +767,7 @@ password_to_scram(Password, IterationCount) ->
%%%----------------------------------------------------------------------
%%% Cache stuff
%%%----------------------------------------------------------------------
-spec init_cache(map()) -> ok.
-spec init_cache(host_modules()) -> ok.
init_cache(HostModules) ->
CacheOpts = cache_opts(),
{True, False} = use_cache(HostModules),
@@ -767,21 +782,12 @@ init_cache(HostModules) ->
-spec cache_opts() -> [proplists:property()].
cache_opts() ->
MaxSize = ejabberd_config:get_option(
auth_cache_size,
ejabberd_config:cache_size(global)),
CacheMissed = ejabberd_config:get_option(
auth_cache_missed,
ejabberd_config:cache_missed(global)),
LifeTime = case ejabberd_config:get_option(
auth_cache_life_time,
ejabberd_config:cache_life_time(global)) of
infinity -> infinity;
I -> timer:seconds(I)
end,
MaxSize = ejabberd_option:auth_cache_size(),
CacheMissed = ejabberd_option:auth_cache_missed(),
LifeTime = ejabberd_option:auth_cache_life_time(),
[{max_size, MaxSize}, {cache_missed, CacheMissed}, {life_time, LifeTime}].
-spec use_cache(map()) -> {True :: [module()], False :: [module()]}.
-spec use_cache(host_modules()) -> {True :: [module()], False :: [module()]}.
use_cache(HostModules) ->
{Enabled, Disabled} =
maps:fold(
@@ -803,9 +809,7 @@ use_cache(Mod, LServer) ->
case erlang:function_exported(Mod, use_cache, 1) of
true -> Mod:use_cache(LServer);
false ->
ejabberd_config:get_option(
{auth_use_cache, LServer},
ejabberd_config:use_cache(LServer))
ejabberd_option:auth_use_cache(LServer)
end.
-spec cache_nodes(module(), binary()) -> [node()].
@@ -827,13 +831,12 @@ auth_modules() ->
lists:flatmap(
fun(Host) ->
[{Host, Mod} || Mod <- auth_modules(Host)]
end, ejabberd_config:get_myhosts()).
end, ejabberd_option:hosts()).
-spec auth_modules(binary()) -> [module()].
auth_modules(Server) ->
LServer = jid:nameprep(Server),
Default = ejabberd_config:default_db(LServer, ?MODULE),
Methods = ejabberd_config:get_option({auth_method, LServer}, [Default]),
Methods = ejabberd_option:auth_method(LServer),
[ejabberd:module_name([<<"ejabberd">>, <<"auth">>,
misc:atom_to_binary(M)])
|| M <- Methods].
@@ -897,6 +900,9 @@ validate_credentials(User, Server, Password) ->
end
end.
untag_stop({stop, Val}) -> Val;
untag_stop(Val) -> Val.
import_info() ->
[{<<"users">>, 3}].
@@ -907,35 +913,5 @@ import_start(_LServer, _) ->
import(Server, {sql, _}, mnesia, <<"users">>, Fields) ->
ejabberd_auth_mnesia:import(Server, Fields);
import(Server, {sql, _}, riak, <<"users">>, Fields) ->
ejabberd_auth_riak:import(Server, Fields);
import(_LServer, {sql, _}, sql, <<"users">>, _) ->
ok.
-spec opt_type(atom()) -> fun((any()) -> any()) | [atom()].
opt_type(auth_method) ->
fun (V) when is_list(V) ->
lists:map(fun(M) -> ejabberd_config:v_db(?MODULE, M) end, V);
(V) -> [ejabberd_config:v_db(?MODULE, V)]
end;
opt_type(auth_password_format) ->
fun (plain) -> plain;
(scram) -> scram
end;
opt_type(auth_use_cache) ->
fun(B) when is_boolean(B) -> B end;
opt_type(auth_cache_missed) ->
fun(B) when is_boolean(B) -> B end;
opt_type(auth_cache_life_time) ->
fun(I) when is_integer(I), I>0 -> I;
(unlimited) -> infinity;
(infinity) -> infinity
end;
opt_type(auth_cache_size) ->
fun(I) when is_integer(I), I>0 -> I;
(unlimited) -> infinity;
(infinity) -> infinity
end;
opt_type(_) ->
[auth_method, auth_password_format, auth_use_cache,
auth_cache_missed, auth_cache_life_time, auth_cache_size].
+12 -26
View File
@@ -25,7 +25,6 @@
-module(ejabberd_auth_anonymous).
-behaviour(ejabberd_config).
-behaviour(ejabberd_auth).
-author('mickael.remond@process-one.net').
@@ -43,7 +42,7 @@
-export([login/2, check_password/4, user_exists/2,
get_users/2, count_users/2, store_type/1,
plain_password_required/1, opt_type/1]).
plain_password_required/1]).
-include("logger.hrl").
-include("jid.hrl").
@@ -98,12 +97,12 @@ is_login_anonymous_enabled(Host) ->
%% Return the anonymous protocol to use: sasl_anon|login_anon|both
%% defaults to login_anon
anonymous_protocol(Host) ->
ejabberd_config:get_option({anonymous_protocol, Host}, sasl_anon).
ejabberd_option:anonymous_protocol(Host).
%% Return true if multiple connections have been allowed in the config file
%% defaults to false
allow_multiple_connections(Host) ->
ejabberd_config:get_option({allow_multiple_connections, Host}, false).
ejabberd_option:allow_multiple_connections(Host).
anonymous_user_exist(User, Server) ->
lists:any(
@@ -149,16 +148,14 @@ unregister_connection(_SID,
%% Specific anonymous auth functions
%% ---------------------------------
check_password(User, _AuthzId, Server, _Password) ->
case
ejabberd_auth:user_exists_in_other_modules(?MODULE,
User, Server)
of
%% If user exists in other module, reject anonnymous authentication
true -> false;
%% If we are not sure whether the user exists in other module, reject anon auth
maybe -> false;
false -> login(User, Server)
end.
{nocache,
case ejabberd_auth:user_exists_in_other_modules(?MODULE, User, Server) of
%% If user exists in other module, reject anonnymous authentication
true -> false;
%% If we are not sure whether the user exists in other module, reject anon auth
maybe -> false;
false -> login(User, Server)
end}.
login(User, Server) ->
case is_login_anonymous_enabled(Server) of
@@ -181,21 +178,10 @@ count_users(Server, Opts) ->
length(get_users(Server, Opts)).
user_exists(User, Server) ->
anonymous_user_exist(User, Server).
{nocache, anonymous_user_exist(User, Server)}.
plain_password_required(_) ->
false.
store_type(_) ->
external.
-spec opt_type(atom()) -> fun((any()) -> any()) | [atom()].
opt_type(allow_multiple_connections) ->
fun (V) when is_boolean(V) -> V end;
opt_type(anonymous_protocol) ->
fun (sasl_anon) -> sasl_anon;
(login_anon) -> login_anon;
(both) -> both
end;
opt_type(_) ->
[allow_multiple_connections, anonymous_protocol].
+17 -40
View File
@@ -1,7 +1,7 @@
%%%----------------------------------------------------------------------
%%% File : ejabberd_auth_external.erl
%%% Author : Alexey Shchepin <alexey@process-one.net>
%%% Purpose : Authentification via LDAP external script
%%% Purpose : Authentication via LDAP external script
%%% Created : 12 Dec 2004 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
@@ -25,15 +25,13 @@
-module(ejabberd_auth_external).
-behaviour(ejabberd_config).
-author('alexey@process-one.net').
-behaviour(ejabberd_auth).
-export([start/1, stop/1, reload/1, set_password/3, check_password/4,
try_register/3, user_exists/2, remove_user/2,
store_type/1, plain_password_required/1, opt_type/1]).
store_type/1, plain_password_required/1]).
-include("logger.hrl").
@@ -55,27 +53,27 @@ store_type(_) -> external.
check_password(User, AuthzId, Server, Password) ->
if AuthzId /= <<>> andalso AuthzId /= User ->
false;
{nocache, false};
true ->
check_password_extauth(User, AuthzId, Server, Password)
end.
set_password(User, Server, Password) ->
case extauth:set_password(User, Server, Password) of
Res when is_boolean(Res) -> ok;
Res when is_boolean(Res) -> {cache, {ok, Password}};
{error, Reason} -> failure(User, Server, set_password, Reason)
end.
try_register(User, Server, Password) ->
case extauth:try_register(User, Server, Password) of
true -> ok;
false -> {error, not_allowed};
true -> {cache, {ok, Password}};
false -> {cache, {error, not_allowed}};
{error, Reason} -> failure(User, Server, try_register, Reason)
end.
user_exists(User, Server) ->
case extauth:user_exists(User, Server) of
Res when is_boolean(Res) -> Res;
Res when is_boolean(Res) -> {cache, Res};
{error, Reason} -> failure(User, Server, user_exists, Reason)
end.
@@ -83,46 +81,25 @@ remove_user(User, Server) ->
case extauth:remove_user(User, Server) of
false -> {error, not_allowed};
true -> ok;
{error, Reason} -> failure(User, Server, remove_user, Reason)
{error, Reason} ->
{_, Err} = failure(User, Server, remove_user, Reason),
Err
end.
check_password_extauth(User, _AuthzId, Server, Password) ->
if Password /= <<"">> ->
case extauth:check_password(User, Server, Password) of
Res when is_boolean(Res) -> Res;
Res when is_boolean(Res) -> {cache, Res};
{error, Reason} ->
failure(User, Server, check_password, Reason),
false
{Tag, _} = failure(User, Server, check_password, Reason),
{Tag, false}
end;
true ->
false
{nocache, false}
end.
-spec failure(binary(), binary(), atom(), any()) -> {error, db_failure}.
-spec failure(binary(), binary(), atom(), any()) -> {nocache, {error, db_failure}}.
failure(User, Server, Fun, Reason) ->
?ERROR_MSG("External authentication program failed when calling "
"'~s' for ~s@~s: ~p", [Fun, User, Server, Reason]),
{error, db_failure}.
opt_type(extauth_cache) ->
?WARNING_MSG("option 'extauth_cache' is deprecated and has no effect, "
"use authentication or global cache configuration "
"options: auth_use_cache, auth_cache_life_time, "
"use_cache, cache_life_time, and so on", []),
fun (false) -> false;
(I) when is_integer(I), I >= 0 -> I
end;
opt_type(extauth_instances) ->
?WARNING_MSG("option 'extauth_instances' is deprecated and has no effect, "
"use 'extauth_pool_size'", []),
fun (V) when is_integer(V), V > 0 -> V end;
opt_type(extauth_program) ->
fun (V) -> binary_to_list(iolist_to_binary(V)) end;
opt_type(extauth_pool_name) ->
fun (V) -> iolist_to_binary(V) end;
opt_type(extauth_pool_size) ->
fun(I) when is_integer(I), I>0 -> I end;
opt_type(_) ->
[extauth_program, extauth_pool_size, extauth_pool_name,
%% Deprecated:
extauth_cache, extauth_instances].
"'~ts' for ~ts@~ts: ~p", [Fun, User, Server, Reason]),
{nocache, {error, db_failure}}.
+126
View File
@@ -0,0 +1,126 @@
%%%----------------------------------------------------------------------
%%% File : ejabberd_auth_jwt.erl
%%% Author : Mickael Remond <mremond@process-one.net>
%%% Purpose : Authentication using JWT tokens
%%% Created : 16 Mar 2019 by Mickael Remond <mremond@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2019 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.,
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_auth_jwt).
-author('mremond@process-one.net').
-behaviour(ejabberd_auth).
-export([start/1, stop/1, check_password/4,
store_type/1, plain_password_required/1,
user_exists/2, use_cache/1
]).
-include("xmpp.hrl").
-include("logger.hrl").
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start(Host) ->
case ejabberd_option:jwt_key(Host) of
undefined ->
?ERROR_MSG("Option jwt_key is not configured for ~ts: "
"JWT authentication won't work", [Host]);
_ ->
ok
end.
stop(_Host) -> ok.
plain_password_required(_Host) -> true.
store_type(_Host) -> external.
-spec check_password(binary(), binary(), binary(), binary()) -> {ets_cache:tag(), boolean() | {stop, boolean()}}.
check_password(User, AuthzId, Server, Token) ->
%% MREMOND: Should we move the AuthzId check at a higher level in
%% the call stack?
if AuthzId /= <<>> andalso AuthzId /= User ->
{nocache, false};
true ->
if Token == <<"">> -> {nocache, false};
true ->
Res = check_jwt_token(User, Server, Token),
Rule = ejabberd_option:jwt_auth_only_rule(Server),
case acl:match_rule(Server, Rule,
jid:make(User, Server, <<"">>)) of
deny ->
{nocache, Res};
allow ->
{nocache, {stop, Res}}
end
end
end.
user_exists(_User, _Host) -> {nocache, false}.
use_cache(_) ->
false.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
check_jwt_token(User, Server, Token) ->
JWK = ejabberd_option:jwt_key(Server),
try jose_jwt:verify(JWK, Token) of
{true, {jose_jwt, Fields}, Signature} ->
?DEBUG("jwt verify: ~p - ~p~n", [Fields, Signature]),
case maps:find(<<"exp">>, Fields) of
error ->
%% No expiry in token => We consider token invalid:
false;
{ok, Exp} ->
Now = erlang:system_time(second),
if
Exp > Now ->
case maps:find(<<"jid">>, Fields) of
error ->
false;
{ok, SJID} ->
try
JID = jid:decode(SJID),
(JID#jid.luser == User) andalso
(JID#jid.lserver == Server)
catch error:{bad_jid, _} ->
false
end
end;
true ->
%% return false, if token has expired
false
end
end;
{false, _, _} ->
false
catch
error:{badarg, _} ->
false
end.
%% TODO: auth0 username is defined in 'jid' field, but we should
%% allow customizing the name of the field containing the username
%% to adapt to custom claims.
+33 -80
View File
@@ -1,7 +1,7 @@
%%%----------------------------------------------------------------------
%%% File : ejabberd_auth_ldap.erl
%%% Author : Alexey Shchepin <alexey@process-one.net>
%%% Purpose : Authentification via LDAP
%%% Purpose : Authentication via LDAP
%%% Created : 12 Dec 2004 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
@@ -25,8 +25,6 @@
-module(ejabberd_auth_ldap).
-behaviour(ejabberd_config).
-author('alexey@process-one.net').
-behaviour(gen_server).
@@ -39,8 +37,7 @@
-export([start/1, stop/1, start_link/1, set_password/3,
check_password/4, user_exists/2,
get_users/2, count_users/2,
store_type/1, plain_password_required/1,
opt_type/1]).
store_type/1, plain_password_required/1]).
-include("logger.hrl").
@@ -60,16 +57,19 @@
uids = [] :: [{binary()} | {binary(), binary()}],
ufilter = <<"">> :: binary(),
sfilter = <<"">> :: binary(),
lfilter :: {any(), any()} | undefined,
deref_aliases = never :: never | searching | finding | always,
dn_filter :: binary() | undefined,
dn_filter_attrs = [] :: [binary()]}).
handle_cast(_Request, State) -> {noreply, State}.
handle_cast(Msg, State) ->
?WARNING_MSG("Unexpected cast: ~p", [Msg]),
{noreply, State}.
code_change(_OldVsn, State, _Extra) -> {ok, State}.
handle_info(_Info, State) -> {noreply, State}.
handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]),
{noreply, State}.
-define(LDAP_SEARCH_TIMEOUT, 5).
@@ -85,8 +85,10 @@ start(Host) ->
stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
supervisor:terminate_child(ejabberd_backend_sup, Proc),
supervisor:delete_child(ejabberd_backend_sup, Proc).
case supervisor:terminate_child(ejabberd_backend_sup, Proc) of
ok -> supervisor:delete_child(ejabberd_backend_sup, Proc);
Err -> Err
end.
start_link(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
@@ -113,26 +115,25 @@ store_type(_) -> external.
check_password(User, AuthzId, Server, Password) ->
if AuthzId /= <<>> andalso AuthzId /= User ->
false;
{nocache, false};
Password == <<"">> ->
{nocache, false};
true ->
if Password == <<"">> -> false;
true ->
case catch check_password_ldap(User, Server, Password) of
{'EXIT', _} -> false;
Result -> Result
end
case catch check_password_ldap(User, Server, Password) of
{'EXIT', _} -> {nocache, false};
Result -> {cache, Result}
end
end.
set_password(User, Server, Password) ->
{ok, State} = eldap_utils:get_state(Server, ?MODULE),
case find_user_dn(User, State) of
false -> {error, notfound};
false -> {cache, {error, db_failure}};
DN ->
case eldap_pool:modify_passwd(State#state.eldap_id, DN,
Password) of
ok -> ok;
_Err -> {error, db_failure}
ok -> {cache, {ok, Password}};
_Err -> {nocache, {error, db_failure}}
end
end.
@@ -148,8 +149,8 @@ count_users(Server, Opts) ->
%% @spec (User, Server) -> true | false | {error, Error}
user_exists(User, Server) ->
case catch user_exists_ldap(User, Server) of
{'EXIT', _Error} -> {error, db_failure};
Result -> Result
{'EXIT', _Error} -> {nocache, {error, db_failure}};
Result -> {cache, Result}
end.
%%%----------------------------------------------------------------------
@@ -228,8 +229,9 @@ handle_call(get_state, _From, State) ->
{reply, {ok, State}, State};
handle_call(stop, _From, State) ->
{stop, normal, ok, State};
handle_call(_Request, _From, State) ->
{reply, bad_request, State}.
handle_call(Request, From, State) ->
?WARNING_MSG("Unexpected call from ~p: ~p", [From, Request]),
{noreply, State}.
find_user_dn(User, State) ->
ResAttrs = result_attrs(State),
@@ -246,19 +248,12 @@ find_user_dn(User, State) ->
[#eldap_entry{attributes = Attrs,
object_name = DN}
| _]} ->
dn_filter(DN, Attrs, State);
is_valid_dn(DN, Attrs, State);
_ -> false
end;
_ -> false
end.
%% apply the dn filter and the local filter:
dn_filter(DN, Attrs, State) ->
case check_local_filter(Attrs, State) of
false -> false;
true -> is_valid_dn(DN, Attrs, State)
end.
%% Check that the DN is valid, based on the dn filter
is_valid_dn(DN, _, #state{dn_filter = undefined}) -> DN;
is_valid_dn(DN, Attrs, State) ->
@@ -294,30 +289,6 @@ is_valid_dn(DN, Attrs, State) ->
_ -> false
end.
%% The local filter is used to check an attribute in ejabberd
%% and not in LDAP to limit the load on the LDAP directory.
%% A local rule can be either:
%% {equal, {"accountStatus",["active"]}}
%% {notequal, {"accountStatus",["disabled"]}}
%% {ldap_local_filter, {notequal, {"accountStatus",["disabled"]}}}
check_local_filter(_Attrs,
#state{lfilter = undefined}) ->
true;
check_local_filter(Attrs,
#state{lfilter = LocalFilter}) ->
{Operation, FilterMatch} = LocalFilter,
local_filter(Operation, Attrs, FilterMatch).
local_filter(equal, Attrs, FilterMatch) ->
{Attr, Value} = FilterMatch,
case lists:keysearch(Attr, 1, Attrs) of
false -> false;
{value, {Attr, Value}} -> true;
_ -> false
end;
local_filter(notequal, Attrs, FilterMatch) ->
not local_filter(equal, Attrs, FilterMatch).
result_attrs(#state{uids = UIDs,
dn_filter_attrs = DNFilterAttrs}) ->
lists:foldl(fun ({UID}, Acc) -> [UID | Acc];
@@ -329,25 +300,21 @@ result_attrs(#state{uids = UIDs,
%%% Auxiliary functions
%%%----------------------------------------------------------------------
parse_options(Host) ->
Cfg = eldap_utils:get_config(Host, []),
Cfg = ?eldap_config(ejabberd_option, Host),
Eldap_ID = misc:atom_to_binary(gen_mod:get_module_proc(Host, ?MODULE)),
Bind_Eldap_ID = misc:atom_to_binary(
gen_mod:get_module_proc(Host, bind_ejabberd_auth_ldap)),
UIDsTemp = ejabberd_config:get_option(
{ldap_uids, Host}, [{<<"uid">>, <<"%u">>}]),
UIDsTemp = ejabberd_option:ldap_uids(Host),
UIDs = eldap_utils:uids_domain_subst(Host, UIDsTemp),
SubFilter = eldap_utils:generate_subfilter(UIDs),
UserFilter = case ejabberd_config:get_option({ldap_filter, Host}, <<"">>) of
UserFilter = case ejabberd_option:ldap_filter(Host) of
<<"">> ->
SubFilter;
F ->
<<"(&", SubFilter/binary, F/binary, ")">>
end,
SearchFilter = eldap_filter:do_sub(UserFilter,
[{<<"%u">>, <<"*">>}]),
{DNFilter, DNFilterAttrs} =
ejabberd_config:get_option({ldap_dn_filter, Host}, {undefined, []}),
LocalFilter = ejabberd_config:get_option({ldap_local_filter, Host}),
SearchFilter = eldap_filter:do_sub(UserFilter, [{<<"%u">>, <<"*">>}]),
{DNFilter, DNFilterAttrs} = ejabberd_option:ldap_dn_filter(Host),
#state{host = Host, eldap_id = Eldap_ID,
bind_eldap_id = Bind_Eldap_ID,
servers = Cfg#eldap_config.servers,
@@ -359,19 +326,5 @@ parse_options(Host) ->
base = Cfg#eldap_config.base,
deref_aliases = Cfg#eldap_config.deref_aliases,
uids = UIDs, ufilter = UserFilter,
sfilter = SearchFilter, lfilter = LocalFilter,
sfilter = SearchFilter,
dn_filter = DNFilter, dn_filter_attrs = DNFilterAttrs}.
-spec opt_type(atom()) -> fun((any()) -> any()) | [atom()].
opt_type(ldap_dn_filter) ->
fun ([{DNF, DNFA}]) ->
NewDNFA = case DNFA of
undefined -> [];
_ -> [iolist_to_binary(A) || A <- DNFA]
end,
NewDNF = eldap_utils:check_filter(DNF),
{NewDNF, NewDNFA}
end;
opt_type(ldap_local_filter) -> fun (V) -> V end;
opt_type(_) ->
[ldap_dn_filter, ldap_local_filter].
+13 -17
View File
@@ -1,7 +1,7 @@
%%%----------------------------------------------------------------------
%%% File : ejabberd_auth_mnesia.erl
%%% Author : Alexey Shchepin <alexey@process-one.net>
%%% Purpose : Authentification via mnesia
%%% Purpose : Authentication via mnesia
%%% Created : 12 Dec 2004 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
@@ -25,8 +25,6 @@
-module(ejabberd_auth_mnesia).
-compile([{parse_transform, ejabberd_sql_pt}]).
-author('alexey@process-one.net').
-behaviour(ejabberd_auth).
@@ -77,9 +75,7 @@ update_reg_users_counter_table(Server) ->
use_cache(Host) ->
case mnesia:table_info(passwd, storage_type) of
disc_only_copies ->
ejabberd_config:get_option(
{auth_use_cache, Host},
ejabberd_config:use_cache(Host));
ejabberd_option:auth_use_cache(Host);
_ ->
false
end.
@@ -97,10 +93,10 @@ set_password(User, Server, Password) ->
end,
case mnesia:transaction(F) of
{atomic, ok} ->
ok;
{cache, {ok, Password}};
{aborted, Reason} ->
?ERROR_MSG("Mnesia transaction failed: ~p", [Reason]),
{error, db_failure}
{nocache, {error, db_failure}}
end.
try_register(User, Server, Password) ->
@@ -110,17 +106,17 @@ try_register(User, Server, Password) ->
[] ->
mnesia:write(#passwd{us = US, password = Password}),
mnesia:dirty_update_counter(reg_users_counter, Server, 1),
ok;
{ok, Password};
[_] ->
{error, exists}
end
end,
case mnesia:transaction(F) of
{atomic, Res} ->
Res;
{cache, Res};
{aborted, Reason} ->
?ERROR_MSG("Mnesia transaction failed: ~p", [Reason]),
{error, db_failure}
{nocache, {error, db_failure}}
end.
get_users(Server, []) ->
@@ -185,9 +181,9 @@ count_users(Server, _) ->
get_password(User, Server) ->
case mnesia:dirty_read(passwd, {User, Server}) of
[#passwd{password = Password}] ->
{ok, Password};
{cache, {ok, Password}};
_ ->
error
{cache, error}
end.
remove_user(User, Server) ->
@@ -207,7 +203,7 @@ remove_user(User, Server) ->
need_transform(#reg_users_counter{}) ->
false;
need_transform(#passwd{us = {U, S}, password = Pass}) ->
need_transform({passwd, {U, S}, Pass}) ->
if is_binary(Pass) ->
case store_type(S) of
scram ->
@@ -234,7 +230,7 @@ need_transform(#passwd{us = {U, S}, password = Pass}) ->
true
end.
transform(#passwd{us = {U, S}, password = Pass} = R)
transform({passwd, {U, S}, Pass})
when is_list(U) orelse is_list(S) orelse is_list(Pass) ->
NewUS = {iolist_to_binary(U), iolist_to_binary(S)},
NewPass = case Pass of
@@ -248,14 +244,14 @@ transform(#passwd{us = {U, S}, password = Pass} = R)
_ ->
iolist_to_binary(Pass)
end,
transform(R#passwd{us = NewUS, password = NewPass});
transform(#passwd{us = NewUS, password = NewPass});
transform(#passwd{us = {U, S}, password = Password} = P)
when is_binary(Password) ->
case store_type(S) of
scram ->
case jid:resourceprep(Password) of
error ->
?ERROR_MSG("SASLprep failed for password of user ~s@~s",
?ERROR_MSG("SASLprep failed for password of user ~ts@~ts",
[U, S]),
P;
_ ->
+18 -30
View File
@@ -24,15 +24,12 @@
%%%-------------------------------------------------------------------
-module(ejabberd_auth_pam).
-behaviour(ejabberd_config).
-author('xram@jabber.ru').
-behaviour(ejabberd_auth).
-export([start/1, stop/1, check_password/4,
user_exists/2, store_type/1, plain_password_required/1,
opt_type/1]).
user_exists/2, store_type/1, plain_password_required/1]).
start(_Host) ->
ejabberd:start_app(epam).
@@ -42,19 +39,18 @@ stop(_Host) ->
check_password(User, AuthzId, Host, Password) ->
if AuthzId /= <<>> andalso AuthzId /= User ->
false;
true ->
Service = get_pam_service(Host),
UserInfo = case get_pam_userinfotype(Host) of
username -> User;
jid -> <<User/binary, "@", Host/binary>>
end,
case catch epam:authenticate(Service, UserInfo,
Password)
of
true -> true;
_ -> false
end
false;
true ->
Service = get_pam_service(Host),
UserInfo = case get_pam_userinfotype(Host) of
username -> User;
jid -> <<User/binary, "@", Host/binary>>
end,
case catch epam:authenticate(Service, UserInfo, Password) of
true -> {cache, true};
false -> {cache, false};
_ -> {nocache, false}
end
end.
user_exists(User, Host) ->
@@ -64,9 +60,9 @@ user_exists(User, Host) ->
jid -> <<User/binary, "@", Host/binary>>
end,
case catch epam:acct_mgmt(Service, UserInfo) of
true -> true;
false -> false;
_Err -> {error, db_failure}
true -> {cache, true};
false -> {cache, false};
_Err -> {nocache, {error, db_failure}}
end.
plain_password_required(_) -> true.
@@ -77,15 +73,7 @@ store_type(_) -> external.
%% Internal functions
%%====================================================================
get_pam_service(Host) ->
ejabberd_config:get_option({pam_service, Host}, <<"ejabberd">>).
ejabberd_option:pam_service(Host).
get_pam_userinfotype(Host) ->
ejabberd_config:get_option({pam_userinfotype, Host}, username).
-spec opt_type(atom()) -> fun((any()) -> any()) | [atom()].
opt_type(pam_service) -> fun iolist_to_binary/1;
opt_type(pam_userinfotype) ->
fun (username) -> username;
(jid) -> jid
end;
opt_type(_) -> [pam_service, pam_userinfotype].
ejabberd_option:pam_userinfotype(Host).
-121
View File
@@ -1,121 +0,0 @@
%%%----------------------------------------------------------------------
%%% File : ejabberd_auth_riak.erl
%%% Author : Evgeniy Khramtsov <ekhramtsov@process-one.net>
%%% Purpose : Authentification via Riak
%%% Created : 12 Nov 2012 by Evgeniy Khramtsov <ekhramtsov@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2019 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.,
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_auth_riak).
-compile([{parse_transform, ejabberd_sql_pt}]).
-author('alexey@process-one.net').
-behaviour(ejabberd_auth).
%% External exports
-export([start/1, stop/1, set_password/3, try_register/3,
get_users/2, count_users/2,
get_password/2, remove_user/2, store_type/1, export/1, import/2,
plain_password_required/1]).
-export([passwd_schema/0]).
-include("ejabberd_sql_pt.hrl").
-include("scram.hrl").
-include("ejabberd_auth.hrl").
start(_Host) ->
ok.
stop(_Host) ->
ok.
plain_password_required(Server) ->
store_type(Server) == scram.
store_type(Server) ->
ejabberd_auth:password_format(Server).
passwd_schema() ->
{record_info(fields, passwd), #passwd{}}.
set_password(User, Server, Password) ->
ejabberd_riak:put(#passwd{us = {User, Server}, password = Password},
passwd_schema(),
[{'2i', [{<<"host">>, Server}]}]).
try_register(User, Server, Password) ->
US = {User, Server},
case ejabberd_riak:get(passwd, passwd_schema(), US) of
{error, notfound} ->
ejabberd_riak:put(#passwd{us = US, password = Password},
passwd_schema(),
[{'2i', [{<<"host">>, Server}]}]);
{ok, _} ->
{error, exists};
{error, _} = Err ->
Err
end.
get_users(Server, _) ->
case ejabberd_riak:get_keys_by_index(passwd, <<"host">>, Server) of
{ok, Users} ->
Users;
_ ->
[]
end.
count_users(Server, _) ->
case ejabberd_riak:count_by_index(passwd, <<"host">>, Server) of
{ok, N} ->
N;
_ ->
0
end.
get_password(User, Server) ->
case ejabberd_riak:get(passwd, passwd_schema(), {User, Server}) of
{ok, Password} ->
{ok, Password};
{error, _} ->
error
end.
remove_user(User, Server) ->
ejabberd_riak:delete(passwd, {User, Server}).
export(_Server) ->
[{passwd,
fun(Host, #passwd{us = {LUser, LServer}, password = Password})
when LServer == Host ->
[?SQL("delete from users where username=%(LUser)s and %(LServer)H;"),
?SQL_INSERT(
"users",
["username=%(LUser)s",
"server_host=%(LServer)s",
"password=%(Password)s"])];
(_Host, _R) ->
[]
end}].
import(LServer, [LUser, Password, _TimeStamp]) ->
Passwd = #passwd{us = {LUser, LServer}, password = Password},
ejabberd_riak:put(Passwd, passwd_schema(), [{'2i', [{<<"host">>, LServer}]}]).

Some files were not shown because too many files have changed in this diff Show More