Compare commits
460 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d0452e3bef | |||
| ec36dd7ba1 | |||
| 84d8c156a0 | |||
| c7ab3274c5 | |||
| 3d4f2d365f | |||
| bc9e5c5363 | |||
| 54a1fcc5e8 | |||
| c3d8c3d9c5 | |||
| bdfa1b3403 | |||
| aa190ca896 | |||
| 49ecddc646 | |||
| fad5406348 | |||
| 30b3c6c908 | |||
| 32dee33070 | |||
| 59e1c5643f | |||
| b253cc46d4 | |||
| 09bdb055fb | |||
| 449ac8f3e3 | |||
| 28be716c5f | |||
| f250594738 | |||
| 0fb7213e1a | |||
| bb2cb19a5c | |||
| 6e4079586a | |||
| d0bca94638 | |||
| 0302d1615b | |||
| 985fa24130 | |||
| ba5b6133cd | |||
| 0964f9cbcd | |||
| 06e448b4d0 | |||
| b773bb4cd4 | |||
| 65437d08ef | |||
| 87995a57de | |||
| a7dc1de980 | |||
| ce6f32906a | |||
| ef7470b503 | |||
| 853be230a8 | |||
| 2739a52e0f | |||
| f1c422db8e | |||
| 011630f8b9 | |||
| 6f11210edd | |||
| ce18c93419 | |||
| f3f80f2f55 | |||
| cae86f62e6 | |||
| ea4a365bf5 | |||
| 9c23a7dc3f | |||
| b0db87c683 | |||
| 200cea25c8 | |||
| 8d15e973e2 | |||
| 493ee7f534 | |||
| d6de831381 | |||
| 5ece51f8da | |||
| ca786e8102 | |||
| bde513d088 | |||
| c5f9652019 | |||
| 5e2aca8138 | |||
| 12331768bc | |||
| 7a1e0d4720 | |||
| 45c7fbb5ae | |||
| a852c31c6c | |||
| c8c4827626 | |||
| 4f33524842 | |||
| b5a76fb4de | |||
| c148ab4430 | |||
| a30d5875ed | |||
| 11574f0a43 | |||
| d65d04cc9a | |||
| 881cc42168 | |||
| 69a5a22810 | |||
| b34291762a | |||
| 6fd4315a0c | |||
| f4959c8b28 | |||
| f61f5beb5b | |||
| 74e86611ab | |||
| 155261f78a | |||
| e59043db2c | |||
| 87445bc74b | |||
| d8642fc7c2 | |||
| 19019bbe32 | |||
| 10481ed895 | |||
| feb2ad0664 | |||
| 5744d44e68 | |||
| 0870f32c59 | |||
| b86fe14ef0 | |||
| 6dbd1118a2 | |||
| 170ea134d6 | |||
| b405a3b61e | |||
| e3ff868fcd | |||
| 121fc716b0 | |||
| 152956c194 | |||
| 6cdb517454 | |||
| 94186a36d0 | |||
| f461bcb597 | |||
| 8065ec831e | |||
| 4c51f6e1fe | |||
| f19219f5a0 | |||
| 0f73d3f4d1 | |||
| 91c9b0446c | |||
| 68762146d7 | |||
| 5506b838c8 | |||
| 871e26a01e | |||
| ce8c2ca0fd | |||
| 1e1b72572f | |||
| 6afdf88e09 | |||
| 2f92dc40df | |||
| a846260d6e | |||
| dca49f508f | |||
| 3520869e36 | |||
| d5841785e1 | |||
| f721374321 | |||
| 7381b9db85 | |||
| 305792f409 | |||
| 35b8a042b8 | |||
| de8abc15a8 | |||
| 265e0610a3 | |||
| 231dfd776f | |||
| d4f288d3c6 | |||
| c407b73803 | |||
| be0175fb70 | |||
| 22b469f55d | |||
| aad04bba91 | |||
| da516d64d4 | |||
| a6f0feb23b | |||
| 7d7d08f980 | |||
| 2dc153751d | |||
| d4bf29e3ff | |||
| 4247501dc6 | |||
| b88fda9494 | |||
| f86055378d | |||
| f20e9e9b66 | |||
| 0ef2624b57 | |||
| b3211b1f71 | |||
| f7c7d784c4 | |||
| 0b9263bc15 | |||
| ba0d5e4dcf | |||
| 4d093ac03e | |||
| e63e8a6d38 | |||
| 37d2bdd90d | |||
| dda60fcf0d | |||
| 9661d06334 | |||
| bdd1a129c0 | |||
| 965196a2e8 | |||
| a7912f5344 | |||
| 6279cac932 | |||
| 25e0326f87 | |||
| c92478f7c2 | |||
| 3b30d5b0ed | |||
| adbccbe852 | |||
| 67b5de05c7 | |||
| 11c725018b | |||
| 9542cca0db | |||
| 8824a912ef | |||
| cae4fbb40b | |||
| 52ac941034 | |||
| 4579fd6ac7 | |||
| 7714046511 | |||
| 1b192987d2 | |||
| 585afcbc77 | |||
| 78aa187067 | |||
| adf0f87e99 | |||
| 259876cb74 | |||
| 20326e8908 | |||
| 03485f5e94 | |||
| 0f2d36dc53 | |||
| 8e88fa3884 | |||
| a9ac10e876 | |||
| 1fb908b70f | |||
| 1ce3bd256b | |||
| ce14c28faf | |||
| 03a11c63bd | |||
| 9ba20d26cb | |||
| cc7ebb86b4 | |||
| 79ddde3040 | |||
| 61dc89a068 | |||
| 7c9b47fb78 | |||
| dc81966938 | |||
| 59c9500944 | |||
| 8ccad7fada | |||
| 8a5d90797a | |||
| aa580b3f6e | |||
| 3841097428 | |||
| 5ff45e0f00 | |||
| 94a733c666 | |||
| e2b7717dd9 | |||
| 694d80b7fa | |||
| 84d23e60d1 | |||
| f4e2d278ba | |||
| d8be168cff | |||
| cde089ce9c | |||
| fdc664a318 | |||
| 4deff0513c | |||
| 46324385f2 | |||
| b5d8b22486 | |||
| 1b22368f6b | |||
| f88aa49913 | |||
| 200a842cb0 | |||
| 66bb4cbfa9 | |||
| aaa053829f | |||
| 0881c5941a | |||
| 3c46e6aba5 | |||
| fc34661b6f | |||
| a26c9d2475 | |||
| 536beedeb6 | |||
| 7196f46730 | |||
| 42bdb501ca | |||
| 24742031e9 | |||
| 7e07cba406 | |||
| 8b7da70b57 | |||
| a94209a0e0 | |||
| ed5ba1f645 | |||
| 1915f29d4b | |||
| 333eaef6dc | |||
| d1bfd6c90d | |||
| ca143c1873 | |||
| e10f2a9e47 | |||
| 0f9a0156c6 | |||
| 68ea5834c8 | |||
| 4a52042435 | |||
| 6b1f78e87a | |||
| 3f4423e996 | |||
| 8d8a3177e1 | |||
| 7897c3d0e1 | |||
| b173ec0a78 | |||
| 7fd0eefa30 | |||
| dab4c0cc10 | |||
| 0372878ba5 | |||
| ad3c91b86e | |||
| 75b133d968 | |||
| 89ad8a5502 | |||
| 15d3ebb842 | |||
| 689749a563 | |||
| a590e81922 | |||
| 405a5172d5 | |||
| 97b8373fd2 | |||
| bdd4e52699 | |||
| 03817de827 | |||
| 132ebb8f2d | |||
| 2cdda4cf49 | |||
| 4e014d23bd | |||
| b6a2eeebeb | |||
| 684ef60ec3 | |||
| 6e3df8e80b | |||
| c4f6c9dfe7 | |||
| 13cbd7c35d | |||
| 65a900668c | |||
| 2f1611f918 | |||
| 29dcc9b94c | |||
| 5d48329a3f | |||
| 5d0e599f17 | |||
| 5462a26a0a | |||
| 5f3c8dcca4 | |||
| 54c23a65db | |||
| 4d384b6bf5 | |||
| c2db003431 | |||
| d3aa329769 | |||
| db920b7d7b | |||
| 6b0fa44386 | |||
| 964cb3aaca | |||
| 1377dcf6d2 | |||
| 595b016019 | |||
| 85408662ff | |||
| d205e6ff1f | |||
| dd359a7328 | |||
| f74a715713 | |||
| af4b49f720 | |||
| ceeba3eea1 | |||
| cfc393a12e | |||
| c9c5839da4 | |||
| bf068f5659 | |||
| 32cf44827d | |||
| 0c403c0f0e | |||
| 3eb795357f | |||
| 2f5b15129a | |||
| f8167fc5d0 | |||
| 5abc03ff8f | |||
| 3114ce4ed2 | |||
| 868387a405 | |||
| caf07692db | |||
| 91350ad472 | |||
| d967103d89 | |||
| f77686481a | |||
| b0da69f050 | |||
| 9643e18be7 | |||
| ebf03a3745 | |||
| c952cc420b | |||
| 4d0503b6b3 | |||
| 8b6c90c2d9 | |||
| 655dcbcb74 | |||
| ac4f240261 | |||
| 506e2f3b97 | |||
| 30ae66e99e | |||
| f5038b86f8 | |||
| 9446b251fd | |||
| 94fb0a65b0 | |||
| 69d362595e | |||
| b7f7713fae | |||
| 8af66b0831 | |||
| 7e9c9703dd | |||
| 8d5025076f | |||
| 29751a6174 | |||
| 1b0e59bb13 | |||
| 8f8de0403b | |||
| 8afc320aba | |||
| 545a2f0097 | |||
| 14bf197be1 | |||
| 3e942bf4ac | |||
| fdfd202a30 | |||
| 5b0a28bbc9 | |||
| aefc374317 | |||
| 4c61ea9091 | |||
| d7e330c8ef | |||
| 99ffd9bb95 | |||
| 76c49f314f | |||
| ab5e726176 | |||
| b22779f018 | |||
| 41808a63a0 | |||
| ccb4328d06 | |||
| 2050cdffb4 | |||
| fce7fe8558 | |||
| 103e98b8da | |||
| 8e553decb0 | |||
| e3875482ba | |||
| 6e4e5a0190 | |||
| c96de092fe | |||
| cf72c5ee18 | |||
| 69fa79b154 | |||
| ea795e4bd7 | |||
| 537c8b966e | |||
| 142e494d52 | |||
| 50242cec78 | |||
| 33f821d4f7 | |||
| 9a823e5a16 | |||
| 686ce01534 | |||
| 4225f14e8b | |||
| a3478b7f0f | |||
| bab9543c1f | |||
| c3169e9eea | |||
| c04b6b2908 | |||
| 937e1c2e37 | |||
| 91763bbc61 | |||
| e0c9a6308d | |||
| e14cd5dd17 | |||
| e31919914b | |||
| fcbd72f2d7 | |||
| 4c5641a648 | |||
| 1fd452dca9 | |||
| f35d304582 | |||
| 8ca12d4d23 | |||
| 72e069d9ec | |||
| df8b0cb1a5 | |||
| a00a11e38a | |||
| 94949c9617 | |||
| e2aaca7cdd | |||
| 3afaacab76 | |||
| 57be0e38d8 | |||
| 27c69f263c | |||
| e22ed8081a | |||
| 5beaf50c67 | |||
| a07029dcad | |||
| 0de6f1c538 | |||
| 2e2667bbd7 | |||
| 271a9f097d | |||
| 7e3276f3a8 | |||
| 42fdac0b41 | |||
| 509331a563 | |||
| 08c2d0a83e | |||
| bb0c6e1e02 | |||
| 331a67f5f8 | |||
| e3e4dae583 | |||
| b669e4499c | |||
| 6e900d6a8f | |||
| 795addca7d | |||
| 774de2bdc5 | |||
| b5b2ad560a | |||
| b93fc4333c | |||
| d7c9809c59 | |||
| ac06161f30 | |||
| 0fe2aea709 | |||
| 21b021d912 | |||
| d5adcaea61 | |||
| 9d4c01d425 | |||
| ea97be9124 | |||
| 2458f55837 | |||
| 5f8114974f | |||
| 1ef9f28f2d | |||
| 3ed41e39f6 | |||
| 4ee10c155d | |||
| c2d8bc7b2f | |||
| b5bafca640 | |||
| 9a93562b94 | |||
| bf8b4acf01 | |||
| 41fd2afeb3 | |||
| 4520d5f3c1 | |||
| ccadbf45a2 | |||
| 2b0d724aef | |||
| 9010c35193 | |||
| 2c20414453 | |||
| 64f3f3287a | |||
| 1befa8d8b7 | |||
| 3b5ddf0254 | |||
| 33fd45a960 | |||
| 77ef03e104 | |||
| 70640e71f1 | |||
| 1ee64091b3 | |||
| 7b33499811 | |||
| d94bae241c | |||
| 58a623778f | |||
| 494ba9a635 | |||
| 95fa43aa96 | |||
| 16af8a4739 | |||
| 57202d958a | |||
| d741f6f5f2 | |||
| 20b4deffe3 | |||
| ee3796b925 | |||
| 8e08703833 | |||
| 3b716d2cb0 | |||
| 0f51a03d08 | |||
| 20247af6f6 | |||
| 2698024b82 | |||
| a142dc4b11 | |||
| 2844a2d73e | |||
| 160cd11c83 | |||
| 4fdebd296a | |||
| b18f622984 | |||
| f61607df65 | |||
| 5d0c0eb03d | |||
| ef1d9a0723 | |||
| 5465e7ed2f | |||
| 7edd9e3766 | |||
| 7a6425544c | |||
| 97e7f25e6e | |||
| 916653e234 | |||
| 6db228fcb3 | |||
| c2821be94c | |||
| 999d0af502 | |||
| 78c09789f7 | |||
| 5a8f1ca528 | |||
| 2d38d48a55 | |||
| dcc5d8704f | |||
| c10e4fa275 | |||
| e462f0a584 | |||
| 45bbbd0284 | |||
| 5b0f0d8352 | |||
| 54916caf65 | |||
| c8afb5ceb6 | |||
| b3374e1f99 | |||
| 4914b33f8c | |||
| 0ec69f0279 | |||
| 6f565147cb | |||
| f8a02f5d9d | |||
| 327dc31e62 | |||
| f77a163341 | |||
| c280d172b1 | |||
| b860a25c82 | |||
| ab2b499869 | |||
| 0a55e07326 | |||
| 22cc7cedff | |||
| cdbfd91ec4 | |||
| 9359bab677 | |||
| 0e93f70e38 | |||
| 10905b0447 |
@@ -1,42 +1,4 @@
|
||||
# Update the VARIANT arg in docker-compose.yml to pick an Elixir version: 1.9, 1.10, 1.10.4
|
||||
# Update the VARIANT arg to pick an Elixir version: latest, 1.11.4, etc.
|
||||
ARG VARIANT=latest
|
||||
FROM elixir:${VARIANT}
|
||||
|
||||
# This Dockerfile adds a non-root user with sudo access. Update the “remoteUser” property in
|
||||
# devcontainer.json to use it. More info: https://aka.ms/vscode-remote/containers/non-root-user.
|
||||
ARG USERNAME=vscode
|
||||
ARG USER_UID=1000
|
||||
ARG USER_GID=$USER_UID
|
||||
|
||||
# Options for common package install script
|
||||
ARG INSTALL_ZSH="true"
|
||||
ARG UPGRADE_PACKAGES="true"
|
||||
ARG COMMON_SCRIPT_SOURCE="https://raw.githubusercontent.com/microsoft/vscode-dev-containers/master/script-library/common-debian.sh"
|
||||
ARG COMMON_SCRIPT_SHA="dev-mode"
|
||||
|
||||
# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies.
|
||||
RUN apt-get update \
|
||||
&& export DEBIAN_FRONTEND=noninteractive \
|
||||
&& apt-get -y install --no-install-recommends curl ca-certificates 2>&1 \
|
||||
&& curl -sSL ${COMMON_SCRIPT_SOURCE} -o /tmp/common-setup.sh \
|
||||
&& ([ "${COMMON_SCRIPT_SHA}" = "dev-mode" ] || (echo "${COMMON_SCRIPT_SHA} */tmp/common-setup.sh" | sha256sum -c -)) \
|
||||
&& /bin/bash /tmp/common-setup.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \
|
||||
#
|
||||
# Install dependencies
|
||||
&& apt-get install -y build-essential \
|
||||
#
|
||||
# Clean up
|
||||
&& apt-get autoremove -y \
|
||||
&& apt-get clean -y
|
||||
|
||||
#RUN su ${USERNAME} -c "mix local.hex --force \
|
||||
# && mix local.rebar --force \
|
||||
# && mix archive.install --force hex phx_new ${PHOENIX_VERSION}"
|
||||
|
||||
# [Optional] Uncomment this section to install additional OS packages.
|
||||
# RUN apt-get update \
|
||||
# && export DEBIAN_FRONTEND=noninteractive \
|
||||
# && apt-get -y install --no-install-recommends <your-package-list-here>
|
||||
|
||||
# [Optional] Uncomment this line to install additional package.
|
||||
# RUN mix ...
|
||||
FROM ghcr.io/processone/elixir:${VARIANT}
|
||||
|
||||
@@ -1,16 +1,48 @@
|
||||
{
|
||||
"name": "ejabberd",
|
||||
"dockerComposeFile": "docker-compose.yml",
|
||||
// "dockerComposeFile": "docker-compose.yml",
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile",
|
||||
"args": {
|
||||
"VARIANT": "latest" // 1.11.4
|
||||
}
|
||||
},
|
||||
"workspaceFolder": "/workspace",
|
||||
|
||||
// Set *default* container specific settings.json values on container create.
|
||||
"settings": {
|
||||
"terminal.integrated.shell.linux": "/bin/zsh",
|
||||
"terminal.integrated.defaultProfile.linux": "/bin/zsh",
|
||||
},
|
||||
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
// "extensions": [],
|
||||
"extensions": ["pgourlain.erlang", "jakebecker.elixir-ls"],
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [5222, 5280, 5269],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "sh .devcontainer/post-create.sh",
|
||||
|
||||
// Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
|
||||
"remoteUser": "vscode"
|
||||
"remoteUser": "vscode",
|
||||
"portsAttributes": {
|
||||
"1883": {
|
||||
"label": "MQTT"
|
||||
},
|
||||
"5222": {
|
||||
"label": "XMPP C2S"
|
||||
},
|
||||
"5223": {
|
||||
"label": "Legacy XMPP C2S"
|
||||
},
|
||||
"5269": {
|
||||
"label": "XMPP S2S"
|
||||
},
|
||||
"5280": {
|
||||
"label": "ejabberd HTTP"
|
||||
},
|
||||
"5443": {
|
||||
"label": "ejabberd HTTPS"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
ejabberd:
|
||||
image: ejabberd/ecs
|
||||
ports:
|
||||
- 5222:5222
|
||||
- 5223:5223
|
||||
- 5269:5269
|
||||
- 5280:5280
|
||||
- 1883:1883
|
||||
@@ -6,6 +6,9 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Before creating a ticket, please consider if this should fit the discussion forum better:
|
||||
https://github.com/processone/ejabberd/discussions
|
||||
|
||||
## Environment
|
||||
|
||||
- ejabberd version: 18.09
|
||||
|
||||
@@ -7,6 +7,9 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Before creating a ticket, please consider if this should fit the discussion forum better:
|
||||
https://github.com/processone/ejabberd/discussions
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
FROM alpine:3.15.4 AS build
|
||||
ARG VERSION=master
|
||||
|
||||
RUN apk upgrade --update musl \
|
||||
&& apk add \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
build-base \
|
||||
curl \
|
||||
elixir \
|
||||
erlang-odbc \
|
||||
erlang-reltool \
|
||||
expat-dev \
|
||||
file \
|
||||
gd-dev \
|
||||
git \
|
||||
jpeg-dev \
|
||||
libpng-dev \
|
||||
libwebp-dev \
|
||||
linux-pam-dev \
|
||||
openssl \
|
||||
openssl-dev \
|
||||
sqlite-dev \
|
||||
yaml-dev \
|
||||
zlib-dev
|
||||
|
||||
RUN mix local.hex --force \
|
||||
&& mix local.rebar --force
|
||||
|
||||
WORKDIR ejabberd
|
||||
|
||||
RUN git clone https://github.com/processone/ejabberd.git . \
|
||||
&& git checkout $VERSION \
|
||||
&& mv .github/container/ejabberdctl.template . \
|
||||
&& ./autogen.sh \
|
||||
&& ./configure --with-rebar=mix --enable-all \
|
||||
&& mix deps.get \
|
||||
&& make rel
|
||||
|
||||
RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \
|
||||
&& mkdir -p /opt/ejabberd \
|
||||
&& mv /opt/ejabberd-$VERSION/conf /opt/ejabberd/conf
|
||||
|
||||
RUN DESCRIBE=$(git describe --tags) \
|
||||
&& MIXVER=$(echo $DESCRIBE.0 | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]') \
|
||||
&& mkdir /opt/ejabberd-$VERSION/lib/ejabberd-$MIXVER/priv/bin \
|
||||
&& cp tools/captcha*.sh /opt/ejabberd-$VERSION/lib/ejabberd-$MIXVER/priv/bin/
|
||||
|
||||
RUN export PEM=/opt/ejabberd/conf/server.pem \
|
||||
&& curl -o "/opt/ejabberd/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
|
||||
&& openssl req -x509 \
|
||||
-batch \
|
||||
-nodes \
|
||||
-newkey rsa:4096 \
|
||||
-keyout $PEM \
|
||||
-out $PEM \
|
||||
-days 3650 \
|
||||
-subj "/CN=localhost" \
|
||||
&& sed -i '/^loglevel:/a \ \
|
||||
\nca_file: /opt/ejabberd/conf/cacert.pem \
|
||||
\ncertfiles: \
|
||||
\n - /opt/ejabberd/conf/server.pem' "/opt/ejabberd/conf/ejabberd.yml"
|
||||
|
||||
FROM alpine:3.15.4
|
||||
ENV HOME=/opt/ejabberd
|
||||
|
||||
RUN apk upgrade --update musl \
|
||||
&& apk add \
|
||||
expat \
|
||||
freetds \
|
||||
gd \
|
||||
jpeg \
|
||||
libgd \
|
||||
libpng \
|
||||
libstdc++ \
|
||||
libwebp \
|
||||
linux-pam \
|
||||
ncurses-libs \
|
||||
openssl \
|
||||
sqlite \
|
||||
sqlite-libs \
|
||||
unixodbc \
|
||||
yaml \
|
||||
zlib \
|
||||
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
|
||||
COPY --from=build /opt /opt
|
||||
RUN echo -e \
|
||||
"#!/bin/sh \
|
||||
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
|
||||
\nexport CONFIG_DIR=/opt/ejabberd/conf \
|
||||
\nexport LOGS_DIR=/opt/ejabberd/logs \
|
||||
\nexport SPOOL_DIR=/opt/ejabberd/database \
|
||||
\nexec $(find /opt -name ejabberdctl) \"\$@\"" > /usr/local/bin/ejabberdctl \
|
||||
&& chmod +x /usr/local/bin/ejabberdctl
|
||||
|
||||
RUN addgroup ejabberd -g 9000 \
|
||||
&& adduser -s /bin/sh -D -G ejabberd ejabberd -u 9000 \
|
||||
&& mkdir -p $HOME/conf $HOME/database $HOME/logs $HOME/upload \
|
||||
&& chown -R ejabberd:ejabberd $HOME
|
||||
|
||||
HEALTHCHECK \
|
||||
--interval=5s \
|
||||
--timeout=5s \
|
||||
--start-period=5s \
|
||||
--retries=120 \
|
||||
CMD /usr/local/bin/ejabberdctl status
|
||||
|
||||
WORKDIR $HOME
|
||||
USER ejabberd
|
||||
VOLUME ["$HOME/conf", "$HOME/database", "$HOME/logs", "$HOME/upload"]
|
||||
EXPOSE 1883 4369-4399 5222 5269 5280 5443
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/ejabberdctl"]
|
||||
CMD ["foreground"]
|
||||
Executable
+369
@@ -0,0 +1,369 @@
|
||||
#!/bin/sh
|
||||
|
||||
# define default configuration
|
||||
POLL=true
|
||||
ERL_MAX_PORTS=32000
|
||||
ERL_PROCESSES=250000
|
||||
ERL_MAX_ETS_TABLES=1400
|
||||
FIREWALL_WINDOW=""
|
||||
INET_DIST_INTERFACE=""
|
||||
ERLANG_NODE=ejabberd@localhost
|
||||
|
||||
# define default environment variables
|
||||
[ -z "$SCRIPT" ] && SCRIPT=$0
|
||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
||||
# shellcheck disable=SC2034
|
||||
ERTS_VSN="{{erts_vsn}}"
|
||||
ERL="{{erl}}"
|
||||
IEX="{{bindir}}/iex"
|
||||
EPMD="{{epmd}}"
|
||||
[ -z "$ERLANG_COOKIE" ] && ERL_OPTIONS="-setcookie $(cat "${SCRIPT_DIR%/*}/releases/COOKIE")"
|
||||
[ -n "$ERLANG_COOKIE" ] && [ ! -f "$HOME"/.erlang.cookie ] && echo "$ERLANG_COOKIE" > "$HOME"/.erlang.cookie && chmod 400 "$HOME"/.erlang.cookie
|
||||
|
||||
# check the proper system user is used
|
||||
case $(id -un) in
|
||||
"$INSTALLUSER")
|
||||
EXEC_CMD="as_current_user"
|
||||
;;
|
||||
root)
|
||||
if [ -n "$INSTALLUSER" ] ; then
|
||||
EXEC_CMD="as_install_user"
|
||||
else
|
||||
EXEC_CMD="as_current_user"
|
||||
echo "WARNING: It is not recommended to run ejabberd as root" >&2
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if [ -n "$INSTALLUSER" ] ; then
|
||||
echo "ERROR: This command can only be run by root or the user $INSTALLUSER" >&2
|
||||
exit 7
|
||||
else
|
||||
EXEC_CMD="as_current_user"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# parse command line parameters
|
||||
while [ $# -gt 0 ]; do
|
||||
case $1 in
|
||||
-n|--node) ERLANG_NODE_ARG=$2; shift 2;;
|
||||
-s|--spool) SPOOL_DIR=$2; shift 2;;
|
||||
-l|--logs) LOGS_DIR=$2; shift 2;;
|
||||
-f|--config) EJABBERD_CONFIG_PATH=$2; shift 2;;
|
||||
-c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift 2;;
|
||||
-d|--config-dir) CONFIG_DIR=$2; shift 2;;
|
||||
-t|--no-timeout) NO_TIMEOUT="--no-timeout"; shift;;
|
||||
*) break;;
|
||||
esac
|
||||
done
|
||||
|
||||
# define ejabberd variables if not already defined from the command line
|
||||
: "${CONFIG_DIR:="{{config_dir}}"}"
|
||||
: "${LOGS_DIR:="{{logs_dir}}"}"
|
||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
|
||||
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
|
||||
# Allows passing extra Erlang command-line arguments in vm.args file
|
||||
: "${VMARGS:="$CONFIG_DIR/vm.args"}"
|
||||
# shellcheck source=ejabberdctl.cfg.example
|
||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||
|
||||
# define erl parameters
|
||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||
fi
|
||||
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
||||
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
||||
if [ -n "$INET_DIST_INTERFACE2" ] ; then
|
||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
||||
fi
|
||||
fi
|
||||
# if vm.args file exists in config directory, pass it to Erlang VM
|
||||
[ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS"
|
||||
ERL_LIBS='{{libdir}}'
|
||||
ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
||||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
||||
|
||||
# define ejabberd parameters
|
||||
EJABBERD_OPTS="$EJABBERD_OPTS\
|
||||
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")"
|
||||
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
||||
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
||||
|
||||
# export global variables
|
||||
export EJABBERD_CONFIG_PATH
|
||||
export EJABBERD_LOG_PATH
|
||||
export EJABBERD_PID_PATH
|
||||
export ERL_CRASH_DUMP
|
||||
export ERL_EPMD_ADDRESS
|
||||
export ERL_INETRC
|
||||
export ERL_MAX_PORTS
|
||||
export ERL_MAX_ETS_TABLES
|
||||
export CONTRIB_MODULES_PATH
|
||||
export CONTRIB_MODULES_CONF_DIR
|
||||
export ERL_LIBS
|
||||
export SCRIPT_DIR
|
||||
|
||||
# run command either directly or via su $INSTALLUSER
|
||||
run_cmd()
|
||||
{
|
||||
case $EXEC_CMD in
|
||||
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
as_current_user) "$@" ;;
|
||||
esac
|
||||
}
|
||||
exec_cmd()
|
||||
{
|
||||
case $EXEC_CMD in
|
||||
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
as_current_user) exec "$@" ;;
|
||||
esac
|
||||
}
|
||||
run_erl()
|
||||
{
|
||||
NODE=$1; shift
|
||||
run_cmd "$ERL" ${S:--}name "$NODE" $ERLANG_OPTS "$@"
|
||||
}
|
||||
exec_erl()
|
||||
{
|
||||
NODE=$1; shift
|
||||
exec_cmd "$ERL" ${S:--}name "$NODE" $ERLANG_OPTS "$@"
|
||||
}
|
||||
exec_iex()
|
||||
{
|
||||
NODE=$1; shift
|
||||
exec_cmd "$IEX" -${S:--}name "$NODE" --erl "$ERLANG_OPTS" "$@"
|
||||
}
|
||||
|
||||
# usage
|
||||
debugwarning()
|
||||
{
|
||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo ""
|
||||
echo "IMPORTANT: we will attempt to attach an INTERACTIVE shell"
|
||||
echo "to an already running ejabberd node."
|
||||
echo "If an ERROR is printed, it means the connection was not successful."
|
||||
echo "You can interact with the ejabberd node if you know how to use it."
|
||||
echo "Please be extremely cautious with your actions,"
|
||||
echo "and exit immediately if you are not completely sure."
|
||||
echo ""
|
||||
echo "To detach this shell from ejabberd, press:"
|
||||
echo " control+c, control+c"
|
||||
echo ""
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
echo "Press return to continue"
|
||||
read -r _
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
livewarning()
|
||||
{
|
||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo ""
|
||||
echo "IMPORTANT: ejabberd is going to start in LIVE (interactive) mode."
|
||||
echo "All log messages will be shown in the command shell."
|
||||
echo "You can interact with the ejabberd node if you know how to use it."
|
||||
echo "Please be extremely cautious with your actions,"
|
||||
echo "and exit immediately if you are not completely sure."
|
||||
echo ""
|
||||
echo "To exit this LIVE mode and stop ejabberd, press:"
|
||||
echo " q(). and press the Enter key"
|
||||
echo ""
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
echo "Press return to continue"
|
||||
read -r _
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
help()
|
||||
{
|
||||
echo ""
|
||||
echo "Commands to start an ejabberd node:"
|
||||
echo " start Start in server mode"
|
||||
echo " foreground Start in server mode (attached)"
|
||||
echo " foreground-quiet Start in server mode (attached), show only critical messages"
|
||||
echo " live Start in interactive mode, with Erlang shell"
|
||||
echo " iexlive Start in interactive mode, with Elixir shell"
|
||||
echo ""
|
||||
echo "Commands to interact with a running ejabberd node:"
|
||||
echo " debug Attach an interactive Erlang shell to a running node"
|
||||
echo " iexdebug Attach an interactive Elixir shell to a running node"
|
||||
echo " etop Attach to a running node and start Erlang Top"
|
||||
echo " ping Send ping to the node, returns pong or pang"
|
||||
echo " started|stopped Wait for the node to fully start|stop"
|
||||
echo ""
|
||||
echo "Optional parameters when starting an ejabberd node:"
|
||||
echo " --config-dir dir Config ejabberd: $CONFIG_DIR"
|
||||
echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH"
|
||||
echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH"
|
||||
echo " --logs dir Directory for logs: $LOGS_DIR"
|
||||
echo " --spool dir Database spool dir: $SPOOL_DIR"
|
||||
echo " --node nodename ejabberd node name: $ERLANG_NODE"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# dynamic node name helper
|
||||
uid()
|
||||
{
|
||||
uuid=$(uuidgen 2>/dev/null)
|
||||
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
|
||||
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
||||
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
|
||||
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
|
||||
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
|
||||
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
|
||||
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
|
||||
}
|
||||
|
||||
# stop epmd if there is no other running node
|
||||
stop_epmd()
|
||||
{
|
||||
"$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null
|
||||
}
|
||||
|
||||
# make sure node not already running and node name unregistered
|
||||
# if all ok, ensure runtime directory exists and make it current directory
|
||||
check_start()
|
||||
{
|
||||
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
||||
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
||||
exit 4
|
||||
}
|
||||
pgrep beam >/dev/null && {
|
||||
echo "ERROR: The ejabberd node '$ERLANG_NODE' is registered,"
|
||||
echo " but no related beam process has been found."
|
||||
echo "Shutdown all other erlang nodes, and call 'epmd -kill'."
|
||||
exit 5
|
||||
}
|
||||
"$EPMD" -kill >/dev/null
|
||||
}
|
||||
}
|
||||
|
||||
post_waiter_fork()
|
||||
{
|
||||
(FIRST_RUN=$FIRST_RUN "$0" post_waiter)&
|
||||
}
|
||||
|
||||
post_waiter_waiting()
|
||||
{
|
||||
$0 started
|
||||
[ -n "$FIRST_RUN" ] && [ -n "$CTL_ON_CREATE" ] && (post_waiter_loop $CTL_ON_CREATE)
|
||||
[ -n "$CTL_ON_START" ] && post_waiter_loop $CTL_ON_START
|
||||
}
|
||||
|
||||
post_waiter_loop()
|
||||
{
|
||||
LIST=$@
|
||||
HEAD=${LIST%% ; *}
|
||||
TAIL=${LIST#* ; }
|
||||
echo ":> ejabberdctl $HEAD"
|
||||
$0 $HEAD
|
||||
[ "$HEAD" = "$TAIL" ] || post_waiter_loop $TAIL
|
||||
}
|
||||
|
||||
# allow sync calls
|
||||
wait_status()
|
||||
{
|
||||
# args: status try delay
|
||||
# return: 0 OK, 1 KO
|
||||
timeout="$2"
|
||||
status=4
|
||||
while [ "$status" -ne "$1" ] ; do
|
||||
sleep "$3"
|
||||
timeout=$((timeout - 1))
|
||||
if [ $timeout -eq 0 ] ; then
|
||||
status="$1"
|
||||
else
|
||||
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
||||
status="$?"
|
||||
fi
|
||||
done
|
||||
[ $timeout -gt 0 ]
|
||||
}
|
||||
|
||||
# ensure we can change current directory to SPOOL_DIR
|
||||
[ -f "$SPOOL_DIR/schema.DAT" ] || FIRST_RUN=true
|
||||
[ -d "$SPOOL_DIR" ] || run_cmd mkdir -p "$SPOOL_DIR"
|
||||
cd "$SPOOL_DIR" || {
|
||||
echo "ERROR: can not access directory $SPOOL_DIR"
|
||||
exit 6
|
||||
}
|
||||
|
||||
# main
|
||||
case $1 in
|
||||
start)
|
||||
check_start
|
||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
|
||||
;;
|
||||
foreground)
|
||||
check_start
|
||||
post_waiter_fork
|
||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput
|
||||
;;
|
||||
foreground-quiet)
|
||||
check_start
|
||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput -ejabberd quiet true
|
||||
;;
|
||||
live)
|
||||
livewarning
|
||||
check_start
|
||||
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS
|
||||
;;
|
||||
debug)
|
||||
debugwarning
|
||||
exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE"
|
||||
;;
|
||||
etop)
|
||||
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
|
||||
-s erlang halt -output text
|
||||
;;
|
||||
iexdebug)
|
||||
debugwarning
|
||||
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
||||
;;
|
||||
iexlive)
|
||||
livewarning
|
||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
|
||||
;;
|
||||
ping)
|
||||
PEER=${2:-$ERLANG_NODE}
|
||||
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
||||
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
||||
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||
-s erlang halt -output text
|
||||
;;
|
||||
started)
|
||||
wait_status 0 30 2 # wait 30x2s before timeout
|
||||
;;
|
||||
stopped)
|
||||
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
||||
;;
|
||||
post_waiter)
|
||||
post_waiter_waiting
|
||||
;;
|
||||
*)
|
||||
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
||||
result=$?
|
||||
case $result in
|
||||
2|3) help;;
|
||||
*) :;;
|
||||
esac
|
||||
exit $result
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,18 @@
|
||||
version: 2
|
||||
|
||||
updates:
|
||||
|
||||
- package-ecosystem: "docker"
|
||||
directory: "/.github/container/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "mix"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
@@ -0,0 +1,281 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
|
||||
jobs:
|
||||
|
||||
tests:
|
||||
name: Tests
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['19.3', '24', '25.0-rc3']
|
||||
include:
|
||||
- otp: '19.3'
|
||||
rebar: 2
|
||||
os: ubuntu-18.04
|
||||
- otp: '24'
|
||||
rebar: 3
|
||||
os: ubuntu-20.04
|
||||
- otp: '25.0-rc3'
|
||||
rebar: 3
|
||||
os: ubuntu-20.04
|
||||
runs-on: ${{ matrix.os }}
|
||||
services:
|
||||
redis:
|
||||
image: redis
|
||||
ports:
|
||||
- 6379:6379
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Test shell scripts
|
||||
if: matrix.otp == 24
|
||||
run: |
|
||||
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
||||
shellcheck tools/captcha.sh
|
||||
shellcheck ejabberd.init.template
|
||||
shellcheck -x ejabberdctl.template
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
uses: ErlGang/setup-erlang@master
|
||||
if: matrix.otp != 24
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- name: Get a compatible Rebar
|
||||
if: matrix.rebar == 2
|
||||
run: |
|
||||
rm rebar
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar
|
||||
chmod +x rebar
|
||||
|
||||
- name: Prepare databases
|
||||
run: |
|
||||
sudo systemctl start mysql.service
|
||||
sudo systemctl start postgresql.service
|
||||
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
|
||||
IDENTIFIED BY 'ejabberd_test';"
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
mysql -u root -proot ejabberd_test < sql/mysql.sql
|
||||
pg_isready
|
||||
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
||||
WITH PASSWORD 'ejabberd_test';"
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -f sql/pg.sql
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
TABLES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Prepare rebar
|
||||
run: |
|
||||
echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2}
|
||||
]}.' >>rebar.config
|
||||
echo '{xref_checks, [deprecated_function_calls, deprecated_functions,
|
||||
locals_not_used, undefined_function_calls, undefined_functions]}.
|
||||
% Disabled: exports_not_used,' >>rebar.config
|
||||
echo '{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab,
|
||||
eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
|
||||
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
|
||||
sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config
|
||||
echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config
|
||||
echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config
|
||||
|
||||
- name: Cache rebar
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
deps/
|
||||
dialyzer/
|
||||
ebin/
|
||||
~/.cache/rebar3/
|
||||
key: ${{matrix.otp}}-${{matrix.rebar}}-${{hashFiles('rebar.config')}}
|
||||
|
||||
- name: Download test logs
|
||||
if: matrix.otp == 24 && github.repository == 'processone/ejabberd'
|
||||
continue-on-error: true
|
||||
run: |
|
||||
mkdir -p _build/test
|
||||
curl -sSL https://github.com/processone/ecil/tarball/gh-pages |
|
||||
tar -C _build/test --strip-components=1 --wildcards -xzf -
|
||||
rm -rf _build/test/logs/last/
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
[[ ${{ matrix.rebar }} = 2 ]] && REBAR=rebar || REBAR=`which rebar3`
|
||||
./configure --with-rebar=$REBAR \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-mssql \
|
||||
--disable-odbc
|
||||
make update
|
||||
make
|
||||
|
||||
- run: make install -s
|
||||
- run: make hooks
|
||||
- run: make options
|
||||
- run: make xref
|
||||
- run: |
|
||||
make dialyzer
|
||||
[ ${{ matrix.rebar }} = 3 ] && true \
|
||||
|| { cat dialyzer/error.log ; test ! -s dialyzer/error.log ; }
|
||||
|
||||
- name: Check Production Release
|
||||
if: matrix.rebar == 3
|
||||
run: |
|
||||
make rel
|
||||
RE=_build/prod/rel/ejabberd
|
||||
$RE/bin/ejabberdctl start
|
||||
$RE/bin/ejabberdctl started
|
||||
$RE/bin/ejabberdctl stop
|
||||
$RE/bin/ejabberdctl stopped
|
||||
cat $RE/logs/ejabberd.log
|
||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
||||
|
||||
- name: Check Development Release
|
||||
if: matrix.rebar == 3
|
||||
run: |
|
||||
make dev
|
||||
RE=_build/dev/rel/ejabberd
|
||||
$RE/bin/ejabberdctl start
|
||||
$RE/bin/ejabberdctl started
|
||||
$RE/bin/ejabberdctl stop
|
||||
$RE/bin/ejabberdctl stopped
|
||||
cat $RE/logs/ejabberd.log
|
||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
||||
|
||||
- name: Run tests (OTP 19.3)
|
||||
if: matrix.otp == '19.3'
|
||||
id: ct2
|
||||
run: make test
|
||||
- name: Run tests
|
||||
if: matrix.otp != '19.3'
|
||||
id: ct
|
||||
run: |
|
||||
(cd priv && ln -sf ../sql)
|
||||
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
|
||||
DATE=`date +%s`
|
||||
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
|
||||
NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT
|
||||
LABEL=`git show -s --format=%s | cut -c 1-30`
|
||||
rebar3 ct --name $NODENAME --label "$LABEL"
|
||||
rebar3 cover
|
||||
|
||||
- name: Check results
|
||||
if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped')
|
||||
id: ctresults
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctresults.outcome == 'failure'
|
||||
run: |
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
|
||||
- name: Send to coveralls
|
||||
if: matrix.otp == 24
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
DIAGNOSTIC=1 rebar3 as test coveralls send
|
||||
curl -v -k https://coveralls.io/webhook \
|
||||
--header "Content-Type: application/json" \
|
||||
--data '{"repo_name":"$GITHUB_REPOSITORY",
|
||||
"repo_token":"$GITHUB_TOKEN",
|
||||
"payload":{"build_num":$GITHUB_RUN_ID,
|
||||
"status":"done"}}'
|
||||
|
||||
- name: Upload test logs
|
||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
publish_dir: _build/test
|
||||
exclude_assets: '.github,lib,plugins'
|
||||
external_repository: processone/ecil
|
||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
||||
keep_files: true
|
||||
|
||||
- name: View ECIL address
|
||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
||||
run: |
|
||||
CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'`
|
||||
echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/"
|
||||
|
||||
- name: Prepare new schema
|
||||
run: |
|
||||
[[ -d logs ]] && rm -rf logs
|
||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
||||
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
mysql -u root -proot ejabberd_test < sql/mysql.new.sql
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -f sql/pg.new.sql
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
TABLES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
|
||||
- run: CT_BACKENDS=mysql,pgsql make test
|
||||
id: ctnewschema
|
||||
- name: Check results
|
||||
if: always() && steps.ctnewschema.outcome != 'skipped'
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctnewschema.outcome != 'skipped'
|
||||
run: |
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
@@ -0,0 +1,68 @@
|
||||
name: Container
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
container:
|
||||
name: Container
|
||||
runs-on: ubuntu-20.04
|
||||
permissions:
|
||||
packages: write
|
||||
steps:
|
||||
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v1.14.1
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Get git describe
|
||||
id: gitdescribe
|
||||
run: echo "::set-output name=ver::$(git describe --tags)"
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v3.8.0
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
labels: |
|
||||
org.opencontainers.image.revision=${{ steps.gitdescribe.outputs.ver }}
|
||||
org.opencontainers.image.licenses=GPL-2.0
|
||||
org.opencontainers.image.vendor=ProcessOne
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v2.10.0
|
||||
with:
|
||||
build-args: |
|
||||
VERSION=${{ steps.gitdescribe.outputs.ver }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
context: .github/container
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
@@ -0,0 +1,84 @@
|
||||
name: Installers
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
|
||||
jobs:
|
||||
binaries:
|
||||
name: Binaries
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cache build directory
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/build/
|
||||
key: ${{runner.os}}-ct-ng-1.25.0-RC2
|
||||
- name: Install prerequisites
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qq install makeself
|
||||
# https://github.com/crosstool-ng/crosstool-ng/blob/master/testing/docker/ubuntu21.10/Dockerfile
|
||||
sudo apt-get -qq install build-essential autoconf bison flex gawk
|
||||
sudo apt-get -qq install help2man libncurses5-dev libtool libtool-bin
|
||||
sudo apt-get -qq install python3-dev texinfo unzip
|
||||
- name: Install FPM
|
||||
run: |
|
||||
gem install --no-document --user-install fpm
|
||||
echo $HOME/.gem/ruby/*/bin >> $GITHUB_PATH
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build binary archives
|
||||
run: CHECK_DEPS=false tools/make-binaries
|
||||
- name: Build DEB and RPM packages
|
||||
run: tools/make-packages
|
||||
- name: Build installers
|
||||
run: tools/make-installers
|
||||
- name: Collect packages
|
||||
run: |
|
||||
mkdir ejabberd-packages
|
||||
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
|
||||
- name: Upload packages
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ejabberd-packages
|
||||
#
|
||||
# Appending the wildcard character ("*") is a trick to make
|
||||
# "ejabberd-packages" the root directory of the uploaded ZIP file:
|
||||
#
|
||||
# https://github.com/actions/upload-artifact#upload-using-multiple-paths-and-exclusions
|
||||
#
|
||||
path: ejabberd-packages*
|
||||
retention-days: 14
|
||||
|
||||
release:
|
||||
name: Release
|
||||
needs: [binaries]
|
||||
runs-on: ubuntu-latest
|
||||
if: github.ref_type == 'tag'
|
||||
steps:
|
||||
- name: Download packages
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ejabberd-packages
|
||||
- name: Draft Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
draft: true
|
||||
files: ejabberd-packages/*
|
||||
@@ -0,0 +1,268 @@
|
||||
name: Runtime
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '*'
|
||||
- '!*.md'
|
||||
- '.github/workflows/runtime.yml'
|
||||
- 'checkouts/**'
|
||||
- 'config/**'
|
||||
- 'lib/**'
|
||||
- 'm4/**'
|
||||
- 'plugins/**'
|
||||
- 'rel/**'
|
||||
pull_request:
|
||||
paths:
|
||||
- '*'
|
||||
- '!*.md'
|
||||
- '.github/workflows/runtime.yml'
|
||||
- 'checkouts/**'
|
||||
- 'config/**'
|
||||
- 'lib/**'
|
||||
- 'm4/**'
|
||||
- 'plugins/**'
|
||||
- 'rel/**'
|
||||
|
||||
jobs:
|
||||
|
||||
rebars:
|
||||
name: Rebars
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['19.3', '21.3', '22.0', '24.3', '25.0-rc3']
|
||||
rebar: ['rebar', 'rebar3']
|
||||
include:
|
||||
- otp: '19.3'
|
||||
os: ubuntu-18.04
|
||||
- otp: '21.3'
|
||||
os: ubuntu-20.04
|
||||
- otp: '22.0'
|
||||
os: ubuntu-20.04
|
||||
- otp: '24.3'
|
||||
os: ubuntu-20.04
|
||||
- otp: '25.0-rc3'
|
||||
os: ubuntu-20.04
|
||||
runs-on: ${{ matrix.os }}
|
||||
container:
|
||||
image: erlang:${{ matrix.otp }}
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
apt-get -qq update
|
||||
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=`which ${{ matrix.rebar }}` \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-odbc
|
||||
make update
|
||||
make
|
||||
|
||||
- run: make xref
|
||||
|
||||
- name: Test rel (rebar2)
|
||||
if: matrix.rebar == 'rebar'
|
||||
run: |
|
||||
make rel
|
||||
rel/ejabberd/bin/ejabberdctl start \
|
||||
&& rel/ejabberd/bin/ejabberdctl started
|
||||
rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
cat rel/ejabberd/logs/*
|
||||
|
||||
- name: Test rel
|
||||
if: matrix.rebar != 'rebar'
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
|
||||
- name: Test dev
|
||||
if: matrix.rebar != 'rebar'
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
|
||||
mix:
|
||||
name: Mix
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['21.3', '22.0', '24.3']
|
||||
elixir: ['1.10.3', '1.11.4', '1.12.3', '1.13.0']
|
||||
exclude:
|
||||
- otp: '21.3'
|
||||
elixir: '1.12.3'
|
||||
- otp: '21.3'
|
||||
elixir: '1.13.0'
|
||||
- otp: '24.3'
|
||||
elixir: '1.10.3'
|
||||
- otp: '24.3'
|
||||
elixir: '1.11.4'
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{matrix.otp}}
|
||||
elixir-version: ${{matrix.elixir}}
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Remove Elixir Matchers
|
||||
run: |
|
||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
||||
echo "::remove-matcher owner=elixir-mixCompileError::"
|
||||
echo "::remove-matcher owner=elixir-mixTestFailure::"
|
||||
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=mix \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-odbc
|
||||
mix deps.get
|
||||
make
|
||||
|
||||
- run: make xref
|
||||
|
||||
- name: Run rel
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
|
||||
- name: Run dev
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
|
||||
- name: Check rel
|
||||
if: always()
|
||||
run: |
|
||||
grep -q '^user1$' registered.log
|
||||
grep -q '^user2$' registered.log
|
||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/prod/ -empty -name error.log)
|
||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/dev/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure()
|
||||
run: |
|
||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/prod/rel/ejabberd/logs/error.log
|
||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/dev/rel/ejabberd/logs/error.log
|
||||
|
||||
mix25:
|
||||
name: Mix 25
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['25.0-rc3']
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
uses: ErlGang/setup-erlang@master
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- name: Get Elixir
|
||||
run: |
|
||||
wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb \
|
||||
&& sudo dpkg -i erlang-solutions_2.0_all.deb
|
||||
sudo apt-get update
|
||||
sudo apt-get install elixir
|
||||
mix local.hex --force
|
||||
mix local.rebar --force
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=mix \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-odbc
|
||||
mix deps.get
|
||||
make
|
||||
|
||||
- run: make xref
|
||||
|
||||
- name: Test rel
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
|
||||
- name: Test dev
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
@@ -1,83 +0,0 @@
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'examples/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- 'sql/**'
|
||||
- 'test/**'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- 'examples/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- 'sql/**'
|
||||
- 'test/**'
|
||||
|
||||
jobs:
|
||||
dialyzer:
|
||||
name: Dialyzer
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
fail-fast: true
|
||||
max-parallel: 1
|
||||
matrix:
|
||||
erlang: ["19.3", "latest"]
|
||||
container:
|
||||
image: erlang:${{ matrix.erlang }}
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Rebar3 cache
|
||||
uses: actions/cache@v2
|
||||
env:
|
||||
cache-name: cache-rebar3-deps
|
||||
with:
|
||||
path: ~/.cache/rebar3/
|
||||
key: rebar3-${{ runner.os }}-erlang-${{ matrix.erlang }}
|
||||
|
||||
- name: System versions
|
||||
run: |
|
||||
uname -a
|
||||
cat /etc/issue
|
||||
erl -version
|
||||
rebar3 version
|
||||
|
||||
- name: Libraries
|
||||
run: |
|
||||
apt-get -qq update
|
||||
apt-get -qq install libgd-dev libpam-dev
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=`which rebar3` \
|
||||
--enable-latest-deps \
|
||||
--enable-all --disable-elixir
|
||||
make
|
||||
|
||||
- name: Hooks
|
||||
run: make hooks
|
||||
|
||||
- name: Options
|
||||
run: make options
|
||||
|
||||
- name: Xref
|
||||
run: |
|
||||
echo "{xref_ignores, [{eldap_filter_yecc, return_error, 2}]}." >>rebar.config
|
||||
echo "{xref_checks, [deprecated_function_calls, deprecated_functions,
|
||||
locals_not_used, undefined_function_calls, undefined_functions]}.
|
||||
% Disabled: exports_not_used," >>rebar.config
|
||||
make xref
|
||||
|
||||
- name: Dialyzer
|
||||
run: |
|
||||
echo "{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab,
|
||||
eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
|
||||
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
|
||||
sqlite3, stringprep, stun, xmpp, yconf]} ]}." >>rebar.config
|
||||
make dialyzer
|
||||
+10
@@ -9,6 +9,7 @@
|
||||
/Makefile
|
||||
/config.log
|
||||
/config.status
|
||||
/config/releases.exs
|
||||
/configure
|
||||
/aclocal.m4
|
||||
/*.cache
|
||||
@@ -17,14 +18,17 @@
|
||||
/ebin/
|
||||
/ejabberd.init
|
||||
/ejabberd.service
|
||||
/ejabberdctl
|
||||
/ejabberdctl.example
|
||||
/rel/ejabberd/
|
||||
/rel/overlays/
|
||||
/src/eldap_filter_yecc.erl
|
||||
/vars.config
|
||||
/dialyzer/
|
||||
/test/*.beam
|
||||
/test/*.ctc
|
||||
/logs/
|
||||
/priv/bin/captcha*sh
|
||||
/priv/sql
|
||||
/rel/ejabberd
|
||||
/_build
|
||||
@@ -32,3 +36,9 @@
|
||||
/.rebar
|
||||
/rebar.lock
|
||||
/log/
|
||||
Mnesia.nonode@nohost/
|
||||
# Binaries created with tools/make-{binaries,installers,packages}:
|
||||
/ejabberd_*.deb
|
||||
/ejabberd-*.rpm
|
||||
/ejabberd-*.run
|
||||
/ejabberd-*.tar.gz
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
disable=SC2016,SC2086,SC2089,SC2090
|
||||
external-sources=true
|
||||
source=ejabberdctl.cfg.example
|
||||
shell=sh
|
||||
-68
@@ -1,68 +0,0 @@
|
||||
language: erlang
|
||||
|
||||
otp_release:
|
||||
- 19.3
|
||||
- 23.1.2
|
||||
|
||||
os: linux
|
||||
|
||||
dist: xenial
|
||||
|
||||
services:
|
||||
- redis
|
||||
- mysql
|
||||
- postgresql
|
||||
|
||||
before_install:
|
||||
- sudo apt-get -qq update
|
||||
- pip install --user coveralls-merge
|
||||
|
||||
install:
|
||||
- sudo apt-get -qq install libexpat1-dev libyaml-dev libpam0g-dev libsqlite3-dev libgd-dev libwebp-dev
|
||||
|
||||
before_script:
|
||||
# Ulimit: See Travis-CI issue report: https://github.com/travis-ci/travis-ci/issues/3328
|
||||
- mysql -u root -e "CREATE USER 'ejabberd_test'@'localhost' IDENTIFIED BY 'ejabberd_test';"
|
||||
- mysql -u root -e "CREATE DATABASE ejabberd_test;"
|
||||
- mysql -u root -e "GRANT ALL ON ejabberd_test.* TO 'ejabberd_test'@'localhost';"
|
||||
- mysql -u root ejabberd_test < sql/mysql.sql
|
||||
- psql -U postgres -c "CREATE USER ejabberd_test WITH PASSWORD 'ejabberd_test';"
|
||||
- psql -U postgres -c "CREATE DATABASE ejabberd_test;"
|
||||
- psql -U postgres ejabberd_test -f sql/pg.sql
|
||||
- psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
- psql -U postgres ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ejabberd_test;"
|
||||
- psql -U postgres ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ejabberd_test;"
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- deps/
|
||||
|
||||
script:
|
||||
- ./autogen.sh
|
||||
- ./configure --prefix=/tmp/ejabberd --enable-all --disable-odbc --disable-elixir
|
||||
- make update
|
||||
- make
|
||||
- make install -s
|
||||
- make xref
|
||||
- ./tools/hook_deps.sh ebin
|
||||
- sed -i -e 's/ct:pal/ct:log/' test/suite.erl
|
||||
- ln -sf ../sql priv/
|
||||
- echo "" >> rebar.config
|
||||
- echo '{ct_extra_params, "-verbosity 20"}.' >> rebar.config
|
||||
- escript ./rebar skip_deps=true ct -v
|
||||
- grep -q 'TEST COMPLETE,.* 0 failed' logs/raw.log
|
||||
- test $(find logs -empty -name error.log)
|
||||
|
||||
after_script:
|
||||
- find logs -name suite.log -exec cat '{}' ';'
|
||||
|
||||
after_failure:
|
||||
- find logs -name exunit.log -exec cat '{}' ';'
|
||||
- find logs -name ejabberd.log -exec cat '{}' ';'
|
||||
- find logs -name suite.log -exec cat '{}' ';' | awk 'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
|
||||
after_success:
|
||||
- coveralls-merge erlang.json
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
+173
-7
@@ -1,8 +1,174 @@
|
||||
# Version 21.12
|
||||
|
||||
Commands
|
||||
- `create_room_with_opts`: Fixed when using SQL storage
|
||||
- `change_room_option`: Add missing fields from config inside `mod_muc_admin:change_options`
|
||||
- piefxis: Fixed arguments of all commands
|
||||
|
||||
Modules
|
||||
- mod_caps: Don't forget caps on XEP-0198 resumption
|
||||
- mod_conversejs: New module to serve a simple page for Converse.js
|
||||
- mod_http_upload_quota: Avoid `max_days` race
|
||||
- mod_muc: Support MUC hats (XEP-0317, conversejs/prosody compatible)
|
||||
- mod_muc: Optimize MucSub processing
|
||||
- mod_muc: Fix exception in mucsub {un}subscription events multicast handler
|
||||
- mod_multicast: Improve and optimize multicast routing code
|
||||
- mod_offline: Allow storing non-composing x:events in offline
|
||||
- mod_ping: Send ping from server, not bare user JID
|
||||
- mod_push: Fix handling of MUC/Sub messages
|
||||
- mod_register: New allow_modules option to restrict registration modules
|
||||
- mod_register_web: Handle unknown host gracefully
|
||||
- mod_register_web: Use mod_register configured restrictions
|
||||
|
||||
PubSub
|
||||
- Add `delete_expired_pubsub_items` command
|
||||
- Add `delete_old_pubsub_items` command
|
||||
- Optimize publishing on large nodes (SQL)
|
||||
- Support unlimited number of items
|
||||
- Support `max_items=max` node configuration
|
||||
- Bump default value for `max_items` limit from 10 to 1000
|
||||
- Use configured `max_items` by default
|
||||
- node_flat: Avoid catch-all clauses for RSM
|
||||
- node_flat_sql: Avoid catch-all clauses for RSM
|
||||
|
||||
SQL
|
||||
- Use `INSERT ... ON CONFLICT` in SQL_UPSERT for PostgreSQL >= 9.5
|
||||
- mod_mam export: assign MUC entries to the MUC service
|
||||
- MySQL: Fix typo when creating index
|
||||
- PgSQL: Add SASL auth support, PostgreSQL 14
|
||||
- PgSQL: Add missing SQL migration for table `push_session`
|
||||
- PgSQL: Fix `vcard_search` definition in pgsql new schema
|
||||
|
||||
Other
|
||||
- `captcha-ng.sh`: "sort -R" command not POSIX, added "shuf" and "cat" as fallback
|
||||
- Make s2s connection table cleanup more robust
|
||||
- Update export/import of scram password to XEP-0227 1.1
|
||||
- Update Jose to 1.11.1 (the last in hex.pm correctly versioned)
|
||||
|
||||
# Version 21.07
|
||||
|
||||
Compilation
|
||||
- Add rebar3 3.15.2 binary
|
||||
- Add support for mix to: `./configure --enable-rebar=mix`
|
||||
- Improved `make rel` to work with rebar3 and mix
|
||||
- Add `make dev` to build a development release with rebar3 or mix
|
||||
- Hex: Add `sql/` and `vars.config` to Hex package files
|
||||
- Hex: Update mix applications list to fix error `p1_utils is listed as both...`
|
||||
- There are so many targets in Makefile... add `make help`
|
||||
- Fix extauth.py failure in test suite with Python 3
|
||||
- Added experimental support for GitHub Codespaces
|
||||
- Switch test service from TravisCI to GitHub Actions
|
||||
|
||||
Commands:
|
||||
- Display extended error message in ejabberdctl
|
||||
- Remove SMP option from ejabberdctl.cfg, `-smp` was removed in OTP 21
|
||||
- `create_room`: After creating room, store in DB if it's persistent
|
||||
- `help`: Major changes in its usage and output
|
||||
- `srg_create`: Update to use `label` parameter instead of `name`
|
||||
|
||||
Modules:
|
||||
- ejabberd_listener: New `send_timeout` option
|
||||
- mod_mix: Improvements to update to 0.14.1
|
||||
- mod_muc_room: Don't leak owner JIDs
|
||||
- mod_multicast: Routing for more MUC packets
|
||||
- mod_multicast: Correctly strip only other bcc addresses
|
||||
- mod_mqtt: Allow shared roster group placeholder in mqtt topic
|
||||
- mod_pubsub: Several fixes when using PubSub with RSM
|
||||
- mod_push: Handle MUC/Sub events correctly
|
||||
- mod_shared_roster: Delete cache after performing change to be sure that in cache will be up to date data
|
||||
- mod_shared_roster: Improve database and caching
|
||||
- mod_shared_roster: Reconfigure cache when options change
|
||||
- mod_vcard: Fix invalid_encoding error when using extended plane characters in vcard
|
||||
- mod_vcard: Update econf:vcard() to generate correct vcard_temp record
|
||||
- WebAdmin: New simple pages to view mnesia tables information and content
|
||||
- WebSocket: Fix typos
|
||||
|
||||
SQL:
|
||||
- MySQL Backend Patch for scram-sha512
|
||||
- SQLite: When exporting for SQLite, use its specific escape options
|
||||
- SQLite: Minor fixes for new_sql_schema support
|
||||
- mod_privacy: Cast as boolean when exporting privacy_list_data to PostgreSQL
|
||||
- mod_mqtt: Add mqtt_pub table definition for MSSQL
|
||||
- mod_shared_roster: Add missing indexes to `sr_group` tables in all SQL databases
|
||||
|
||||
# Version 21.04
|
||||
|
||||
API Commands:
|
||||
- `add_rosteritem/...`: Add argument guards to roster commands
|
||||
- `get_user_subscriptions`: New command for MUC/Sub
|
||||
- `remove_mam_for_user_with_peer`: Fix when removing room archive
|
||||
- `send_message`: Fix bug introduced in ejabberd 21.01
|
||||
- `set_vcard`: Return modules errors
|
||||
|
||||
Build and setup:
|
||||
- Allow ejabberd to be compatible as a dependency for an Erlang project using rebar3
|
||||
- CAPTCHA: New question/answer-based CAPTCHA script
|
||||
- `--enable-lua`: new configure option for luerl instead of --enable-tools
|
||||
- Remove support for HiPE, it was experimental and Erlang/OTP 24 removes it
|
||||
- Update `sql_query` record to handle the Erlang/OTP 24 compiler reports
|
||||
- Updated dependencies to fix Dialyzer warnings
|
||||
|
||||
Miscellaneous:
|
||||
- CAPTCHA: Update `FORM_TYPE` from captcha to register
|
||||
- LDAP: fix eldap certificate verification
|
||||
- MySQL: Fix for "specified key was too long"
|
||||
- Translations: updated the Esperanto, Greek, and Japanese translations
|
||||
- Websocket: Fix PONG responses
|
||||
|
||||
Modules:
|
||||
- `mod_block_strangers`: If stanza is type error, allow it passing
|
||||
- `mod_caps`: Don't request roster when not needed
|
||||
- `mod_caps`: Skip reading roster in one more case
|
||||
- `mod_mam`: Remove `queryid` from MAM fin element
|
||||
- `mod_mqtt`: When deregistering XMPP account, close its MQTT sessions
|
||||
- `mod_muc`: Take in account subscriber's affiliation when checking access to moderated room
|
||||
- `mod_muc`: Use monitors to track online and hard-killed rooms
|
||||
- `mod_muc`: When occupant is banned, remove his subscriptions too
|
||||
- `mod_privacy`: Make fetching roster lazy
|
||||
- `mod_pubsub`: Don't fail on PEP unsubscribe
|
||||
- `mod_pubsub`: Fix `gen_pubsub_node:get_state` return value
|
||||
- `mod_vcard`: Obtain and provide photo type in vCard LDAP
|
||||
|
||||
# Version 21.01
|
||||
|
||||
Miscellaneous changes:
|
||||
- `log_rotate_size` option: Fix handling of ‘infinity’ value
|
||||
- `mod_time`: Fix invalid timezone
|
||||
- Auth JWT: New `check_decoded_jwt` hook runs the default JWT verifier
|
||||
- MUC: Allow non-occupant non-subscribed service admin send private MUC message
|
||||
- MUC: New `max_password` and `max_captcha_whitelist` options
|
||||
- OAuth: New `oauth_cache_rest_failure_life_time` option
|
||||
- PEP: Skip reading pep nodes that we know won’t be requested due to caps
|
||||
- SQL: Add sql script to migrate mysql from old schema to new
|
||||
- SQL: Don’t use REPLACE for upsert when there are “-” fields.
|
||||
- Shared Rosters LDAP: Add multi-domain support (and flexibility)
|
||||
- Sqlite3: Fix dependency version
|
||||
- Stun: Block loopback addresses by default
|
||||
- Several documentation fixes and clarifications
|
||||
|
||||
Commands:
|
||||
- `decide_room`: Use better fallback value for room activity time when skipping room
|
||||
- `delete_old_message`: Fix when using sqlite spool table
|
||||
- `module_install`: Make ext_mod compile module with debug_info flags
|
||||
- `room_unused_*`: Don’t fetch subscribers list
|
||||
- `send_message`: Don’t include empty in messages
|
||||
- `set_room_affiliation`: Validate affiliations
|
||||
|
||||
Running:
|
||||
- Docker: New `Dockerfile` and `devcontainer.json`
|
||||
- New `ejabberdctl foreground-quiet`
|
||||
- Systemd: Allow for listening on privileged ports
|
||||
- Systemd: Integrate nicely with systemd
|
||||
|
||||
Translations:
|
||||
- Moved gettext PO files to a new `ejabberd-po` repository
|
||||
- Improved several translations: Catalan, Chinese, German, Greek, Indonesian, Norwegian, Portuguese (Brazil), Spanish.
|
||||
|
||||
# Version 20.12
|
||||
|
||||
- Add support for `SCRAM-SHA-{256,512}-{PLUS}` authentication
|
||||
- Don't use same value in cache for user don't exist and wrong password
|
||||
- outgoing_s2s_ipv*_address: New options to set ipv4/ipv6 outbound s2s out interface
|
||||
- `outgoing_s2s_ipv*_address`: New options to set ipv4/ipv6 outbound s2s out interface
|
||||
- s2s_send_packet: this hook now filters outgoing s2s stanzas
|
||||
- start_room: new hook runs when a room process is started
|
||||
- check_decoded_jwt: new hook to check decoded JWT after success authentication
|
||||
@@ -10,7 +176,7 @@
|
||||
* Admin
|
||||
- Docker: Fix DB initialization
|
||||
- New sql_odbc_driver option: choose the mssql ODBC driver
|
||||
- Rebar3: Fully supported. Enable with ./configure --with-rebar=/path/to/rebar3
|
||||
- Rebar3: Fully supported. Enable with `./configure --with-rebar=/path/to/rebar3`
|
||||
- systemd: start ejabberd in foreground
|
||||
|
||||
* Modules:
|
||||
@@ -47,7 +213,7 @@
|
||||
- Fix problem with leaving old data when updating shared rosters
|
||||
- Fix edge case that caused failure of resuming old sessions with
|
||||
stream management.
|
||||
- Fix crash when room that was started with loging enabled was later
|
||||
- Fix crash when room that was started with logging enabled was later
|
||||
changed to logging disabled
|
||||
- Increase default shaper limits (this should help with delays for
|
||||
clients that are using jingle)
|
||||
@@ -112,7 +278,7 @@
|
||||
for all backends not only SQL
|
||||
- Add infrastructure for having module documentation directly
|
||||
in individual module source code
|
||||
- Generate man page automaticaly
|
||||
- Generate man page automatically
|
||||
- Implement copy feature in mod_carboncopy
|
||||
|
||||
* Fixes
|
||||
@@ -120,7 +286,7 @@
|
||||
- Fix handling of result in xmlrpc module
|
||||
- Make webadmin work even when accessed through not declared domain
|
||||
- Better error reporting in xmlrpc
|
||||
- Limit ammount of results returned by disco queries to pubsub nodes
|
||||
- Limit amount of results returned by disco queries to pubsub nodes
|
||||
- Improve validation of configured JWT keys
|
||||
- Fix race condition in Redis/SQL startup
|
||||
- Fix loading order of third party modules
|
||||
@@ -221,7 +387,7 @@
|
||||
- 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
|
||||
- Distribute routing of MUC messages across all CPU cores
|
||||
|
||||
* PubSub
|
||||
- Fix pending nodes retrieval for SQL backend
|
||||
@@ -255,7 +421,7 @@
|
||||
- Make static hooks analyzer working again
|
||||
|
||||
* MUC
|
||||
- Service admins are allowed to recreate room even if archiv is nonempty
|
||||
- Service admins are allowed to recreate room even if archive is nonempty
|
||||
- New option user_mucsub_from_muc_archive
|
||||
- Avoid late arrival of get_disco_item response
|
||||
- Handle get_subscribed_rooms call from mod_muc_room pid
|
||||
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
Compile and Install ejabberd
|
||||
============================
|
||||
|
||||
This document explains how to compile and install ejabberd
|
||||
from source code.
|
||||
|
||||
For a more detailed explanation, please check the
|
||||
ejabberd Docs: [Source Code Installation][docs-source].
|
||||
|
||||
[docs-source]: https://docs.ejabberd.im/admin/installation/#source-code
|
||||
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
To compile ejabberd you need:
|
||||
|
||||
- GNU Make
|
||||
- GCC
|
||||
- Libexpat ≥ 1.95
|
||||
- Libyaml ≥ 0.1.4
|
||||
- Erlang/OTP ≥ 19.3
|
||||
- OpenSSL ≥ 1.0.0
|
||||
|
||||
Other optional libraries are:
|
||||
|
||||
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138)
|
||||
- PAM library, for Pluggable Authentication Modules (PAM)
|
||||
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
|
||||
challenges
|
||||
- Elixir ≥ 1.10.3, to support Elixir, and alternative to rebar/rebar3
|
||||
|
||||
If your system splits packages in libraries and development headers,
|
||||
install the development packages too.
|
||||
|
||||
|
||||
Download Source Code
|
||||
--------------------
|
||||
|
||||
There are several ways to obtain the ejabberd source code:
|
||||
|
||||
- Source code archive from [ProcessOne Downloads][p1dl]
|
||||
- Source code package from [ejabberd GitHub Releases][ghr]
|
||||
- Latest development code from [ejabberd Git repository][gitrepo]
|
||||
|
||||
[p1dl]: https://www.process-one.net/en/ejabberd/downloads/
|
||||
[ghr]: https://github.com/processone/ejabberd/releases
|
||||
[gitrepo]: https://github.com/processone/ejabberd
|
||||
|
||||
|
||||
Compile
|
||||
-------
|
||||
|
||||
The general instructions to compile ejabberd are:
|
||||
|
||||
./configure
|
||||
make
|
||||
|
||||
If the source code doesn't contain a `configure` script,
|
||||
first of all install `autoconf` and run this to generate it:
|
||||
|
||||
./autogen.sh
|
||||
|
||||
To configure the compilation, features, install paths...
|
||||
|
||||
./configure --help
|
||||
|
||||
|
||||
Install in the System
|
||||
---------------------
|
||||
|
||||
To install ejabberd in the system, run this with system administrator rights (root user):
|
||||
|
||||
sudo make install
|
||||
|
||||
This will:
|
||||
|
||||
- Install the configuration files in `/etc/ejabberd/`
|
||||
- Install ejabberd binary, header and runtime files in `/lib/ejabberd/`
|
||||
- Install the administration script: `/sbin/ejabberdctl`
|
||||
- Install ejabberd documentation in `/share/doc/ejabberd/`
|
||||
- Create a spool directory: `/var/lib/ejabberd/`
|
||||
- Create a directory for log files: `/var/log/ejabberd/`
|
||||
|
||||
|
||||
Build an OTP Release
|
||||
--------------------
|
||||
|
||||
Instead of installing ejabberd in the system, you can build an OTP release
|
||||
that includes all necessary to run ejabberd in a subdirectory:
|
||||
|
||||
./configure --with-rebar=rebar3
|
||||
make rel
|
||||
|
||||
Or, if you have Elixir available and plan to develop Elixir code:
|
||||
|
||||
./configure --with-rebar=mix
|
||||
make dev
|
||||
|
||||
Check the full list of targets:
|
||||
|
||||
make help
|
||||
|
||||
|
||||
Start ejabberd
|
||||
--------------
|
||||
|
||||
You can use the `ejabberdctl` command line administration script to
|
||||
start and stop ejabberd. Some examples, depending on your installation method:
|
||||
|
||||
- When installed in the system:
|
||||
```
|
||||
ejabberdctl start
|
||||
/sbin/ejabberdctl start
|
||||
```
|
||||
|
||||
- When built an OTP production release:
|
||||
```
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl live
|
||||
```
|
||||
|
||||
- Start interactively without installing or building OTP release:
|
||||
```
|
||||
make relive
|
||||
```
|
||||
+288
@@ -0,0 +1,288 @@
|
||||
|
||||
[](https://github.com/processone/ejabberd/tags)
|
||||
[](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
|
||||
[](https://hub.docker.com/r/ejabberd/ecs/)
|
||||
|
||||
|
||||
ejabberd Container
|
||||
==================
|
||||
|
||||
[ejabberd][home] is an open-source,
|
||||
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
|
||||
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
||||
|
||||
[home]: https://ejabberd.im/
|
||||
[erlang]: https://www.erlang.org/
|
||||
[xmpp]: https://xmpp.org/
|
||||
[mqtt]: https://mqtt.org/
|
||||
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
||||
|
||||
This document explains how to use the
|
||||
[ejabberd container images](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
|
||||
available in the GitHub Container Registry,
|
||||
built using the files in `.github/container/`.
|
||||
|
||||
Alternatively, there are also
|
||||
[ejabberd-ecs Docker images](https://hub.docker.com/r/ejabberd/ecs/)
|
||||
available in Docker Hub,
|
||||
built using the
|
||||
[docker-ejabberd/ecs](https://github.com/processone/docker-ejabberd/tree/master/ecs)
|
||||
repository.
|
||||
|
||||
If you are using a Windows operating system, check the tutorials mentioned in
|
||||
[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/installation/#docker-image).
|
||||
|
||||
|
||||
Start ejabberd
|
||||
--------------
|
||||
|
||||
### With default configuration
|
||||
|
||||
Start ejabberd in a new container:
|
||||
|
||||
```bash
|
||||
docker run --name ejabberd -d -p 5222:5222 ghcr.io/processone/ejabberd
|
||||
```
|
||||
|
||||
That runs the container as a daemon,
|
||||
using ejabberd default configuration file and XMPP domain "localhost".
|
||||
|
||||
Stop the running container:
|
||||
|
||||
```bash
|
||||
docker stop ejabberd
|
||||
```
|
||||
|
||||
Restart the stopped ejabberd container:
|
||||
|
||||
```bash
|
||||
docker restart ejabberd
|
||||
```
|
||||
|
||||
|
||||
### Start with Erlang console attached
|
||||
|
||||
Start ejabberd with an Erlang console attached using the `live` command:
|
||||
|
||||
```bash
|
||||
docker run --name ejabberd -it -p 5222:5222 ghcr.io/processone/ejabberd live
|
||||
```
|
||||
|
||||
That uses the default configuration file and XMPP domain "localhost".
|
||||
|
||||
|
||||
### Start with your configuration and database
|
||||
|
||||
Pass a configuration file as a volume
|
||||
and share the local directory to store database:
|
||||
|
||||
```bash
|
||||
mkdir database
|
||||
chown ejabberd database
|
||||
|
||||
cp ejabberd.yml.example ejabberd.yml
|
||||
|
||||
docker run --name ejabberd -it \
|
||||
-v $(pwd)/ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml \
|
||||
-v $(pwd)/database:/opt/ejabberd/database \
|
||||
-p 5222:5222 ghcr.io/processone/ejabberd live
|
||||
```
|
||||
|
||||
Notice that ejabberd runs in the container with an account named `ejabberd`,
|
||||
and the volumes you mount must grant proper rights to that account.
|
||||
|
||||
|
||||
Next steps
|
||||
----------
|
||||
|
||||
### Register the administrator account
|
||||
|
||||
The default ejabberd configuration does not grant admin privileges
|
||||
to any account,
|
||||
you may want to register a new account in ejabberd
|
||||
and grant it admin rights.
|
||||
|
||||
Register an account using the `ejabberdctl` script:
|
||||
|
||||
```bash
|
||||
docker exec -it ejabberd ejabberdctl register admin localhost passw0rd
|
||||
```
|
||||
|
||||
Then edit conf/ejabberd.yml and add the ACL as explained in
|
||||
[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/installation/#administration-account)
|
||||
|
||||
|
||||
### Check ejabberd log files
|
||||
|
||||
Check the content of the log files inside the container,
|
||||
even if you do not put it on a shared persistent drive:
|
||||
|
||||
```bash
|
||||
docker exec -it ejabberd tail -f logs/ejabberd.log
|
||||
```
|
||||
|
||||
|
||||
### Inspect the container files
|
||||
|
||||
The container uses Alpine Linux. Start a shell inside the container:
|
||||
|
||||
```bash
|
||||
docker exec -it ejabberd sh
|
||||
```
|
||||
|
||||
|
||||
### Open ejabberd debug console
|
||||
|
||||
Open an interactive debug Erlang console attached to a running ejabberd in a running container:
|
||||
|
||||
```bash
|
||||
docker exec -it ejabberd ejabberdctl debug
|
||||
```
|
||||
|
||||
|
||||
### CAPTCHA
|
||||
|
||||
ejabberd includes two example CAPTCHA scripts.
|
||||
If you want to use any of them, first install some additional required libraries:
|
||||
|
||||
```bash
|
||||
docker exec --user root ejabberd apk add imagemagick ghostscript-fonts bash
|
||||
```
|
||||
|
||||
Now update your ejabberd configuration file, for example:
|
||||
```bash
|
||||
docker exec -it ejabberd vi conf/ejabberd.yml
|
||||
```
|
||||
|
||||
and add the required options:
|
||||
```
|
||||
captcha_cmd: /opt/ejabberd-22.04/lib/ejabberd-22.04/priv/bin/captcha.sh
|
||||
captcha_url: https://localhost:5443/captcha
|
||||
```
|
||||
|
||||
Finally, reload the configuration file or restart the container:
|
||||
```bash
|
||||
docker exec ejabberd ejabberdctl reload_config
|
||||
```
|
||||
|
||||
|
||||
Advanced Container Configuration
|
||||
--------------------------------
|
||||
|
||||
### Ports
|
||||
|
||||
This container image exposes the ports:
|
||||
|
||||
- `5222`: The default port for XMPP clients.
|
||||
- `5269`: For XMPP federation. Only needed if you want to communicate with users on other servers.
|
||||
- `5280`: For admin interface.
|
||||
- `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH.
|
||||
- `1883`: Used for MQTT
|
||||
- `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering
|
||||
|
||||
|
||||
### Volumes
|
||||
|
||||
ejabberd produces two types of data: log files and database spool files (Mnesia).
|
||||
This is the kind of data you probably want to store on a persistent or local drive (at least the database).
|
||||
|
||||
The volumes you may want to map:
|
||||
|
||||
- `/opt/ejabberd/conf/`: Directory containing configuration and certificates
|
||||
- `/opt/ejabberd/database/`: Directory containing Mnesia database.
|
||||
You should back up or export the content of the directory to persistent storage
|
||||
(host storage, local storage, any storage plugin)
|
||||
- `/opt/ejabberd/logs/`: Directory containing log files
|
||||
- `/opt/ejabberd/upload/`: Directory containing uploaded files. This should also be backed up.
|
||||
|
||||
All these files are owned by `ejabberd` user inside the container.
|
||||
|
||||
It's possible to install additional ejabberd modules using volumes,
|
||||
[this comment](https://github.com/processone/docker-ejabberd/issues/81#issuecomment-1036115146)
|
||||
explains how to install an additional module using docker-compose.
|
||||
|
||||
|
||||
### Commands on start
|
||||
|
||||
The ejabberdctl script reads the `CTL_ON_CREATE` environment variable
|
||||
the first time the docker container is started,
|
||||
and reads `CTL_ON_START` every time the container is started.
|
||||
Those variables can contain one ejabberdctl command,
|
||||
or several commands separated with the blankspace and `;` characters.
|
||||
|
||||
Example usage (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)):
|
||||
```yaml
|
||||
environment:
|
||||
- CTL_ON_CREATE=register admin localhost asd
|
||||
- CTL_ON_START=stats registeredusers ;
|
||||
check_password admin localhost asd ;
|
||||
status
|
||||
```
|
||||
|
||||
|
||||
### Clustering
|
||||
|
||||
When setting several containers to form a
|
||||
[cluster of ejabberd nodes](https://docs.ejabberd.im/admin/guide/clustering/),
|
||||
each one must have a different
|
||||
[Erlang Node Name](https://docs.ejabberd.im/admin/guide/security/#erlang-node-name)
|
||||
and the same
|
||||
[Erlang Cookie](https://docs.ejabberd.im/admin/guide/security/#erlang-cookie).
|
||||
|
||||
For this you can either:
|
||||
- edit `conf/ejabberdctl.cfg` and set variables `ERLANG_NODE` and `ERLANG_COOKIE`
|
||||
- set the environment variables `ERLANG_NODE_ARG` and `ERLANG_COOKIE`
|
||||
|
||||
Example using environment variables (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)):
|
||||
```yaml
|
||||
environment:
|
||||
- ERLANG_NODE_ARG=ejabberd@node7
|
||||
- ERLANG_COOKIE=dummycookie123
|
||||
```
|
||||
|
||||
|
||||
Generating a Container Image
|
||||
----------------------------
|
||||
|
||||
This container image includes ejabberd as a standalone OTP release built using Elixir.
|
||||
|
||||
That OTP release is configured with:
|
||||
|
||||
- `mix.exs`: Customize ejabberd release
|
||||
- `vars.config`: ejabberd compilation configuration options
|
||||
- `config/runtime.exs`: Customize ejabberd paths
|
||||
- `ejabberd.yml.template`: ejabberd default config file
|
||||
|
||||
Build ejabberd Community Server base image from ejabberd master on GitHub:
|
||||
|
||||
```bash
|
||||
VERSION = master
|
||||
docker build \
|
||||
--build-arg VERSION=$(VERSION) \
|
||||
-t personal/ejabberd:$(VERSION) \
|
||||
.github/container
|
||||
```
|
||||
|
||||
Build ejabberd Community Server base image for a given ejabberd version,
|
||||
both for amd64 and arm64 architectures:
|
||||
|
||||
```bash
|
||||
VERSION = 22.05
|
||||
docker buildx build \
|
||||
--platform=linux/amd64,linux/arm64
|
||||
--build-arg VERSION=$(VERSION) \
|
||||
-t personal/ejabberd:$(VERSION) \
|
||||
.github/container
|
||||
```
|
||||
|
||||
It's also possible to use podman instead of docker, just notice:
|
||||
- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile
|
||||
- It mentions that `healthcheck` is not supported by the Open Container Initiative image format
|
||||
- If you want to start with command `live`, add environment variable `EJABBERD_BYPASS_WARNINGS=true`
|
||||
```bash
|
||||
VERSION = master
|
||||
podman build \
|
||||
--build-arg VERSION=$(VERSION) \
|
||||
-t ja:$(version) \
|
||||
.github/container
|
||||
```
|
||||
+2
-2
@@ -96,10 +96,10 @@ Before you submit your pull request consider the following guidelines:
|
||||
git push origin my-fix-branch
|
||||
```
|
||||
|
||||
* In GitHub, send a pull request to `ejabberd:master`. This will trigger the Travis integration and run the test.
|
||||
* In GitHub, send a pull request to `ejabberd:master`. This will trigger the automated testing.
|
||||
We will also notify you if you have not yet signed the [contribution agreement][cla].
|
||||
|
||||
* If you find that the Travis integration has failed, look into the logs on Travis to find out
|
||||
* If you find that the tests have failed, look into the logs to find out
|
||||
if your changes caused test failures, the commit message was malformed etc. If you find that the
|
||||
tests failed or times out for unrelated reasons, you can ping a team member so that the build can be
|
||||
restarted.
|
||||
|
||||
+129
-34
@@ -1,4 +1,5 @@
|
||||
REBAR = @ESCRIPT@ @rebar@
|
||||
MIX = @rebar@
|
||||
INSTALL = @INSTALL@
|
||||
SED = @SED@
|
||||
ERL = @ERL@
|
||||
@@ -67,12 +68,6 @@ LUADIR = $(PRIVDIR)/lua
|
||||
# /var/lib/ejabberd/
|
||||
SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd
|
||||
|
||||
# /var/lock/ejabberdctl
|
||||
CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl
|
||||
|
||||
# /var/lib/ejabberd/.erlang.cookie
|
||||
COOKIEFILE = $(SPOOLDIR)/.erlang.cookie
|
||||
|
||||
# /var/log/ejabberd/
|
||||
LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd
|
||||
|
||||
@@ -97,16 +92,48 @@ ifneq ($(INSTALLGROUP),)
|
||||
G_USER=-g $(INSTALLGROUP)
|
||||
endif
|
||||
|
||||
IS_REBAR3:=$(shell expr `$(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}'` '>=' 3)
|
||||
ifeq "$(MIX)" "mix"
|
||||
REBAR_VER:=6
|
||||
REBAR_VER_318:=0
|
||||
else
|
||||
REBAR_VER:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}')
|
||||
REBAR_VER_318:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}')
|
||||
endif
|
||||
|
||||
ifeq "$(IS_REBAR3)" "1"
|
||||
ifeq "$(REBAR_VER)" "6"
|
||||
REBAR=$(MIX)
|
||||
SKIPDEPS=
|
||||
LISTDEPS=deps.tree
|
||||
UPDATEDEPS=deps.update
|
||||
DEPSPATTERN="s/.*─ \([a-z0-9_]*\) .*/\1/p;"
|
||||
DEPSBASE=_build
|
||||
DEPSDIR=$(DEPSBASE)/dev/lib
|
||||
GET_DEPS= deps.get
|
||||
CONFIGURE_DEPS=
|
||||
EBINDIR=$(DEPSDIR)/ejabberd/ebin
|
||||
XREFOPTIONS=graph
|
||||
REBARREL=MIX_ENV=prod $(REBAR) release --overwrite
|
||||
REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite
|
||||
RELIVECMD=escript rel/relive.escript && MIX_ENV=dev RELIVE=true iex --name ejabberd@localhost -S mix run
|
||||
else
|
||||
ifeq "$(REBAR_VER)" "3"
|
||||
SKIPDEPS=
|
||||
LISTDEPS=tree
|
||||
ifeq "$(REBAR_VER_318)" "1"
|
||||
UPDATEDEPS=upgrade --all
|
||||
else
|
||||
UPDATEDEPS=upgrade
|
||||
endif
|
||||
DEPSPATTERN="s/ (.*//; /^ / s/.* \([a-z0-9_]*\).*/\1/p;"
|
||||
DEPSBASE=_build
|
||||
DEPSDIR=$(DEPSBASE)/default/lib
|
||||
GET_DEPS= get-deps
|
||||
CONFIGURE_DEPS=$(REBAR) configure-deps
|
||||
EBINDIR=$(DEPSDIR)/ejabberd/ebin
|
||||
XREFOPTIONS=
|
||||
REBARREL=$(REBAR) as prod tar
|
||||
REBARDEV=REBAR_PROFILE=dev $(REBAR) release
|
||||
RELIVECMD=$(REBAR) relive
|
||||
else
|
||||
SKIPDEPS=skip_deps=true
|
||||
LISTDEPS=-q list-deps
|
||||
@@ -114,7 +141,15 @@ else
|
||||
DEPSPATTERN="/ TAG / s/ .*// p; / REV / s/ .*// p; / BRANCH / s/ .*// p;"
|
||||
DEPSBASE=deps
|
||||
DEPSDIR=$(DEPSBASE)
|
||||
GET_DEPS= get-deps
|
||||
CONFIGURE_DEPS=$(REBAR) configure-deps
|
||||
EBINDIR=ebin
|
||||
XREFOPTIONS=
|
||||
REBARREL=$(REBAR) generate
|
||||
REBARDEV=
|
||||
RELIVECMD=@echo "Rebar2 detected... relive not supported.\
|
||||
\nTry: ./configure --with-rebar=./rebar3 ; make relive"
|
||||
endif
|
||||
endif
|
||||
|
||||
all: deps src
|
||||
@@ -125,10 +160,10 @@ $(DEPSDIR)/.got:
|
||||
rm -rf $(DEPSDIR)/.got
|
||||
rm -rf $(DEPSDIR)/.built
|
||||
mkdir -p $(DEPSDIR)
|
||||
$(REBAR) get-deps && :> $(DEPSDIR)/.got
|
||||
$(REBAR) $(GET_DEPS) && :> $(DEPSDIR)/.got
|
||||
|
||||
$(DEPSDIR)/.built: $(DEPSDIR)/.got
|
||||
$(REBAR) configure-deps
|
||||
$(CONFIGURE_DEPS)
|
||||
$(REBAR) compile && :> $(DEPSDIR)/.built
|
||||
|
||||
src: $(DEPSDIR)/.built
|
||||
@@ -140,7 +175,7 @@ update:
|
||||
$(REBAR) $(UPDATEDEPS) && :> $(DEPSDIR)/.got
|
||||
|
||||
xref: all
|
||||
$(REBAR) $(SKIPDEPS) xref
|
||||
$(REBAR) $(SKIPDEPS) xref $(XREFOPTIONS)
|
||||
|
||||
hooks: all
|
||||
tools/hook_deps.sh $(EBINDIR)
|
||||
@@ -212,13 +247,24 @@ $(sort $(call TO_DEST,$(MAIN_DIRS) $(DEPS_DIRS))):
|
||||
$(call TO_DEST,priv/sql/lite.sql): sql/lite.sql $(call TO_DEST,priv/sql)
|
||||
$(INSTALL) -m 644 $< $@
|
||||
|
||||
$(call TO_DEST,priv/sql/lite.new.sql): sql/lite.new.sql $(call TO_DEST,priv/sql)
|
||||
$(INSTALL) -m 644 $< $@
|
||||
|
||||
$(call TO_DEST,priv/bin/captcha.sh): tools/captcha.sh $(call TO_DEST,priv/bin)
|
||||
$(INSTALL) -m 755 $(O_USER) $< $@
|
||||
|
||||
$(call TO_DEST,priv/lua/redis_sm.lua): priv/lua/redis_sm.lua $(call TO_DEST,priv/lua)
|
||||
$(INSTALL) -m 644 $< $@
|
||||
|
||||
copy-files-sub2: $(call TO_DEST,$(DEPS_FILES) $(MAIN_FILES) priv/bin/captcha.sh priv/sql/lite.sql priv/lua/redis_sm.lua)
|
||||
ifeq (@sqlite@,true)
|
||||
SQLITE_FILES = priv/sql/lite.sql priv/sql/lite.new.sql
|
||||
endif
|
||||
|
||||
ifeq (@redis@,true)
|
||||
REDIS_FILES = priv/lua/redis_sm.lua
|
||||
endif
|
||||
|
||||
copy-files-sub2: $(call TO_DEST,$(DEPS_FILES) $(MAIN_FILES) priv/bin/captcha.sh $(SQLITE_FILES) $(REDIS_FILES))
|
||||
|
||||
.PHONY: $(call TO_DEST,$(DEPS_FILES) $(MAIN_DIRS) $(DEPS_DIRS))
|
||||
|
||||
@@ -229,23 +275,46 @@ copy-files:
|
||||
|
||||
copy-files-sub: copy-files-sub2
|
||||
|
||||
install: copy-files
|
||||
relive:
|
||||
$(RELIVECMD)
|
||||
|
||||
relivelibdir=$(shell pwd)/$(DEPSDIR)
|
||||
relivedir=$(shell pwd)/_build/relive
|
||||
iexpath=$(shell which iex)
|
||||
CONFIG_DIR = ${relivedir}/conf
|
||||
SPOOL_DIR = ${relivedir}/database
|
||||
LOGS_DIR = ${relivedir}/logs
|
||||
|
||||
ejabberdctl.relive:
|
||||
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
|
||||
-e "s*{{config_dir}}*${CONFIG_DIR}*g" \
|
||||
-e "s*{{logs_dir}}*${LOGS_DIR}*g" \
|
||||
-e "s*{{spool_dir}}*${SPOOL_DIR}*g" \
|
||||
-e "s*{{bindir}}/iex*$(iexpath)*g" \
|
||||
-e "s*{{bindir}}*@bindir@*g" \
|
||||
-e "s*{{libdir}}*${relivelibdir}*g" \
|
||||
-e "s*{{erl}}*@ERL@*g" \
|
||||
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
||||
> ejabberdctl.relive
|
||||
|
||||
ejabberdctl.example: vars.config
|
||||
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
|
||||
-e "s*{{config_dir}}*${ETCDIR}*g" \
|
||||
-e "s*{{logs_dir}}*${LOGDIR}*g" \
|
||||
-e "s*{{spool_dir}}*${SPOOLDIR}*g" \
|
||||
-e "s*{{bindir}}*@bindir@*g" \
|
||||
-e "s*{{libdir}}*@libdir@*g" \
|
||||
-e "s*{{erl}}*@ERL@*g" \
|
||||
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
||||
> ejabberdctl.example
|
||||
|
||||
install: copy-files ejabberdctl.example
|
||||
#
|
||||
# Configuration files
|
||||
$(INSTALL) -d -m 750 $(G_USER) $(ETCDIR)
|
||||
[ -f $(ETCDIR)/ejabberd.yml ] \
|
||||
&& $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml-new \
|
||||
|| $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml
|
||||
$(SED) -e "s*{{rootdir}}*@prefix@*g" \
|
||||
-e "s*{{installuser}}*@INSTALLUSER@*g" \
|
||||
-e "s*{{bindir}}*@bindir@*g" \
|
||||
-e "s*{{libdir}}*@libdir@*g" \
|
||||
-e "s*{{sysconfdir}}*@sysconfdir@*g" \
|
||||
-e "s*{{localstatedir}}*@localstatedir@*g" \
|
||||
-e "s*{{docdir}}*@docdir@*g" \
|
||||
-e "s*{{erl}}*@ERL@*g" \
|
||||
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
||||
> ejabberdctl.example
|
||||
[ -f $(ETCDIR)/ejabberdctl.cfg ] \
|
||||
&& $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \
|
||||
|| $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg
|
||||
@@ -267,7 +336,8 @@ install: copy-files
|
||||
chmod 755 ejabberd.init
|
||||
#
|
||||
# Service script
|
||||
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" ejabberd.service.template \
|
||||
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
|
||||
-e "s*@installuser@*$(INIT_USER)*g" ejabberd.service.template \
|
||||
> ejabberd.service
|
||||
chmod 644 ejabberd.service
|
||||
#
|
||||
@@ -275,12 +345,6 @@ install: copy-files
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR)
|
||||
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT)
|
||||
chmod -R 750 $(SPOOLDIR)
|
||||
[ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; }
|
||||
#
|
||||
# ejabberdctl lock directory
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(CTLLOCKDIR)
|
||||
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(CTLLOCKDIR) >$(CHOWN_OUTPUT)
|
||||
chmod -R 750 $(CTLLOCKDIR)
|
||||
#
|
||||
# Log directory
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(LOGDIR)
|
||||
@@ -330,7 +394,6 @@ uninstall-all: uninstall-binary
|
||||
rm -rf $(ETCDIR)
|
||||
rm -rf $(EJABBERDDIR)
|
||||
rm -rf $(SPOOLDIR)
|
||||
rm -rf $(CTLLOCKDIR)
|
||||
rm -rf $(LOGDIR)
|
||||
|
||||
clean:
|
||||
@@ -354,15 +417,20 @@ distclean: clean clean-rel
|
||||
rm -f ejabberdctl.example ejabberd.init ejabberd.service
|
||||
[ ! -f ../ChangeLog ] || rm -f ../ChangeLog
|
||||
|
||||
rel: all
|
||||
$(REBAR) generate
|
||||
rel:
|
||||
$(REBARREL)
|
||||
|
||||
DEV_CONFIG = _build/dev/rel/ejabberd/conf/ejabberd.yml
|
||||
|
||||
dev $(DEV_CONFIG):
|
||||
$(REBARDEV)
|
||||
|
||||
TAGS:
|
||||
etags *.erl
|
||||
|
||||
Makefile: Makefile.in
|
||||
|
||||
ifeq "$(IS_REBAR3)" "1"
|
||||
ifeq "$(REBAR_VER)" "3"
|
||||
dialyzer:
|
||||
$(REBAR) dialyzer
|
||||
else
|
||||
@@ -416,3 +484,30 @@ 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 xref hooks options
|
||||
|
||||
help:
|
||||
@echo ""
|
||||
@echo " [all] Compile dependencies and ejabberd"
|
||||
@echo " src Compile ejabberd"
|
||||
@echo " deps Get dependencies"
|
||||
@echo " update Update dependencies' source code"
|
||||
@echo " clean Clean binary files"
|
||||
@echo " distclean Clean completely the development files"
|
||||
@echo ""
|
||||
@echo " install Install ejabberd to /usr/local"
|
||||
@echo " uninstall Uninstall ejabberd (buggy)"
|
||||
@echo " uninstall-all Uninstall also configuration, logs, mnesia... (buggy)"
|
||||
@echo ""
|
||||
@echo " rel Build a production release"
|
||||
@echo " dev Build a development release"
|
||||
@echo " relive Start a live ejabberd in _build/relive/"
|
||||
@echo ""
|
||||
@echo " edoc Generate edoc documentation (unused)"
|
||||
@echo " options Generate ejabberd_option.erl"
|
||||
@echo " translations Extract translation files (requires --enable-tools)"
|
||||
@echo " tags Generate tags file for text editors"
|
||||
@echo ""
|
||||
@echo " dialyzer Run Dialyzer static analyzer"
|
||||
@echo " hooks Run hooks validator"
|
||||
@echo " test Run Common Tests suite"
|
||||
@echo " xref Run cross reference analysis"
|
||||
|
||||
@@ -1,192 +1,128 @@
|
||||
ejabberd Community Edition
|
||||
==========================
|
||||
|
||||
[](https://travis-ci.org/processone/ejabberd)
|
||||
[](https://github.com/processone/ejabberd/actions/workflows/tests.yml)
|
||||
[](https://coveralls.io/github/processone/ejabberd?branch=master)
|
||||
[](https://hosted.weblate.org/projects/ejabberd/ejabberd-po/)
|
||||
[](https://hex.pm/packages/ejabberd)
|
||||
|
||||
ejabberd is a distributed, fault-tolerant technology that allows the creation
|
||||
of large-scale instant messaging applications. The server can reliably support
|
||||
thousands of simultaneous users on a single node and has been designed to
|
||||
provide exceptional standards of fault tolerance. As an open source
|
||||
technology, based on industry-standards, ejabberd can be used to build bespoke
|
||||
solutions very cost effectively.
|
||||
<p align="center">
|
||||
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png"
|
||||
height="216">
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/processone/ejabberd/tags" alt="GitHub tag (latest SemVer)">
|
||||
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=3fb0d2&logoWidth=20" /></a>
|
||||
<a href="https://hex.pm/packages/ejabberd" alt="Hex version">
|
||||
<img src="https://img.shields.io/hexpm/v/ejabberd.svg" /></a>
|
||||
<a href="https://github.com/processone/ejabberd/pkgs/container/ejabberd" alt="GitHub Container">
|
||||
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?label=container&sort=semver" /></a>
|
||||
<a href="https://hub.docker.com/r/ejabberd/ecs/" alt="Docker Image Version (latest semver)">
|
||||
<img src="https://img.shields.io/docker/v/ejabberd/ecs?label=docker" /></a>
|
||||
<a href="https://formulae.brew.sh/formula/ejabberd" alt="homebrew version">
|
||||
<img src="https://img.shields.io/homebrew/v/ejabberd" /></a>
|
||||
<br />
|
||||
<a href="https://github.com/processone/ejabberd/actions/workflows/ci.yml" alt="CI">
|
||||
<img src="https://github.com/processone/ejabberd/actions/workflows/ci.yml/badge.svg" /></a>
|
||||
<a href="https://coveralls.io/github/processone/ejabberd?branch=master" alt="Coverage Status">
|
||||
<img src="https://coveralls.io/repos/github/processone/ejabberd/badge.svg?branch=master "Coverage in coveralls.io"" /></a>
|
||||
<a href="https://hosted.weblate.org/projects/ejabberd/ejabberd-po/" alt="Translation status">
|
||||
<img src="https://hosted.weblate.org/widgets/ejabberd/-/ejabberd-po/svg-badge.svg"" /></a>
|
||||
</p>
|
||||
|
||||
|
||||
Key Features
|
||||
[ejabberd][im] is an open-source,
|
||||
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
|
||||
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
||||
|
||||
Check the features in [ejabberd.im][im], [ejabberd Docs][features],
|
||||
[ejabberd at ProcessOne][p1home], and a list of [supported protocols and XEPs][xeps].
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
- **Cross-platform**
|
||||
ejabberd runs under Microsoft Windows and Unix-derived systems such as
|
||||
Linux, FreeBSD and NetBSD.
|
||||
There are several ways to install ejabberd:
|
||||
|
||||
- **Distributed**
|
||||
You can run ejabberd on a cluster of machines and all of them will serve the
|
||||
same XMPP domain(s). When you need more capacity you can simply add a new
|
||||
cheap node to your cluster. Accordingly, you do not need to buy an expensive
|
||||
high-end machine to support tens of thousands concurrent users.
|
||||
|
||||
- **Fault-tolerant**
|
||||
You can deploy an ejabberd cluster so that all the information required for
|
||||
a properly working service will be replicated permanently on all nodes. This
|
||||
means that if one of the nodes crashes, the others will continue working
|
||||
without disruption. In addition, nodes also can be added or replaced ‘on
|
||||
the fly’.
|
||||
|
||||
- **Administrator-friendly**
|
||||
ejabberd is built on top of the Open Source Erlang. As a result you do not
|
||||
need to install an external database, an external web server, amongst others
|
||||
because everything is already included, and ready to run out of the box.
|
||||
Other administrator benefits include:
|
||||
- Comprehensive documentation.
|
||||
- Straightforward installers for Linux.
|
||||
- Docker packaging to help with deploy / development on Linux, Windows or MacOS.
|
||||
- Deb and RPM packaging to support most Linux distributions.
|
||||
- Web administration.
|
||||
- Shared roster groups.
|
||||
- Command line administration tool.
|
||||
- Can integrate with existing authentication mechanisms.
|
||||
- Capability to send announce messages.
|
||||
|
||||
- **Internationalized**
|
||||
ejabberd leads in internationalization. Hence it is very well suited in a
|
||||
globalized world. Related features are:
|
||||
- Translated to 25 languages.
|
||||
- Support for IDNA.
|
||||
|
||||
- **Open Standards**
|
||||
ejabberd is the first Open Source XMPP server claiming to fully comply to
|
||||
the XMPP standard.
|
||||
- Fully XMPP-compliant.
|
||||
- XML-based protocol.
|
||||
- Many protocols supported.
|
||||
- Source code: compile yourself, see [COMPILE](COMPILE.md)
|
||||
- Installers from [ProcessOne Downloads][p1dl] (run/deb/rpm for x64)
|
||||
- Installers from [ejabberd GitHub Releases][releases] (run/deb/rpm for x64 and arm64)
|
||||
- Container image from [ejabberd Docker Hub][hubecs], see [ecs README][docker-ecs-readme] (for x64)
|
||||
- Container image from [ejabberd Github Packages][packages], see [CONTAINER](CONTAINER.md) (for x64 and arm64)
|
||||
- Using your [Operating System package][osp]
|
||||
- Using the [Homebrew][homebrew] package manager
|
||||
|
||||
|
||||
Additional Features
|
||||
-------------------
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Moreover, ejabberd comes with a wide range of other state-of-the-art features:
|
||||
Please check the [ejabberd Docs][docs] website.
|
||||
|
||||
- **Modularity**
|
||||
- Load only the modules you want.
|
||||
- Extend ejabberd with your own custom modules.
|
||||
When compiling from source code, you can get some help with:
|
||||
|
||||
- **Security**
|
||||
- SASL and STARTTLS for c2s and s2s connections.
|
||||
- STARTTLS and Dialback s2s connections.
|
||||
- Web Admin accessible via HTTPS secure access.
|
||||
./configure --help
|
||||
make help
|
||||
|
||||
- **Databases**
|
||||
- Internal database for fast deployment (Mnesia).
|
||||
- Native MySQL support.
|
||||
- Native PostgreSQL support.
|
||||
- ODBC data storage support.
|
||||
- Microsoft SQL Server support.
|
||||
Once ejabberd is installed, try:
|
||||
|
||||
- **Authentication**
|
||||
- Internal authentication.
|
||||
- PAM, LDAP and ODBC.
|
||||
- External authentication script.
|
||||
|
||||
- **Others**
|
||||
- Support for virtual hosting.
|
||||
- Compressing XML streams with Stream Compression (XEP-0138).
|
||||
- Statistics via Statistics Gathering (XEP-0039).
|
||||
- IPv6 support both for c2s and s2s connections.
|
||||
- Multi-User Chat module with support for clustering and HTML logging.
|
||||
- Users Directory based on users vCards.
|
||||
- Publish-Subscribe component with support for Personal Eventing.
|
||||
- Support for web clients: HTTP Polling and HTTP Binding (BOSH).
|
||||
- Component support: interface with networks such as AIM, ICQ and MSN.
|
||||
|
||||
|
||||
Quickstart guide
|
||||
----------------
|
||||
|
||||
### 0. Requirements
|
||||
|
||||
To compile ejabberd you need:
|
||||
|
||||
- GNU Make.
|
||||
- GCC.
|
||||
- Libexpat ≥ 1.95.
|
||||
- Libyaml ≥ 0.1.4.
|
||||
- Erlang/OTP ≥ 19.3.
|
||||
- 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 and Ghostscript fonts. Optional. For CAPTCHA
|
||||
challenges.
|
||||
|
||||
If your system splits packages in libraries and development headers, you must
|
||||
install the development packages also.
|
||||
|
||||
### 1. Compile and install on *nix systems
|
||||
|
||||
To compile ejabberd, execute the following commands. The first one is only
|
||||
necessary if your source tree didn't come with a `configure` script (In this
|
||||
case you need autoconf installed).
|
||||
|
||||
./autogen.sh
|
||||
./configure
|
||||
make
|
||||
|
||||
To install ejabberd, run this command with system administrator rights (root
|
||||
user):
|
||||
|
||||
sudo make install
|
||||
|
||||
These commands will:
|
||||
|
||||
- Install the configuration files in `/etc/ejabberd/`
|
||||
- Install ejabberd binary, header and runtime files in `/lib/ejabberd/`
|
||||
- Install the administration script: `/sbin/ejabberdctl`
|
||||
- Install ejabberd documentation in `/share/doc/ejabberd/`
|
||||
- Create a spool directory: `/var/lib/ejabberd/`
|
||||
- Create a directory for log files: `/var/log/ejabberd/`
|
||||
|
||||
|
||||
### 2. Start ejabberd
|
||||
|
||||
You can use the `ejabberdctl` command line administration script to
|
||||
start and stop ejabberd. For example:
|
||||
|
||||
ejabberdctl start
|
||||
|
||||
|
||||
For detailed information please refer to the ejabberd Installation and
|
||||
Operation Guide available online and in the `doc` directory of the source
|
||||
tarball.
|
||||
ejabberdctl help
|
||||
man ejabberd.yml
|
||||
|
||||
|
||||
Development
|
||||
-----------
|
||||
|
||||
In order to assist in the development of ejabberd, and particularly the
|
||||
execution of the test suite, a Vagrant environment is available at
|
||||
https://github.com/processone/ejabberd-vagrant-dev.
|
||||
Bug reports and features are tracked using [GitHub Issues][issues],
|
||||
please check [CONTRIBUTING](CONTRIBUTING.md) for details.
|
||||
|
||||
To start ejabberd in development mode from the repository directory, you can
|
||||
type a command like:
|
||||
Translations can be improved online [using Weblate][weblate]
|
||||
or in your local machine as explained in [Localization][localization].
|
||||
|
||||
EJABBERD_CONFIG_PATH=ejabberd.yml erl -pa ebin -pa deps/*/ebin -pa test -pa deps/elixir/lib/*/ebin/ -s ejabberd
|
||||
Documentation for developers is available in [ejabberd docs: Developers][docs-dev].
|
||||
|
||||
Security reports or concerns should preferably be reported privately,
|
||||
please send an email to the address: contact [at] process-one [dot] net
|
||||
or some other method from [ProcessOne Contact][p1contact].
|
||||
|
||||
For commercial offering and support, including [ejabberd Business Edition][p1home]
|
||||
and [Fluux (ejabberd in the Cloud)][fluux], please check [ProcessOne ejabberd page][p1home].
|
||||
|
||||
|
||||
Translation
|
||||
-----------
|
||||
Community
|
||||
---------
|
||||
|
||||
Using any gettext editor, you can improve the translation files found in
|
||||
`priv/msgs/*.po`, and then submit your changes.
|
||||
There are several places to get in touch with other ejabberd developers and administrators:
|
||||
|
||||
Alternatively, a simple way to improve translations is using our Weblate project:
|
||||
https://hosted.weblate.org/projects/ejabberd/ejabberd-po/
|
||||
- [ejabberd XMPP chatroom][muc]: ejabberd@conference.process-one.net
|
||||
- [Mailing list][list]
|
||||
- [GitHub Discussions][discussions]
|
||||
- [Stack Overflow][stackoverflow]
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
License
|
||||
-------
|
||||
|
||||
- Documentation: https://docs.ejabberd.im
|
||||
- Community site: https://www.ejabberd.im
|
||||
- ejabberd commercial offering and support: https://www.process-one.net/en/ejabberd
|
||||
ejabberd is released under the GNU General Public License v2 (see [COPYING](COPYING.md)),
|
||||
and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MIT License.
|
||||
|
||||
|
||||
[discussions]: https://github.com/processone/ejabberd/discussions
|
||||
[docker-ecs-readme]: https://github.com/processone/docker-ejabberd/tree/master/ecs#readme
|
||||
[docs-dev]: https://docs.ejabberd.im/developer/
|
||||
[docs]: https://docs.ejabberd.im
|
||||
[erlang]: https://www.erlang.org/
|
||||
[features]: https://docs.ejabberd.im/admin/introduction/
|
||||
[fluux]: https://fluux.io/
|
||||
[github]: https://github.com/processone/ejabberd
|
||||
[homebrew]: https://docs.ejabberd.im/admin/installation/#homebrew
|
||||
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/
|
||||
[im]: https://ejabberd.im/
|
||||
[issues]: https://github.com/processone/ejabberd/issues
|
||||
[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd
|
||||
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
[mqtt]: https://mqtt.org/
|
||||
[muc]: xmpp:ejabberd@conference.process-one.net
|
||||
[osp]: https://docs.ejabberd.im/admin/installation/#operating-system-packages
|
||||
[p1contact]: https://www.process-one.net/en/company/contact/
|
||||
[p1dl]: https://www.process-one.net/en/ejabberd/downloads/
|
||||
[p1home]: https://www.process-one.net/en/ejabberd/
|
||||
[packages]: https://github.com/processone/ejabberd/pkgs/container/ejabberd
|
||||
[releases]: https://github.com/processone/ejabberd/releases
|
||||
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
||||
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
||||
[weblate]: https://hosted.weblate.org/projects/ejabberd/ejabberd-po/
|
||||
[xeps]: https://www.process-one.net/en/ejabberd/protocols/
|
||||
[xmpp]: https://xmpp.org/
|
||||
|
||||
@@ -19,7 +19,7 @@ init(State) ->
|
||||
{example, "rebar3 configure-deps"}, % How to use the plugin
|
||||
{opts, []}, % list of options understood by the plugin
|
||||
{short_desc, "Explicitly run ./configure for dependencies"},
|
||||
{desc, "A rebar plugin to allow explicitly running ./configure on depdendencies. Useful if dependencies might change prior to compilation when configure is run."}
|
||||
{desc, "A rebar plugin to allow explicitly running ./configure on dependencies. Useful if dependencies might change prior to compilation when configure is run."}
|
||||
]),
|
||||
{ok, rebar_state:add_provider(State, Provider)}.
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
use Mix.Config
|
||||
|
||||
# This is standard path in the context of ejabberd release
|
||||
config :ejabberd,
|
||||
file: "config/ejabberd.yml",
|
||||
log_path: 'log/ejabberd.log'
|
||||
|
||||
# Customize Mnesia directory:
|
||||
config :mnesia,
|
||||
dir: 'database/'
|
||||
@@ -0,0 +1,13 @@
|
||||
import Config
|
||||
|
||||
rootdefault = case System.get_env("RELIVE", "false") do
|
||||
"true" -> "_build/relive"
|
||||
"false" -> ""
|
||||
end
|
||||
|
||||
rootpath = System.get_env("RELEASE_ROOT", rootdefault)
|
||||
config :ejabberd,
|
||||
file: Path.join(rootpath, "conf/ejabberd.yml"),
|
||||
log_path: Path.join(rootpath, 'logs/ejabberd.log')
|
||||
config :mnesia,
|
||||
dir: Path.join(rootpath, 'database/')
|
||||
+31
-34
@@ -1,8 +1,8 @@
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.53)
|
||||
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 0.0` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 22.05` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||
REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)"
|
||||
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
|
||||
|
||||
@@ -19,8 +19,7 @@ fi
|
||||
|
||||
# Checks Erlang runtime and compiler
|
||||
AC_ARG_WITH(erlang,
|
||||
AC_HELP_STRING([--with-erlang=dir],
|
||||
[search for erlang in dir]),
|
||||
AS_HELP_STRING([--with-erlang=dir],[search for erlang in dir]),
|
||||
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_erlang" = "X"; then
|
||||
extra_erl_path=""
|
||||
else
|
||||
@@ -29,8 +28,7 @@ fi
|
||||
])
|
||||
|
||||
AC_ARG_WITH(rebar,
|
||||
AC_HELP_STRING([--with-rebar=bin],
|
||||
[use rebar specified]),
|
||||
AS_HELP_STRING([--with-rebar=bin],[use the rebar/rebar3/mix binary specified]),
|
||||
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_rebar" = "X"; then
|
||||
rebar="rebar"
|
||||
else
|
||||
@@ -70,15 +68,15 @@ AC_CONFIG_FILES([Makefile
|
||||
vars.config])
|
||||
|
||||
AC_ARG_ENABLE(all,
|
||||
[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-lua --enable-tools (useful for Dialyzer checks, default: no)])],
|
||||
[AS_HELP_STRING([--enable-all],[same as --enable-odbc --enable-mssql --enable-mysql --enable-pgsql --enable-sqlite --enable-pam --enable-zlib --enable-redis --enable-elixir --enable-stun --enable-sip --enable-debug --enable-lua --enable-tools (useful for Dialyzer checks, default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) odbc=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true lua=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 lua=false tools=false ;;
|
||||
yes) odbc=true mssql=true mysql=true pgsql=true sqlite=true pam=true zlib=true redis=true elixir=true stun=true sip=true debug=true lua=true tools=true ;;
|
||||
no) odbc=false mssql=false mysql=false pgsql=false sqlite=false pam=false zlib=false redis=false elixir=false stun=false sip=false debug=false lua=false tools=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-all) ;;
|
||||
esac],[])
|
||||
|
||||
AC_ARG_ENABLE(debug,
|
||||
[AC_HELP_STRING([--enable-debug], [enable debug information (default: yes)])],
|
||||
[AS_HELP_STRING([--enable-debug],[enable debug information (default: yes)])],
|
||||
[case "${enableval}" in
|
||||
yes) debug=true ;;
|
||||
no) debug=false ;;
|
||||
@@ -86,7 +84,7 @@ AC_ARG_ENABLE(debug,
|
||||
esac],[if test "x$debug" = "x"; then debug=true; fi])
|
||||
|
||||
AC_ARG_ENABLE(elixir,
|
||||
[AC_HELP_STRING([--enable-elixir], [enable Elixir support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-elixir],[enable Elixir support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) elixir=true ;;
|
||||
no) elixir=false ;;
|
||||
@@ -94,8 +92,7 @@ AC_ARG_ENABLE(elixir,
|
||||
esac],[if test "x$elixir" = "x"; then elixir=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(erlang-version-check,
|
||||
[AC_HELP_STRING([--enable-erlang-version-check],
|
||||
[Check Erlang/OTP version (default: yes)])])
|
||||
[AS_HELP_STRING([--enable-erlang-version-check],[Check Erlang/OTP version (default: yes)])])
|
||||
case "$enable_erlang_version_check" in
|
||||
yes|'')
|
||||
ERLANG_VERSION_CHECK([$REQUIRE_ERLANG_MIN],[$REQUIRE_ERLANG_MAX])
|
||||
@@ -106,7 +103,7 @@ case "$enable_erlang_version_check" in
|
||||
esac
|
||||
|
||||
AC_ARG_ENABLE(full_xml,
|
||||
[AC_HELP_STRING([--enable-full-xml], [use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])],
|
||||
[AS_HELP_STRING([--enable-full-xml],[use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])],
|
||||
[case "${enableval}" in
|
||||
yes) full_xml=true ;;
|
||||
no) full_xml=false ;;
|
||||
@@ -128,7 +125,7 @@ if test "$ENABLEGROUP" != ""; then
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(latest_deps,
|
||||
[AC_HELP_STRING([--enable-latest-deps], [makes rebar use latest commits for dependencies instead of tagged versions (default: no)])],
|
||||
[AS_HELP_STRING([--enable-latest-deps],[makes rebar use latest commits for dependencies instead of tagged versions (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) latest_deps=true ;;
|
||||
no) latest_deps=false ;;
|
||||
@@ -136,7 +133,7 @@ AC_ARG_ENABLE(latest_deps,
|
||||
esac],[if test "x$latest_deps" = "x"; then latest_deps=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(lua,
|
||||
[AC_HELP_STRING([--enable-lua], [enable Lua support, to import from Prosody (default: no)])],
|
||||
[AS_HELP_STRING([--enable-lua],[enable Lua support, to import from Prosody (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) lua=true ;;
|
||||
no) lua=false ;;
|
||||
@@ -144,15 +141,15 @@ AC_ARG_ENABLE(lua,
|
||||
esac],[if test "x$lua" = "x"; then lua=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(mssql,
|
||||
[AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])],
|
||||
[AS_HELP_STRING([--enable-mssql],[use Microsoft SQL Server database (default: no, requires --enable-odbc)])],
|
||||
[case "${enableval}" in
|
||||
yes) db_type=mssql; mssql=true ;;
|
||||
no) db_type=generic; mssql=false ;;
|
||||
yes) mssql=true ;;
|
||||
no) mssql=false ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;;
|
||||
esac],[db_type=generic])
|
||||
esac],[if test "x$mssql" = "x"; then mssql=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(mysql,
|
||||
[AC_HELP_STRING([--enable-mysql], [enable MySQL support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-mysql],[enable MySQL support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) mysql=true ;;
|
||||
no) mysql=false ;;
|
||||
@@ -160,7 +157,7 @@ AC_ARG_ENABLE(mysql,
|
||||
esac],[if test "x$mysql" = "x"; then mysql=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(new_sql_schema,
|
||||
[AC_HELP_STRING([--enable-new-sql-schema], [use new SQL schema (default: no)])],
|
||||
[AS_HELP_STRING([--enable-new-sql-schema],[use new SQL schema by default (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) new_sql_schema=true ;;
|
||||
no) new_sql_schema=false ;;
|
||||
@@ -168,7 +165,7 @@ AC_ARG_ENABLE(new_sql_schema,
|
||||
esac],[new_sql_schema=false])
|
||||
|
||||
AC_ARG_ENABLE(odbc,
|
||||
[AC_HELP_STRING([--enable-odbc], [enable pure ODBC support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-odbc],[enable pure ODBC support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) odbc=true ;;
|
||||
no) odbc=false ;;
|
||||
@@ -176,7 +173,7 @@ AC_ARG_ENABLE(odbc,
|
||||
esac],[if test "x$odbc" = "x"; then odbc=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(pam,
|
||||
[AC_HELP_STRING([--enable-pam], [enable PAM support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-pam],[enable PAM support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) pam=true ;;
|
||||
no) pam=false ;;
|
||||
@@ -184,7 +181,7 @@ AC_ARG_ENABLE(pam,
|
||||
esac],[if test "x$pam" = "x"; then pam=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(pgsql,
|
||||
[AC_HELP_STRING([--enable-pgsql], [enable PostgreSQL support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-pgsql],[enable PostgreSQL support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) pgsql=true ;;
|
||||
no) pgsql=false ;;
|
||||
@@ -192,7 +189,7 @@ AC_ARG_ENABLE(pgsql,
|
||||
esac],[if test "x$pgsql" = "x"; then pgsql=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(redis,
|
||||
[AC_HELP_STRING([--enable-redis], [enable Redis support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-redis],[enable Redis support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) redis=true ;;
|
||||
no) redis=false ;;
|
||||
@@ -200,7 +197,7 @@ AC_ARG_ENABLE(redis,
|
||||
esac],[if test "x$redis" = "x"; then redis=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(roster_gateway_workaround,
|
||||
[AC_HELP_STRING([--enable-roster-gateway-workaround], [turn on workaround for processing gateway subscriptions (default: no)])],
|
||||
[AS_HELP_STRING([--enable-roster-gateway-workaround],[turn on workaround for processing gateway subscriptions (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) roster_gateway_workaround=true ;;
|
||||
no) roster_gateway_workaround=false ;;
|
||||
@@ -208,7 +205,7 @@ AC_ARG_ENABLE(roster_gateway_workaround,
|
||||
esac],[roster_gateway_workaround=false])
|
||||
|
||||
AC_ARG_ENABLE(sip,
|
||||
[AC_HELP_STRING([--enable-sip], [enable SIP support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-sip],[enable SIP support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) sip=true ;;
|
||||
no) sip=false ;;
|
||||
@@ -216,7 +213,7 @@ AC_ARG_ENABLE(sip,
|
||||
esac],[if test "x$sip" = "x"; then sip=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(sqlite,
|
||||
[AC_HELP_STRING([--enable-sqlite], [enable SQLite support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-sqlite],[enable SQLite support (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) sqlite=true ;;
|
||||
no) sqlite=false ;;
|
||||
@@ -224,7 +221,7 @@ AC_ARG_ENABLE(sqlite,
|
||||
esac],[if test "x$sqlite" = "x"; then sqlite=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(stun,
|
||||
[AC_HELP_STRING([--enable-stun], [enable STUN/TURN support (default: yes)])],
|
||||
[AS_HELP_STRING([--enable-stun],[enable STUN/TURN support (default: yes)])],
|
||||
[case "${enableval}" in
|
||||
yes) stun=true ;;
|
||||
no) stun=false ;;
|
||||
@@ -232,7 +229,7 @@ AC_ARG_ENABLE(stun,
|
||||
esac],[if test "x$stun" = "x"; then stun=true; fi])
|
||||
|
||||
AC_ARG_ENABLE(system_deps,
|
||||
[AC_HELP_STRING([--enable-system-deps], [makes rebar use locally installed dependencies instead of downloading them (default: no)])],
|
||||
[AS_HELP_STRING([--enable-system-deps],[makes rebar use locally installed dependencies instead of downloading them (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) system_deps=true ;;
|
||||
no) system_deps=false ;;
|
||||
@@ -240,7 +237,7 @@ AC_ARG_ENABLE(system_deps,
|
||||
esac],[if test "x$system_deps" = "x"; then system_deps=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(tools,
|
||||
[AC_HELP_STRING([--enable-tools], [build development tools (default: no)])],
|
||||
[AS_HELP_STRING([--enable-tools],[build development tools (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) tools=true ;;
|
||||
no) tools=false ;;
|
||||
@@ -262,7 +259,7 @@ if test "$ENABLEUSER" != ""; then
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(zlib,
|
||||
[AC_HELP_STRING([--enable-zlib], [enable Stream Compression (XEP-0138) using zlib (default: yes)])],
|
||||
[AS_HELP_STRING([--enable-zlib],[enable Stream Compression (XEP-0138) using zlib (default: yes)])],
|
||||
[case "${enableval}" in
|
||||
yes) zlib=true ;;
|
||||
no) zlib=false ;;
|
||||
@@ -286,8 +283,8 @@ esac
|
||||
AC_SUBST(roster_gateway_workaround)
|
||||
AC_SUBST(new_sql_schema)
|
||||
AC_SUBST(full_xml)
|
||||
AC_SUBST(db_type)
|
||||
AC_SUBST(odbc)
|
||||
AC_SUBST(mssql)
|
||||
AC_SUBST(mysql)
|
||||
AC_SUBST(pgsql)
|
||||
AC_SUBST(sqlite)
|
||||
|
||||
@@ -4,8 +4,8 @@ After=network.target
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
User=ejabberd
|
||||
Group=ejabberd
|
||||
User=@installuser@
|
||||
Group=@installuser@
|
||||
LimitNOFILE=65536
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
@@ -12,20 +12,6 @@
|
||||
#
|
||||
#POLL=true
|
||||
|
||||
#.
|
||||
#' SMP: SMP support ([enable|auto|disable])
|
||||
#
|
||||
# Explanation in Erlang/OTP documentation:
|
||||
# enable: starts the Erlang runtime system with SMP support enabled.
|
||||
# This may fail if no runtime system with SMP support is available.
|
||||
# auto: starts the Erlang runtime system with SMP support enabled if it
|
||||
# is available and more than one logical processor are detected.
|
||||
# disable: starts a runtime system without SMP support.
|
||||
#
|
||||
# Default: auto
|
||||
#
|
||||
#SMP=auto
|
||||
|
||||
#.
|
||||
#' ERL_MAX_PORTS: Maximum number of simultaneously open Erlang ports
|
||||
#
|
||||
|
||||
+33
-32
@@ -2,7 +2,6 @@
|
||||
|
||||
# define default configuration
|
||||
POLL=true
|
||||
SMP=auto
|
||||
ERL_MAX_PORTS=32000
|
||||
ERL_PROCESSES=250000
|
||||
ERL_MAX_ETS_TABLES=1400
|
||||
@@ -11,7 +10,10 @@ INET_DIST_INTERFACE=""
|
||||
ERLANG_NODE=ejabberd@localhost
|
||||
|
||||
# define default environment variables
|
||||
SCRIPT_DIR=$(cd "${0%/*}" && pwd)
|
||||
[ -z "$SCRIPT" ] && SCRIPT=$0
|
||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
||||
# shellcheck disable=SC2034
|
||||
ERTS_VSN="{{erts_vsn}}"
|
||||
ERL="{{erl}}"
|
||||
IEX="{{bindir}}/iex"
|
||||
EPMD="{{epmd}}"
|
||||
@@ -48,28 +50,28 @@ while [ $# -gt 0 ]; do
|
||||
-l|--logs) LOGS_DIR=$2; shift 2;;
|
||||
-f|--config) EJABBERD_CONFIG_PATH=$2; shift 2;;
|
||||
-c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift 2;;
|
||||
-d|--config-dir) ETC_DIR=$2; shift 2;;
|
||||
-d|--config-dir) CONFIG_DIR=$2; shift 2;;
|
||||
-t|--no-timeout) NO_TIMEOUT="--no-timeout"; shift;;
|
||||
*) break;;
|
||||
esac
|
||||
done
|
||||
|
||||
# define ejabberd variables if not already defined from the command line
|
||||
: "${ETC_DIR:="{{sysconfdir}}/ejabberd"}"
|
||||
: "${LOGS_DIR:="{{localstatedir}}/log/ejabberd"}"
|
||||
: "${SPOOL_DIR:="{{localstatedir}}/lib/ejabberd"}"
|
||||
: "${EJABBERD_CONFIG_PATH:="$ETC_DIR/ejabberd.yml"}"
|
||||
: "${EJABBERDCTL_CONFIG_PATH:="$ETC_DIR/ejabberdctl.cfg"}"
|
||||
: "${CONFIG_DIR:="{{config_dir}}"}"
|
||||
: "${LOGS_DIR:="{{logs_dir}}"}"
|
||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
|
||||
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
|
||||
# Allows passing extra Erlang command-line arguments in vm.args file
|
||||
: "${VMARGS:="$ETC_DIR/vm.args"}"
|
||||
: "${VMARGS:="$CONFIG_DIR/vm.args"}"
|
||||
# shellcheck source=ejabberdctl.cfg.example
|
||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
||||
: "${EJABBERD_DOC_PATH:="{{docdir}}"}"
|
||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||
|
||||
# define erl parameters
|
||||
ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||
fi
|
||||
@@ -81,9 +83,9 @@ if [ -n "$INET_DIST_INTERFACE" ] ; then
|
||||
fi
|
||||
# if vm.args file exists in config directory, pass it to Erlang VM
|
||||
[ -f "$VMARGS" ] && ERLANG_OPTS="$ERLANG_OPTS -args_file $VMARGS"
|
||||
ERL_LIBS={{libdir}}
|
||||
ERL_LIBS='{{libdir}}'
|
||||
ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
||||
ERL_INETRC="$ETC_DIR"/inetrc
|
||||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
||||
|
||||
# define ejabberd parameters
|
||||
EJABBERD_OPTS="$EJABBERD_OPTS\
|
||||
@@ -95,7 +97,6 @@ EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejab
|
||||
# export global variables
|
||||
export EJABBERD_CONFIG_PATH
|
||||
export EJABBERD_LOG_PATH
|
||||
export EJABBERD_DOC_PATH
|
||||
export EJABBERD_PID_PATH
|
||||
export ERL_CRASH_DUMP
|
||||
export ERL_EPMD_ADDRESS
|
||||
@@ -105,6 +106,7 @@ export ERL_MAX_ETS_TABLES
|
||||
export CONTRIB_MODULES_PATH
|
||||
export CONTRIB_MODULES_CONF_DIR
|
||||
export ERL_LIBS
|
||||
export SCRIPT_DIR
|
||||
|
||||
# run command either directly or via su $INSTALLUSER
|
||||
exec_cmd()
|
||||
@@ -128,14 +130,6 @@ exec_iex()
|
||||
# usage
|
||||
debugwarning()
|
||||
{
|
||||
if [ "$OSTYPE" != "cygwin" ] && [ "$OSTYPE" != "win32" ] ; then
|
||||
if [ "a$TERM" = "a" ] || [ "$TERM" = "dumb" ] ; then
|
||||
echo "Terminal type not supported."
|
||||
echo "You may have to set the TERM environment variable to fix this."
|
||||
exit 8
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo ""
|
||||
@@ -153,7 +147,7 @@ debugwarning()
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
echo "Press return to continue"
|
||||
read -r input
|
||||
read -r _
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
@@ -176,7 +170,7 @@ livewarning()
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
echo "Press return to continue"
|
||||
read -r input
|
||||
read -r _
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
@@ -185,15 +179,21 @@ help()
|
||||
{
|
||||
echo ""
|
||||
echo "Commands to start an ejabberd node:"
|
||||
echo " start Start an ejabberd node in server mode"
|
||||
echo " debug Attach an interactive Erlang shell to a running ejabberd node"
|
||||
echo " iexdebug Attach an interactive Elixir shell to a running ejabberd node"
|
||||
echo " live Start an ejabberd node in live (interactive) mode"
|
||||
echo " iexlive Start an ejabberd node in live (interactive) mode, within an Elixir shell"
|
||||
echo " foreground Start an ejabberd node in server mode (attached)"
|
||||
echo " start Start in server mode"
|
||||
echo " foreground Start in server mode (attached)"
|
||||
echo " foreground-quiet Start in server mode (attached), show only critical messages"
|
||||
echo " live Start in interactive mode, with Erlang shell"
|
||||
echo " iexlive Start in interactive mode, with Elixir shell"
|
||||
echo ""
|
||||
echo "Commands to interact with a running ejabberd node:"
|
||||
echo " debug Attach an interactive Erlang shell to a running node"
|
||||
echo " iexdebug Attach an interactive Elixir shell to a running node"
|
||||
echo " etop Attach to a running node and start Erlang Top"
|
||||
echo " ping Send ping to the node, returns pong or pang"
|
||||
echo " started|stopped Wait for the node to fully start|stop"
|
||||
echo ""
|
||||
echo "Optional parameters when starting an ejabberd node:"
|
||||
echo " --config-dir dir Config ejabberd: $ETC_DIR"
|
||||
echo " --config-dir dir Config ejabberd: $CONFIG_DIR"
|
||||
echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH"
|
||||
echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH"
|
||||
echo " --logs dir Directory for logs: $LOGS_DIR"
|
||||
@@ -206,8 +206,9 @@ help()
|
||||
uid()
|
||||
{
|
||||
uuid=$(uuidgen 2>/dev/null)
|
||||
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
|
||||
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
||||
[ -z "$uuid" ] && uuid=$(printf "%X" "${RANDOM:-$$}$(date +%M%S)")
|
||||
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
|
||||
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
|
||||
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
|
||||
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -51,6 +51,7 @@
|
||||
desc = "" :: string() | '_' | '$3',
|
||||
longdesc = "" :: string() | '_',
|
||||
version = 0 :: integer(),
|
||||
note = "" :: string(),
|
||||
weight = 1 :: integer(),
|
||||
module :: atom() | '_',
|
||||
function :: atom() | '_',
|
||||
@@ -58,6 +59,7 @@
|
||||
policy = restricted :: open | restricted | admin | user,
|
||||
%% access is: [accessRuleName] or [{Module, AccessOption, DefaultAccessRuleName}]
|
||||
access = [] :: [{atom(),atom(),atom()}|atom()],
|
||||
definer = unknown :: atom(),
|
||||
result = {res, rescode} :: rterm() | '_' | '$2',
|
||||
args_rename = [] :: [{atom(),atom()}],
|
||||
args_desc = none :: none | [string()] | '_',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -65,6 +65,7 @@
|
||||
captcha_whitelist = (?SETS):empty() :: gb_sets:set(),
|
||||
mam = false :: boolean(),
|
||||
pubsub = <<"">> :: binary(),
|
||||
enable_hats = false :: boolean(),
|
||||
lang = ejabberd_option:language() :: binary()
|
||||
}).
|
||||
|
||||
@@ -87,6 +88,16 @@
|
||||
nick = <<>> :: binary(),
|
||||
nodes = [] :: [binary()]}).
|
||||
|
||||
-record(muc_subscribers,
|
||||
{subscribers = #{} :: subscribers(),
|
||||
subscriber_nicks = #{} :: subscriber_nicks(),
|
||||
subscriber_nodes = #{} :: subscriber_nodes()
|
||||
}).
|
||||
|
||||
-type subscribers() :: #{ljid() => #subscriber{}}.
|
||||
-type subscriber_nicks() :: #{binary() => [ljid()]}.
|
||||
-type subscriber_nodes() :: #{binary() => subscribers()}.
|
||||
|
||||
-record(activity,
|
||||
{
|
||||
message_time = 0 :: integer(),
|
||||
@@ -106,8 +117,7 @@
|
||||
jid = #jid{} :: jid(),
|
||||
config = #config{} :: config(),
|
||||
users = #{} :: users(),
|
||||
subscribers = #{} :: subscribers(),
|
||||
subscriber_nicks = #{} :: subscriber_nicks(),
|
||||
muc_subscribers = #muc_subscribers{} :: #muc_subscribers{},
|
||||
last_voice_request_time = treap:empty() :: treap:treap(),
|
||||
robots = #{} :: robots(),
|
||||
nicks = #{} :: nicks(),
|
||||
@@ -115,6 +125,7 @@
|
||||
history = #lqueue{} :: lqueue(),
|
||||
subject = [] :: [text()],
|
||||
subject_author = <<"">> :: binary(),
|
||||
hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}},
|
||||
just_created = erlang:system_time(microsecond) :: true | integer(),
|
||||
activity = treap:empty() :: treap:treap(),
|
||||
room_shaper = none :: ejabberd_shaper:shaper(),
|
||||
@@ -126,5 +137,3 @@
|
||||
-type robots() :: #{jid() => {binary(), stanza()}}.
|
||||
-type nicks() :: #{binary() => [ljid()]}.
|
||||
-type affiliations() :: #{ljid() => affiliation() | {affiliation(), binary()}}.
|
||||
-type subscribers() :: #{ljid() => #subscriber{}}.
|
||||
-type subscriber_nicks() :: #{binary() => [ljid()]}.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
%%% RFC 1928 constants.
|
||||
%%%
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%% ejabberd, Copyright (C) 2017-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2017-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||
%%% @copyright (C) 2002-2021 ProcessOne, SARL. All Rights Reserved.
|
||||
%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved.
|
||||
%%%
|
||||
%%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||
%%% you may not use this file except in compliance with the License.
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -23,7 +23,7 @@
|
||||
-define(ERR_EXTENDED(E, C), mod_pubsub:extended_error(E, C)).
|
||||
|
||||
%% The actual limit can be configured with mod_pubsub's option max_items_node
|
||||
-define(MAXITEMS, 10).
|
||||
-define(MAXITEMS, 1000).
|
||||
|
||||
%% this is currently a hard limit.
|
||||
%% Would be nice to have it configurable.
|
||||
|
||||
+538
-111
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,11 @@
|
||||
defmodule Ejabberd.Mixfile do
|
||||
defmodule Ejabberd.MixProject do
|
||||
use Mix.Project
|
||||
|
||||
def project do
|
||||
[app: :ejabberd,
|
||||
version: "21.4.0",
|
||||
version: version(),
|
||||
description: description(),
|
||||
elixir: "~> 1.4",
|
||||
elixir: elixir_required_version(),
|
||||
elixirc_paths: ["lib"],
|
||||
compile_path: ".",
|
||||
compilers: [:asn1] ++ Mix.compilers,
|
||||
@@ -13,10 +13,25 @@ defmodule Ejabberd.Mixfile do
|
||||
erlc_paths: ["asn1", "src"],
|
||||
# Elixir tests are starting the part of ejabberd they need
|
||||
aliases: [test: "test --no-start"],
|
||||
start_permanent: Mix.env() == :prod,
|
||||
language: :erlang,
|
||||
releases: releases(),
|
||||
package: package(),
|
||||
deps: deps()]
|
||||
end
|
||||
|
||||
def version do
|
||||
case config(:vsn) do
|
||||
:false -> "0.0.0" # ./configure wasn't run: vars.config not created
|
||||
'0.0' -> "0.0.0" # the full git repository wasn't downloaded
|
||||
'latest.0' -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest'
|
||||
[_, _, ?., _, _] = x ->
|
||||
head = String.replace(:erlang.list_to_binary(x), ~r/\.0+([0-9])/, ".\\1")
|
||||
<<head::binary, ".0">>
|
||||
vsn -> String.replace(:erlang.list_to_binary(vsn), ~r/\.0+([0-9])/, ".\\1")
|
||||
end
|
||||
end
|
||||
|
||||
def description do
|
||||
"""
|
||||
Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP, MQTT, SIP Server)
|
||||
@@ -25,24 +40,16 @@ defmodule Ejabberd.Mixfile do
|
||||
|
||||
def application do
|
||||
[mod: {:ejabberd_app, []},
|
||||
applications: [:kernel, :stdlib, :sasl, :ssl],
|
||||
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, :yconf,
|
||||
:p1_acme, :idna]
|
||||
extra_applications: [:mix],
|
||||
applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib,
|
||||
:base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose,
|
||||
:p1_utils, :stringprep, :yconf],
|
||||
included_applications: [:mnesia, :os_mon,
|
||||
:cache_tab, :eimp, :mqtree, :p1_acme,
|
||||
:p1_oauth2, :pkix, :xmpp]
|
||||
++ cond_apps()]
|
||||
end
|
||||
|
||||
defp if_function_exported(mod, fun, arity, okResult) do
|
||||
:code.ensure_loaded(mod)
|
||||
if :erlang.function_exported(mod, fun, arity) do
|
||||
okResult
|
||||
else
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
||||
defp if_version_above(ver, okResult) do
|
||||
if :erlang.system_info(:otp_release) > ver do
|
||||
okResult
|
||||
@@ -62,16 +69,19 @@ defmodule Ejabberd.Mixfile do
|
||||
defp erlc_options do
|
||||
# Use our own includes + includes from all dependencies
|
||||
includes = ["include"] ++ deps_include(["fast_xml", "xmpp", "p1_utils"])
|
||||
result = [:debug_info, {:d, :ELIXIR_ENABLED}] ++
|
||||
result = [{:d, :ELIXIR_ENABLED}] ++
|
||||
cond_options() ++
|
||||
Enum.map(includes, fn (path) -> {:i, path} end) ++
|
||||
if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
|
||||
if_version_above('20', [{:d, :HAVE_URI_STRING}]) ++
|
||||
if_version_above('20', [{:d, :HAVE_ERL_ERROR}]) ++
|
||||
if_version_below('21', [{:d, :USE_OLD_HTTP_URI}]) ++
|
||||
if_version_below('22', [{:d, :LAGER}]) ++
|
||||
if_version_below('21', [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
|
||||
if_version_below('23', [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
|
||||
if_version_below('23', [{:d, :USE_OLD_PG2}]) ++
|
||||
if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
|
||||
if_function_exported(:erl_error, :format_exception, 6, [{:d, :HAVE_ERL_ERROR}])
|
||||
if_version_below('24', [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}])
|
||||
defines = for {:d, value} <- result, do: {:d, value}
|
||||
result ++ [{:d, :ALL_DEFS, defines}]
|
||||
end
|
||||
@@ -79,35 +89,30 @@ defmodule Ejabberd.Mixfile do
|
||||
defp cond_options do
|
||||
for {:true, option} <- [{config(:sip), {:d, :SIP}},
|
||||
{config(:stun), {:d, :STUN}},
|
||||
{config(:roster_gateway_workaround), {:d, :ROSTER_GATWAY_WORKAROUND}},
|
||||
{config(:debug), :debug_info},
|
||||
{not config(:debug), {:debug_info, false}},
|
||||
{config(:roster_gateway_workaround), {:d, :ROSTER_GATEWAY_WORKAROUND}},
|
||||
{config(:new_sql_schema), {:d, :NEW_SQL_SCHEMA}}
|
||||
], do:
|
||||
option
|
||||
end
|
||||
|
||||
defp deps do
|
||||
[{:base64url, "~> 0.0.1"},
|
||||
[{:base64url, "~> 1.0"},
|
||||
{:cache_tab, "~> 1.0"},
|
||||
{:distillery, "~> 2.0"},
|
||||
{:eimp, "~> 1.0"},
|
||||
{:esip, "~> 1.0"},
|
||||
{:ex_doc, ">= 0.0.0", only: :dev},
|
||||
{:fast_tls, "~> 1.1"},
|
||||
{:fast_xml, "~> 1.1"},
|
||||
{:fast_yaml, "~> 1.0"},
|
||||
{:idna, "~> 6.0"},
|
||||
{:jiffy, "~> 1.0.5"},
|
||||
{:jose, "~> 1.8"},
|
||||
{:lager, "~> 3.6.0"},
|
||||
{:jiffy, "~> 1.1.1"},
|
||||
{:jose, "~> 1.11.1"},
|
||||
{:mqtree, "~> 1.0"},
|
||||
{:p1_acme, "~> 1.0"},
|
||||
{:p1_mysql, "~> 1.0"},
|
||||
{:p1_oauth2, "~> 0.6"},
|
||||
{:p1_pgsql, "~> 1.1"},
|
||||
{:p1_utils, "~> 1.0"},
|
||||
{:pkix, "~> 1.0"},
|
||||
{:stringprep, "~> 1.0"},
|
||||
{:stun, "~> 1.0"},
|
||||
{:stringprep, ">= 1.0.26"},
|
||||
{:xmpp, "~> 1.5"},
|
||||
{:yconf, "~> 1.0"}]
|
||||
++ cond_deps()
|
||||
@@ -127,26 +132,36 @@ defmodule Ejabberd.Mixfile do
|
||||
|
||||
defp cond_deps do
|
||||
for {:true, dep} <- [{config(:pam), {:epam, "~> 1.0"}},
|
||||
{config(:redis), {:eredis, "~> 1.0"}},
|
||||
{config(:redis), {:eredis, "~> 1.2.0"}},
|
||||
{config(:sip), {:esip, "~> 1.0"}},
|
||||
{config(:zlib), {:ezlib, "~> 1.0"}},
|
||||
{config(:lua), {:luerl, "~> 0.3.1"}},
|
||||
{config(:sqlite), {:sqlite3, "~> 1.1"}}], do:
|
||||
{if_version_below('22', true), {:lager, "~> 3.9.1"}},
|
||||
{config(:lua), {:luerl, "~> 1.0"}},
|
||||
{config(:mysql), {:p1_mysql, "~> 1.0"}},
|
||||
{config(:pgsql), {:p1_pgsql, "~> 1.1"}},
|
||||
{config(:sqlite), {:sqlite3, "~> 1.1"}},
|
||||
{config(:stun), {:stun, "~> 1.0"}}], do:
|
||||
dep
|
||||
end
|
||||
|
||||
defp cond_apps do
|
||||
for {:true, app} <- [{config(:redis), :eredis},
|
||||
for {:true, app} <- [{config(:pam), :epam},
|
||||
{config(:lua), :luerl},
|
||||
{config(:redis), :eredis},
|
||||
{if_version_below('22', true), :lager},
|
||||
{config(:mysql), :p1_mysql},
|
||||
{config(:sip), :esip},
|
||||
{config(:odbc), :odbc},
|
||||
{config(:pgsql), :p1_pgsql},
|
||||
{config(:sqlite), :sqlite3},
|
||||
{config(:zlib), :ezlib}], do:
|
||||
{config(:sqlite), :sqlite3}], do:
|
||||
app
|
||||
end
|
||||
|
||||
defp package do
|
||||
[# These are the default files included in the package
|
||||
files: ["lib", "src", "priv", "mix.exs", "include", "README.md", "COPYING", "rebar.config", "rebar.config.script"],
|
||||
files: ["include", "lib", "priv", "sql", "src",
|
||||
"COPYING", "README.md",
|
||||
"mix.exs", "rebar.config", "rebar.config.script", "vars.config"],
|
||||
maintainers: ["ProcessOne"],
|
||||
licenses: ["GPLv2"],
|
||||
links: %{"Site" => "https://www.ejabberd.im",
|
||||
@@ -169,6 +184,148 @@ defmodule Ejabberd.Mixfile do
|
||||
end
|
||||
end
|
||||
|
||||
defp elixir_required_version do
|
||||
case {Map.get(System.get_env(), "RELIVE", "false"),
|
||||
MapSet.member?(MapSet.new(System.argv()), "release")}
|
||||
do
|
||||
{"true", _} ->
|
||||
case Version.match?(System.version(), "~> 1.11") do
|
||||
false ->
|
||||
IO.puts("ERROR: To use 'make relive', Elixir 1.11.0 or higher is required.")
|
||||
_ -> :ok
|
||||
end
|
||||
"~> 1.11"
|
||||
{_, true} ->
|
||||
case Version.match?(System.version(), "~> 1.10") do
|
||||
false ->
|
||||
IO.puts("ERROR: To build releases, Elixir 1.10.0 or higher is required.")
|
||||
_ -> :ok
|
||||
end
|
||||
case Version.match?(System.version(), "< 1.11.4")
|
||||
and :erlang.system_info(:otp_release) > '23' do
|
||||
true ->
|
||||
IO.puts("ERROR: To build releases with Elixir lower than 1.11.4, Erlang/OTP lower than 24 is required.")
|
||||
_ -> :ok
|
||||
end
|
||||
"~> 1.10"
|
||||
_ ->
|
||||
"~> 1.4"
|
||||
end
|
||||
end
|
||||
|
||||
defp releases do
|
||||
maybe_tar = case Mix.env() do
|
||||
:prod -> [:tar]
|
||||
_ -> []
|
||||
end
|
||||
[
|
||||
ejabberd: [
|
||||
include_executables_for: [:unix],
|
||||
# applications: [runtime_tools: :permanent]
|
||||
steps: [©_extra_files/1, :assemble | maybe_tar]
|
||||
]
|
||||
]
|
||||
end
|
||||
|
||||
defp copy_extra_files(release) do
|
||||
assigns = [
|
||||
version: version(),
|
||||
rootdir: config(:rootdir),
|
||||
installuser: config(:installuser),
|
||||
libdir: config(:libdir),
|
||||
sysconfdir: config(:sysconfdir),
|
||||
localstatedir: config(:localstatedir),
|
||||
config_dir: config(:config_dir),
|
||||
logs_dir: config(:logs_dir),
|
||||
spool_dir: config(:spool_dir),
|
||||
erl: config(:erl),
|
||||
epmd: config(:epmd),
|
||||
bindir: Path.join([config(:release_dir), "releases", version()]),
|
||||
release_dir: config(:release_dir),
|
||||
erts_dir: config(:erts_dir),
|
||||
erts_vsn: "erts-#{release.erts_version}"
|
||||
]
|
||||
ro = "rel/overlays"
|
||||
File.rm_rf(ro)
|
||||
|
||||
# Elixir lower than 1.12.0 don't have System.shell
|
||||
execute = fn(command) ->
|
||||
case function_exported?(System, :shell, 1) do
|
||||
true ->
|
||||
System.shell(command)
|
||||
false ->
|
||||
:os.cmd(to_charlist(command))
|
||||
end
|
||||
end
|
||||
|
||||
# Mix/Elixir lower than 1.11.0 use config/releases.exs instead of runtime.exs
|
||||
case Version.match?(System.version, "~> 1.11") do
|
||||
true ->
|
||||
:ok
|
||||
false ->
|
||||
execute.("cp config/runtime.exs config/releases.exs")
|
||||
end
|
||||
|
||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.template > ejabberdctl.example1")
|
||||
Mix.Generator.copy_template("ejabberdctl.example1", "ejabberdctl.example2", assigns)
|
||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2> ejabberdctl.example2a")
|
||||
Mix.Generator.copy_template("ejabberdctl.example2a", "ejabberdctl.example2b", assigns)
|
||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example3")
|
||||
execute.("sed -e 's|^ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > ejabberdctl.example4")
|
||||
execute.("sed -e 's|^ERLANG_OPTS=\"|ERLANG_OPTS=\"-boot ../releases/#{release.version}/start_clean -boot_var RELEASE_LIB ../lib |' ejabberdctl.example4 > ejabberdctl.example5")
|
||||
execute.("sed -e 's|^INSTALLUSER=|ERL_OPTIONS=\"-setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example5 > ejabberdctl.example6")
|
||||
Mix.Generator.copy_template("ejabberdctl.example6", "#{ro}/bin/ejabberdctl", assigns)
|
||||
File.chmod("#{ro}/bin/ejabberdctl", 0o755)
|
||||
|
||||
File.rm("ejabberdctl.example1")
|
||||
File.rm("ejabberdctl.example2")
|
||||
File.rm("ejabberdctl.example2a")
|
||||
File.rm("ejabberdctl.example2b")
|
||||
File.rm("ejabberdctl.example3")
|
||||
File.rm("ejabberdctl.example4")
|
||||
File.rm("ejabberdctl.example5")
|
||||
File.rm("ejabberdctl.example6")
|
||||
|
||||
suffix = case Mix.env() do
|
||||
:dev ->
|
||||
Mix.Generator.copy_file("test/ejabberd_SUITE_data/ca.pem", "#{ro}/conf/ca.pem")
|
||||
Mix.Generator.copy_file("test/ejabberd_SUITE_data/cert.pem", "#{ro}/conf/cert.pem")
|
||||
".example"
|
||||
_ -> ""
|
||||
end
|
||||
|
||||
Mix.Generator.copy_file("ejabberd.yml.example", "#{ro}/conf/ejabberd.yml#{suffix}")
|
||||
Mix.Generator.copy_file("ejabberdctl.cfg.example", "#{ro}/conf/ejabberdctl.cfg#{suffix}")
|
||||
Mix.Generator.copy_file("inetrc", "#{ro}/conf/inetrc")
|
||||
|
||||
Enum.each(File.ls!("sql"),
|
||||
fn x ->
|
||||
Mix.Generator.copy_file("sql/#{x}", "#{ro}/lib/ejabberd-#{release.version}/priv/sql/#{x}")
|
||||
end)
|
||||
|
||||
File.cp_r!("include", "#{ro}/lib/ejabberd-#{release.version}/include")
|
||||
for {name, details} <- Map.to_list(release.applications) do
|
||||
{_, is_otp_app} = List.keyfind(details, :otp_app?, 0)
|
||||
{_, vsn} = List.keyfind(details, :vsn, 0)
|
||||
{_, path} = List.keyfind(details, :path, 0)
|
||||
source_dir = case is_otp_app do
|
||||
:true -> "#{path}/include"
|
||||
:false -> "deps/#{name}/include"
|
||||
end
|
||||
target_dir = "#{ro}/lib/#{name}-#{vsn}/include"
|
||||
File.exists?(source_dir)
|
||||
&& File.mkdir_p(target_dir)
|
||||
&& File.cp_r!(source_dir, target_dir)
|
||||
end
|
||||
|
||||
case Mix.env() do
|
||||
:dev -> execute.("REL_DIR_TEMP=$PWD/rel/overlays/ rel/setup-dev.sh")
|
||||
_ -> :ok
|
||||
end
|
||||
|
||||
release
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
defmodule Mix.Tasks.Compile.Asn1 do
|
||||
|
||||
@@ -1,40 +1,29 @@
|
||||
%{
|
||||
"artificery": {:hex, :artificery, "0.4.3", "0bc4260f988dcb9dda4b23f9fc3c6c8b99a6220a331534fdf5bf2fd0d4333b02", [:mix], [], "hexpm", "12e95333a30e20884e937abdbefa3e7f5e05609c2ba8cf37b33f000b9ffc0504"},
|
||||
"base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm", "fab09b20e3f5db886725544cbcf875b8e73ec93363954eb8a1a9ed834aa8c1f9"},
|
||||
"cache_tab": {:hex, :cache_tab, "1.0.28", "551beb14325c34aa7e1e5d65e5fdaa1a87b0325393cfaf8641c0068364d84f69", [:rebar3], [{:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "17451084f2cc0a4a6304e12ae5c9ceef13d70ad070c9c406317e80abb7677889"},
|
||||
"distillery": {:hex, :distillery, "2.1.1", "f9332afc2eec8a1a2b86f22429e068ef35f84a93ea1718265e740d90dd367814", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm", "bbc7008b0161a6f130d8d903b5b3232351fccc9c31a991f8fcbf2a12ace22995"},
|
||||
"earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"},
|
||||
"earmark_parser": {:hex, :earmark_parser, "1.4.12", "b245e875ec0a311a342320da0551da407d9d2b65d98f7a9597ae078615af3449", [:mix], [], "hexpm", "711e2cc4d64abb7d566d43f54b78f7dc129308a63bc103fbd88550d2174b3160"},
|
||||
"eimp": {:hex, :eimp, "1.0.20", "4b46fa8623690ba602fc1c509dd5d38bdf7c2188b694064bf144f36be600cf02", [:rebar3], [{:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "531a1d07e5df83f6adf29f9bae93faa227ebfdcd92d2408a28630709eac3e979"},
|
||||
"epam": {:hex, :epam, "1.0.10", "feb9cf1169c8e30609b13bc5f77a0d8213b425997bec1d05dfbccab024fde856", [:rebar3], [], "hexpm", "429a43b876fbef5d1accaadf8177a74933b37e069d6bcc08d74745b8c8f76f71"},
|
||||
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
|
||||
"cache_tab": {:hex, :cache_tab, "1.0.30", "6d35eecfb65fbe5fc85988503a27338d32de01243f3fc8ea3ee7161af08725a4", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6d8a5e00d8f84c42627706a6dbedb02e34d58495f3ed61935c8475ca0531cda0"},
|
||||
"eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"},
|
||||
"epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"},
|
||||
"eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"},
|
||||
"esip": {:hex, :esip, "1.0.42", "ccd1f3aa1e8d7b5ffe51fc5df238b0d36b5f6cde67cef1dab24931ff03a0a836", [:rebar3], [{:fast_tls, "1.1.12", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.0.43", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "87e28b1344543ef9c1b24a60097ae3ceeedba0ff6487f20cdc7be53f087b9a4e"},
|
||||
"ex_doc": {:hex, :ex_doc, "0.24.2", "e4c26603830c1a2286dae45f4412a4d1980e1e89dc779fcd0181ed1d5a05c8d9", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "e134e1d9e821b8d9e4244687fb2ace58d479b67b282de5158333b0d57c6fb7da"},
|
||||
"ezlib": {:hex, :ezlib, "1.0.9", "b17136b48bcf73962446b06d4427b0b6f2be4550bb5190a18a2979640271e244", [:rebar3], [], "hexpm", "fafc60a0de6e982be38f793da7b220b87a0da2969eba8a878351442b35cc2fde"},
|
||||
"fast_tls": {:hex, :fast_tls, "1.1.12", "b11997d96d4306abcd4cdb9ffa77ccfc0f826f64bed77ecaceb48b2dc46b9202", [:rebar3], [{:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "c3d80828f5d985cba4c93660ffbf2c9b9cd831303382b97832dd66429fb16f8a"},
|
||||
"fast_xml": {:hex, :fast_xml, "1.1.46", "bd563e1cdd8a397ed31a6e11f832ea9e4e90f84695104aa92b46224a887fc6ae", [:rebar3], [{:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "2992a0b2fb649879936fd72498e8bf4202e4cc8356295e14ddf17d4220ac8c51"},
|
||||
"fast_yaml": {:hex, :fast_yaml, "1.0.31", "a66d0e678341dc20680aece8e6fd566205a229981b5b3cfa698c66323b728da2", [:rebar3], [{:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8aa129e3384c5aa9f5f1597a1e3321a63a44860f3951f23eeed950bf0ee59643"},
|
||||
"goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"},
|
||||
"esip": {:hex, :esip, "1.0.47", "fdd483ca7e9e46a6d5a62937cbacb147adbe0bdfca5ebc59774cc0a1afa381be", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.2", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "99e703c49e8d325b24cb147c5087151c196406e8572e3a33db95099991fe8f3e"},
|
||||
"ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"},
|
||||
"fast_tls": {:hex, :fast_tls, "1.1.15", "398e7ba1076db139307ebea839428e2836ab682e4dac61d95b4705a26aff06b7", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "ef516aa226de9a4605704c18499284cd4fc115a73bd72490341972ce0c2b4d30"},
|
||||
"fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"},
|
||||
"fast_yaml": {:hex, :fast_yaml, "1.0.33", "5c735da21a4d23b7ed592603b1cd7aba25f91a735d3c0a8df2816d335a8def6e", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "efa60a2acbcd2c2e72eb5e16f1475726b9d88afca3ad6dbb4bc549266863e7c8"},
|
||||
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"},
|
||||
"jiffy": {:hex, :jiffy, "1.0.5", "a69b58faf7123534c20e1b0b7ae97ac52079ca02ed4b6989b4b380179cd63a54", [:rebar3], [], "hexpm", "b617a53f46ae84f20d0c38951367dc947a2cf8cff922aa5c6ac6b64b8b052289"},
|
||||
"jose": {:hex, :jose, "1.9.0", "4167c5f6d06ffaebffd15cdb8da61a108445ef5e85ab8f5a7ad926fdf3ada154", [:mix, :rebar3], [{:base64url, "~> 0.0.1", [hex: :base64url, repo: "hexpm", optional: false]}], "hexpm", "6429c4fee52b2dda7861ee19a4f09c8c1ffa213bee3a1ec187828fde95d447ed"},
|
||||
"lager": {:hex, :lager, "3.6.10", "6172b43ab720ac33914ccd0aeb21fdbdf88213847707d4b91e6af57b2ae5c4d2", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "5d10499461826b79c5abee18bb594b3949cbdf76d9d9fd7e66d0a558137c21c9"},
|
||||
"luerl": {:hex, :luerl, "0.3.1", "5412807630aac1aaf59ffe5a1bc09259c447b4faeb1d3fe2d4ef41b87676cb04", [:rebar3], [], "hexpm", "1bc011c7297e43aec762e53b17ecb15b0ff29f9546cd153110b343cf5b043f5f"},
|
||||
"makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"},
|
||||
"makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"},
|
||||
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
|
||||
"mqtree": {:hex, :mqtree, "1.0.13", "28c9eaa3a63624829c75f606588d584c3434aec3b615df452f5a539a97467f50", [:rebar3], [{:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "2369ecb99b2ae3908e8c5c604ed4b96aab8f930ac1f1225e1c42ec25d6a65cc8"},
|
||||
"nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"},
|
||||
"p1_acme": {:hex, :p1_acme, "1.0.12", "e51a9e178441669ac06fc5f335ed8ef3343fda67ec83bbbf9551c49967d5f401", [:rebar3], [{:idna, "~>6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "~>1.0.5", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "~>1.9.0", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~>1.0.11", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "9a98f523c656b159be3222c9834a07a83cd5f9dc83f8dec9233a457fceef99a6"},
|
||||
"p1_mysql": {:hex, :p1_mysql, "1.0.18", "c636842cc7b56785de383e4ffacc5b74318dae09d9d1447f6eac8b4aac8bd8f4", [:rebar3], [], "hexpm", "4b5e001c554b9a2b9e32885ad43c7cc97d53ef8412d9bbe9491c01997935fbb8"},
|
||||
"p1_oauth2": {:hex, :p1_oauth2, "0.6.9", "07c4527e0af10aa93e4df033f971c64aec01aa0806d6467bb0632f944b3a2309", [:rebar3], [], "hexpm", "924360cd9883cb773ae8166773241e1a9b3a70cad3034e038ab493b40b56d987"},
|
||||
"p1_pgsql": {:hex, :p1_pgsql, "1.1.11", "8769ec7a2c4f480d443b90fdaa02519fbb459aa06c5fa6a99a0fbee683be9f7a", [:rebar3], [], "hexpm", "e4ef71713293717e8ace5fe717ddd63c618179597a6af79156af9be8c3ea851d"},
|
||||
"p1_utils": {:hex, :p1_utils, "1.0.22", "10a70faa665d1f8f6995fa100d068b4d910ee2a0111fa3567e9d6232cbb86f21", [:rebar3], [], "hexpm", "0e49ff5586515e3c44901d6fb06b1473bda492d749f0b1705cbf9d96d4cd5a38"},
|
||||
"pkix": {:hex, :pkix, "1.0.7", "a0b8c9011edeba702d7cb73fecef1eabe3ae89b3dcf4b8f33775e4f17a7a1304", [:rebar3], [], "hexpm", "104a9e0ecd9cc0e579d148a028189a6efe6420b241f3d319d8a65d898a078295"},
|
||||
"sqlite3": {:hex, :sqlite3, "1.1.9", "10090161893843c9839d884855cafbb33c8ee3a2d6597443d66e6f94144dfd79", [:rebar3], [], "hexpm", "148ef74ee796efc13ffc6bb0e7f5feeb050f425e7335ff02c7415ca86819c0d0"},
|
||||
"stringprep": {:hex, :stringprep, "1.0.25", "15062f6020777a51a96488f29ce9a2d83e3195f92fdf27f25acc462dff7d8d82", [:rebar3], [{:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8e0807d94a6927d1c3f8e76d584a2e3cdd9b4bcb02823eaf96629edf2a65b104"},
|
||||
"stun": {:hex, :stun, "1.0.43", "5c58af3b87fde5e85552dfc085d565a8d899ef7bc0c3e97dea0ea45e3daf0a30", [:rebar3], [{:fast_tls, "1.1.12", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6db03005a5f9931dc5c331d923cbe1c06b04f92921b47093dff8e3f0a18d7b36"},
|
||||
"jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"},
|
||||
"jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"},
|
||||
"luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"},
|
||||
"mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"},
|
||||
"p1_acme": {:hex, :p1_acme, "1.0.19", "5c4cb2bf627c526e242a0106eef0015b98b440b1aa03fd29e44c62c6b26cd545", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.13", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "904023023ca1d5785d1f3ba5670676d30abafd52445e4b60236d2571cc7b550c"},
|
||||
"p1_mysql": {:hex, :p1_mysql, "1.0.19", "22f1be58397780a7d580a954e7af66cde32a29dee1a24ab2aa196272fc654a4a", [:rebar3], [], "hexpm", "88f6cdb510e8959c14b6ae84ccda04967e3de239228f859d8341da67949622b1"},
|
||||
"p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"},
|
||||
"p1_pgsql": {:hex, :p1_pgsql, "1.1.18", "db3473d1bba4b45815b05226433fc589a5934190c2afa05fdba45c6a238bf2c6", [:rebar3], [{:xmpp, "1.5.8", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "4a3863a5d59fed9f64fec8497a7d4e3d34edf31932364a74371097da2b25fd46"},
|
||||
"p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"},
|
||||
"pkix": {:hex, :pkix, "1.0.9", "eb20b2715d71a23b4fe7e754dae9281a964b51113d0bba8adf9da72bf9d65ac2", [:rebar3], [], "hexpm", "daab2c09cdd4eda05c9b45a5c00e994a1a5f27634929e1377e2e59b707103e3a"},
|
||||
"sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"},
|
||||
"stringprep": {:hex, :stringprep, "1.0.28", "9a9823d8449309e4e8ca0bdb2547e43d5de4e1d943f23826c25015150b8daa66", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "66df7d1181fec899c824bd8d00253f369103514828db5e04ee1ba7a0a61568e0"},
|
||||
"stun": {:hex, :stun, "1.2.2", "8c61f71c5094c69739dc6b3e916be734ce80c1a15551e00d547115a66e91e5bc", [:rebar3], [{:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "4f54c7b86e2aa413faec35a9fb699048471e1c06a721c53e6ac44b405fd2a3b9"},
|
||||
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"},
|
||||
"xmpp": {:hex, :xmpp, "1.5.3", "d61d8c90ffacd99bea4915c55dcee1829a053d43e0dc33b8ea66bab845cca8ed", [:rebar3], [{:ezlib, "1.0.9", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.12", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.46", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.22", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.25", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "dca72f926769ed512e524b4369c7812095205f39e00b7e8b11530174a10a9d35"},
|
||||
"yconf": {:hex, :yconf, "1.0.11", "081fe70e5d73a74d0bbad91c3876a1be0e84bd8539bba4cefef2d61cd3c92f9e", [:rebar3], [{:fast_yaml, "1.0.31", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "6df4253e2d55592ad56b5cc29edb0981778ddb6656034a8625f70ffe24290a98"},
|
||||
"xmpp": {:hex, :xmpp, "1.5.8", "96c08537a4d7d9695326a01be8162cb980803be4358671b0fd1369ae9c5e05d8", [:rebar3], [{:ezlib, "1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.15", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.49", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.28", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "966a4539dea7331310be809eaccd5d02af5874303a90679d35bee2117f825b4a"},
|
||||
"yconf": {:hex, :yconf, "1.0.13", "25557689f71897e20c8630ae8865ce083437d325e7d5a6f8ee950c7e0e7be4e1", [:rebar3], [{:fast_yaml, "1.0.33", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "3fd478212b3da121229684288f5154c3610ac6b6c3dbbbdd7886737cab82d851"},
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
%% Generated automatically
|
||||
%% DO NOT EDIT: run `make translations` instead
|
||||
%% To improve translations please read:
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (أضف * في نهاية الحقل لمطابقة السلسلة الفرعية)"}.
|
||||
{" has set the subject to: "," حدد الموضوع إلى: "}.
|
||||
{"# participants","# المشاركين"}.
|
||||
{"A description of the node","وصف العقدة"}.
|
||||
{"A Web Page","موقع الكتروني"}.
|
||||
{"'Displayed groups' not added (they do not exist!): ","لم تتم إضافة \"المجموعات المعروضة\" (فهي غير موجودة!): "}.
|
||||
+13
-5
@@ -20,6 +20,7 @@
|
||||
{"Access model","Model d'Accés"}.
|
||||
{"Account doesn't exist","El compte no existeix"}.
|
||||
{"Action on user","Acció en l'usuari"}.
|
||||
{"Add a hat to a user","Afegir un barret a un usuari"}.
|
||||
{"Add Jabber ID","Afegir Jabber ID"}.
|
||||
{"Add New","Afegir nou"}.
|
||||
{"Add User","Afegir usuari"}.
|
||||
@@ -136,6 +137,7 @@
|
||||
{"Elements","Elements"}.
|
||||
{"Email Address","Adreça de correu"}.
|
||||
{"Email","Correu"}.
|
||||
{"Enable hats","Activar barrets"}.
|
||||
{"Enable logging","Habilitar el registre de la conversa"}.
|
||||
{"Enable message archiving","Activar l'emmagatzematge de missatges"}.
|
||||
{"Enabling push without 'node' attribute is not supported","No està suportat activar Push sense l'atribut 'node'"}.
|
||||
@@ -186,6 +188,9 @@
|
||||
{"has been kicked because of an affiliation change","ha sigut expulsat a causa d'un canvi d'afiliació"}.
|
||||
{"has been kicked because the room has been changed to members-only","ha sigut expulsat perquè la sala ara és només per a membres"}.
|
||||
{"has been kicked","ha sigut expulsat"}.
|
||||
{"Hat title","Títol del barret"}.
|
||||
{"Hat URI","URI del barret"}.
|
||||
{"Hats limit exceeded","El límit de tràfic ha sigut sobrepassat"}.
|
||||
{"Host unknown","Host desconegut"}.
|
||||
{"Host","Host"}.
|
||||
{"HTTP File Upload","HTTP File Upload"}.
|
||||
@@ -237,6 +242,8 @@
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Els bits menys significants del hash SHA-256 del text deurien ser iguals a l'etiqueta hexadecimal"}.
|
||||
{"leaves the room","surt de la sala"}.
|
||||
{"List of rooms","Llista de sales"}.
|
||||
{"List of users with hats","Llista d'usuaris amb barrets"}.
|
||||
{"List users with hats","Llista d'usuaris amb barrets"}.
|
||||
{"Logging","Registre"}.
|
||||
{"Low level update script","Script d'actualització de baix nivell"}.
|
||||
{"Make participants list public","Crear una llista de participants pública"}.
|
||||
@@ -249,7 +256,7 @@
|
||||
{"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ç"}.
|
||||
{"Max # of items to persist","Màxim # d'elements que persistixen"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Màxim # d'elements a persistir, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}.
|
||||
{"Max payload size in bytes","Màxim tamany del payload en bytes"}.
|
||||
{"Maximum file size","Mida màxima de fitxer"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Numero màxim de missatges de l'historia que retorna la sala"}.
|
||||
@@ -324,6 +331,7 @@
|
||||
{"Node index not found","Index de node no trobat"}.
|
||||
{"Node not found","Node no trobat"}.
|
||||
{"Node ~p","Node ~p"}.
|
||||
{"Node","Node"}.
|
||||
{"Nodeprep has failed","Ha fallat Nodeprep"}.
|
||||
{"Nodes","Nodes"}.
|
||||
{"None","Cap"}.
|
||||
@@ -339,7 +347,7 @@
|
||||
{"Number of Offline Messages","Número de missatges offline"}.
|
||||
{"Number of online users","Número d'usuaris connectats"}.
|
||||
{"Number of registered users","Número d'Usuaris Registrats"}.
|
||||
{"Number of seconds after which to automatically purge items","Número de segons després dels quals es purgaran automàticament elements"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segons després dels quals es purgaran automàticament elements, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}.
|
||||
{"Occupants are allowed to invite others","Els ocupants poden invitar a altres"}.
|
||||
{"Occupants May Change the Subject","Els ocupants poden canviar el Tema"}.
|
||||
{"October","Octubre"}.
|
||||
@@ -418,6 +426,7 @@
|
||||
{"Registered Users:","Usuaris registrats:"}.
|
||||
{"Register","Registrar"}.
|
||||
{"Remote copy","Còpia remota"}.
|
||||
{"Remove a hat from a user","Eliminar un barret d'un usuari"}.
|
||||
{"Remove All Offline Messages","Eliminar tots els missatges offline"}.
|
||||
{"Remove User","Eliminar usuari"}.
|
||||
{"Remove","Borrar"}.
|
||||
@@ -519,7 +528,7 @@
|
||||
{"The JIDs of those with an affiliation of owner","Els JIDs de qui tenen una afiliació de propietaris"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Els JIDs de qui tenen una afiliació de publicadors"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","La llista de JIDs que poden associar nodes fulla amb una col·lecció"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection","El màxim número de nodes fills que poden associar-se amb una col·lecció"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","El màxim número de nodes fills que poden associar-se amb una col·lecció, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","El número mínim de mil·lisegons entre l'enviament de dos resums de notificacions"}.
|
||||
{"The name of the node","El nom del node"}.
|
||||
{"The node is a collection node","El node es una col·lecció"}.
|
||||
@@ -544,7 +553,6 @@
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","El tipus de dades al node, usualment especificat pel namespace del payload (si n'hi ha)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de uns transformació XSL que pot ser aplicada als payloads per a generar un element apropiat de contingut de missatge."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformació XSL que pot ser aplicada al format de payload per a generar un resultat valid de Data Forms, que el client puga mostrar usant un métode generic de Data Forms"}.
|
||||
{"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: "}.
|
||||
@@ -571,7 +579,7 @@
|
||||
{"Too many users in this conference","N'hi ha massa usuaris en esta sala de conferència"}.
|
||||
{"To","Per a"}.
|
||||
{"Total rooms","Sales totals"}.
|
||||
{"Traffic rate limit is exceeded","El llímit de tràfic ha sigut sobrepassat"}.
|
||||
{"Traffic rate limit is exceeded","El límit de tràfic ha sigut sobrepassat"}.
|
||||
{"Transactions Aborted:","Transaccions Avortades:"}.
|
||||
{"Transactions Committed:","Transaccions Realitzades:"}.
|
||||
{"Transactions Logged:","Transaccions registrades:"}.
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
{"Make room public searchable","Nastavit místnost jako veřejnou"}.
|
||||
{"Malformed username","Chybně formátováné jméno uživatele"}.
|
||||
{"March",". března"}.
|
||||
{"Max # of items to persist","Maximální počet položek, které je možné natrvalo uložit"}.
|
||||
{"Max payload size in bytes","Maximální náklad v bajtech"}.
|
||||
{"Maximum Number of Occupants","Počet účastníků"}.
|
||||
{"May",". května"}.
|
||||
|
||||
+12
-5
@@ -20,6 +20,7 @@
|
||||
{"Access model","Zugriffsmodell"}.
|
||||
{"Account doesn't exist","Konto existiert nicht"}.
|
||||
{"Action on user","Aktion auf Benutzer"}.
|
||||
{"Add a hat to a user","Funktion zu einem Benutzer hinzufügen"}.
|
||||
{"Add Jabber ID","Jabber-ID hinzufügen"}.
|
||||
{"Add New","Neue(n) hinzufügen"}.
|
||||
{"Add User","Benutzer hinzufügen"}.
|
||||
@@ -136,6 +137,7 @@
|
||||
{"Elements","Elemente"}.
|
||||
{"Email Address","E-Mail-Adresse"}.
|
||||
{"Email","E-Mail"}.
|
||||
{"Enable hats","Funktion einschalten"}.
|
||||
{"Enable logging","Protokollierung aktivieren"}.
|
||||
{"Enable message archiving","Nachrichtenarchivierung aktivieren"}.
|
||||
{"Enabling push without 'node' attribute is not supported","push ohne 'node'-Attribut zu aktivieren wird nicht unterstützt"}.
|
||||
@@ -186,6 +188,9 @@
|
||||
{"has been kicked because of an affiliation change","wurde wegen einer Änderung der Zugehörigkeit hinausgeworfen"}.
|
||||
{"has been kicked because the room has been changed to members-only","wurde hinausgeworfen weil der Raum zu Nur-Mitglieder geändert wurde"}.
|
||||
{"has been kicked","wurde hinausgeworfen"}.
|
||||
{"Hat title","Funktionstitel"}.
|
||||
{"Hat URI","Funktions-URI"}.
|
||||
{"Hats limit exceeded","Funktionslimit wurde überschritten"}.
|
||||
{"Host unknown","Host unbekannt"}.
|
||||
{"Host","Host"}.
|
||||
{"HTTP File Upload","HTTP-Dateiupload"}.
|
||||
@@ -237,6 +242,8 @@
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Niederwertigstes Bit des SHA-256-Hashes des Textes sollte hexadezimalem Label gleichen"}.
|
||||
{"leaves the room","verlässt den Raum"}.
|
||||
{"List of rooms","Liste von Räumen"}.
|
||||
{"List of users with hats","Liste der Benutzer mit Funktionen"}.
|
||||
{"List users with hats","Benutzer mit Funktionen auflisten"}.
|
||||
{"Logging","Protokollierung"}.
|
||||
{"Low level update script","Low-Level-Aktualisierungsscript"}.
|
||||
{"Make participants list public","Teilnehmerliste öffentlich machen"}.
|
||||
@@ -249,7 +256,7 @@
|
||||
{"Malformed username","Ungültiger Benutzername"}.
|
||||
{"MAM preference modification denied by service policy","Modifikation der MAM-Präferenzen aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"March","März"}.
|
||||
{"Max # of items to persist","Maximale Anzahl persistenter Items"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Maximale Anzahl der aufzubewahrenden Elemente oder `max`, wenn es keine spezifische Begrenzung gibt, außer einer vom Server festgelegten Höchstzahl"}.
|
||||
{"Max payload size in bytes","Maximale Nutzdatengröße in Bytes"}.
|
||||
{"Maximum file size","Maximale Dateigröße"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Maximale Anzahl der vom Raum zurückgegebenen History-Nachrichten"}.
|
||||
@@ -340,7 +347,7 @@
|
||||
{"Number of Offline Messages","Anzahl der Offline-Nachrichten"}.
|
||||
{"Number of online users","Anzahl der angemeldeten Benutzer"}.
|
||||
{"Number of registered users","Anzahl der registrierten Benutzer"}.
|
||||
{"Number of seconds after which to automatically purge items","Anzahl der Sekunden, nach der Items automatisch gelöscht werden"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Anzahl der Sekunden, nach denen Elemente automatisch gelöscht werden sollen, oder `max`, wenn es keine spezifische Grenze gibt, außer einer vom Server festgelegten Höchstgrenze"}.
|
||||
{"Occupants are allowed to invite others","Teilnehmer dürfen andere einladen"}.
|
||||
{"Occupants May Change the Subject","Teilnehmer dürfen das Thema ändern"}.
|
||||
{"October","Oktober"}.
|
||||
@@ -419,6 +426,7 @@
|
||||
{"Registered Users","Registrierte Benutzer"}.
|
||||
{"Registered Users:","Registrierte Benutzer:"}.
|
||||
{"Remote copy","Fernkopie"}.
|
||||
{"Remove a hat from a user","Eine Funktion bei einem Benutzer entfernen"}.
|
||||
{"Remove All Offline Messages","Alle Offline-Nachrichten löschen"}.
|
||||
{"Remove User","Benutzer löschen"}.
|
||||
{"Remove","Entfernen"}.
|
||||
@@ -437,7 +445,7 @@
|
||||
{"Roles and Affiliations that May Retrieve Member List","Rollen und Zugehörigkeiten die Mitgliederliste abrufen dürfen"}.
|
||||
{"Roles for which Presence is Broadcasted","Rollen für welche die Präsenz übertragen wird"}.
|
||||
{"Roles that May Send Private Messages","Rollen die Privatnachrichten senden dürfen"}.
|
||||
{"Room Configuration","Raum-Konfiguration"}.
|
||||
{"Room Configuration","Raumkonfiguration"}.
|
||||
{"Room creation is denied by service policy","Anlegen des Raumes aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"Room description","Raumbeschreibung"}.
|
||||
{"Room Occupants","Raumteilnehmer"}.
|
||||
@@ -520,7 +528,7 @@
|
||||
{"The JIDs of those with an affiliation of owner","Die JIDs jener mit einer Zugehörigkeit von Besitzer"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Die JIDs jener mit einer Zugehörigkeit von Veröffentlicher"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","Die Liste der JIDs die Blattknoten mit einer Sammlung verknüpfen dürfen"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection","Die maximale Anzahl der Kindknoten die mit einer Sammlung verknüpft werden können"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","Die Höchstzahl der untergeordneten Knoten, die einer Sammlung zugeordnet werden können, oder `max`, wenn es keine spezifische Begrenzung gibt, sondern nur eine vom Server festgelegte Höchstzahl"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","Die minimale Anzahl an Millisekunden zwischen dem Senden von zwei Benachrichtigungs-Übersichten"}.
|
||||
{"The name of the node","Der Name des Knotens"}.
|
||||
{"The node is a collection node","Der Knoten ist ein Sammlungsknoten"}.
|
||||
@@ -545,7 +553,6 @@
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","Die Art der Knotendaten, üblicherweise vom Namensraum der Nutzdaten angegeben (gegebenenfalls)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Die URL einer XSL-Transformation welche auf Nutzdaten angewendet werden kann, um ein geeignetes Nachrichtenkörper-Element zu generieren."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","Die URL einer XSL-Transformation welche auf das Nutzdaten-Format angewendet werden kann, um ein gültiges Data Forms-Ergebnis zu generieren das der Client mit Hilfe einer generischen Data Forms-Rendering-Engine anzeigen könnte"}.
|
||||
{"The username is not valid","Der Benutzername ist nicht gültig"}.
|
||||
{"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passwortes 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: "}.
|
||||
|
||||
@@ -249,7 +249,6 @@
|
||||
{"Malformed username","Λανθασμένη μορφή ονόματος χρήστη"}.
|
||||
{"MAM preference modification denied by service policy","Άρνηση αλλαγής προτιμήσεων MAM, λόγω της τακτικής Παροχής Υπηρεσιών"}.
|
||||
{"March","Μάρτιος"}.
|
||||
{"Max # of items to persist","Μέγιστος αριθμός μόνιμων στοιχείων"}.
|
||||
{"Max payload size in bytes","Μέγιστο μέγεθος φορτίου σε bytes"}.
|
||||
{"Maximum file size","Μέγιστο μέγεθος αρχείου"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Μέγιστος αριθμός μηνυμάτων Ιστορικού που επιστρέφονται από την Αίθουσα"}.
|
||||
@@ -339,7 +338,6 @@
|
||||
{"Number of Offline Messages","Πλήθος μηνυμάτων Χωρίς Σύνδεση"}.
|
||||
{"Number of online users","Αριθμός συνδεδεμένων χρηστών"}.
|
||||
{"Number of registered users","Αριθμός εγγεγραμμένων χρηστών"}.
|
||||
{"Number of seconds after which to automatically purge items","Πλήθος δευτερολέπτων μετά τα οποία αυτομάτως εκκαθαρίζονται αντικείμενα"}.
|
||||
{"Occupants are allowed to invite others","Οι συμμετέχοντες μπορούν να προσκαλέσουν και άλλους"}.
|
||||
{"Occupants May Change the Subject","Επιτρέψτε στους χρήστες να αλλάζουν το Θέμα"}.
|
||||
{"October","Οκτώβριος"}.
|
||||
@@ -519,7 +517,6 @@
|
||||
{"The JIDs of those with an affiliation of owner","Το JID αυτών που σχετίζονται με τον ιδιοκτήτη"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Το JID αυτών που σχετίζονται με τον εκδότη"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","Λίστα των JIDs που μπορούν να σχετίζουν leaf κόμβους με μια Συλλογή"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection","Το μέγιστο πλήθος θυγατρικών κόμβων που μπορούν να συσχετιστούν με μία Συλλογή"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","Το ελάχιστο πλήθος χιλιοστών του δευτερολέπτου μεταξύ της αποστολής δύο συγχωνεύσεων ειδοποιήσεων"}.
|
||||
{"The name of the node","Το όνομα του κόμβου"}.
|
||||
{"The node is a collection node","Ο κόμβος είναι κόμβος Συλλογής"}.
|
||||
@@ -544,7 +541,6 @@
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","Ο τύπος των δεδομένων του κόμβου συνήθως προσδιορίζεται από το namespace του φόρτου εργασιών (αν υπάρχουν)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Το URL ενός μετασχηματισμού XSL το οποίο μπορεί να εφαρμοστεί σε φόρτους εργασίας για να παραχθεί το κατάλληλο στοιχείο του σώματος του μηνύματος."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","Το URL ενός μετασχηματισμού XSL, το οποίο μπορεί να εφαρμοστεί στους τύπους φόρτου εργασίας για να παραχθεί έγκυρο αποτέλεσμα Data Forms, τέτοιο που ο πελάτης μπορεί να εμφανίσει, χρησιμοποιώντας μια ευρείας χρήσης μηχανή επεξεργασίας Data Forms"}.
|
||||
{"The username is not valid","Το όνομα Χρήστη δεν είναι έγκυρο"}.
|
||||
{"There was an error changing the password: ","Παρουσιάστηκε σφάλμα κατά την αλλαγή του κωδικού πρόσβασης: "}.
|
||||
{"There was an error creating the account: ","Υπήρξε ένα σφάλμα κατά τη δημιουργία του λογαριασμού: "}.
|
||||
{"There was an error deleting the account: ","Υπήρξε ένα σφάλμα κατά τη διαγραφή του λογαριασμού: "}.
|
||||
|
||||
@@ -186,7 +186,6 @@
|
||||
{"Make room persistent","Farigu babilejon daŭra"}.
|
||||
{"Make room public searchable","Farigu babilejon publike trovebla"}.
|
||||
{"March","Marĉo"}.
|
||||
{"Max # of items to persist","Maksimuma kiomo de eroj en konservado"}.
|
||||
{"Max payload size in bytes","Maksimuma aĵo-grando je bajtoj"}.
|
||||
{"Maximum file size","Maksimuma grando de dosiero"}.
|
||||
{"Maximum Number of Occupants","Limigo de nombro de partoprenantoj"}.
|
||||
|
||||
+13
-5
@@ -20,6 +20,7 @@
|
||||
{"Access model","Modelo de Acceso"}.
|
||||
{"Account doesn't exist","La cuenta no existe"}.
|
||||
{"Action on user","Acción en el usuario"}.
|
||||
{"Add a hat to a user","Añade un sombrero a un usuario"}.
|
||||
{"Add Jabber ID","Añadir Jabber ID"}.
|
||||
{"Add New","Añadir nuevo"}.
|
||||
{"Add User","Añadir usuario"}.
|
||||
@@ -136,6 +137,7 @@
|
||||
{"Elements","Elementos"}.
|
||||
{"Email Address","Dirección de correo electrónico"}.
|
||||
{"Email","Correo electrónico"}.
|
||||
{"Enable hats","Activar sombreros"}.
|
||||
{"Enable logging","Guardar históricos"}.
|
||||
{"Enable message archiving","Activar el almacenamiento de mensajes"}.
|
||||
{"Enabling push without 'node' attribute is not supported","No está soportado activar Push sin el atributo 'node'"}.
|
||||
@@ -186,6 +188,9 @@
|
||||
{"has been kicked because of an affiliation change","ha sido expulsado por un cambio de su afiliación"}.
|
||||
{"has been kicked because the room has been changed to members-only","ha sido expulsado porque la sala es ahora solo para miembros"}.
|
||||
{"has been kicked","ha sido expulsado"}.
|
||||
{"Hat title","Título del sombrero"}.
|
||||
{"Hat URI","Dirección del sombrero"}.
|
||||
{"Hats limit exceeded","Se ha excedido el límite de sombreros"}.
|
||||
{"Host unknown","Dominio desconocido"}.
|
||||
{"Host","Dominio"}.
|
||||
{"HTTP File Upload","Subir fichero por HTTP"}.
|
||||
@@ -237,6 +242,8 @@
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Los bits menos significativos del hash SHA-256 del texto deberían ser iguales a la etiqueta hexadecimal"}.
|
||||
{"leaves the room","sale de la sala"}.
|
||||
{"List of rooms","Lista de salas"}.
|
||||
{"List of users with hats","Lista de usuarios con sombreros"}.
|
||||
{"List users with hats","Listar usuarios con sombreros"}.
|
||||
{"Logging","Histórico de mensajes"}.
|
||||
{"Low level update script","Script de actualización a bajo nivel"}.
|
||||
{"Make participants list public","La lista de participantes es pública"}.
|
||||
@@ -249,7 +256,7 @@
|
||||
{"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"}.
|
||||
{"Max # of items to persist","Máximo # de elementos que persisten"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Máximo # de elementos a persistir, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}.
|
||||
{"Max payload size in bytes","Máximo tamaño del contenido en bytes"}.
|
||||
{"Maximum file size","Tamaño máximo de fichero"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Máximo número de mensajes del historial devueltos por la sala"}.
|
||||
@@ -324,6 +331,7 @@
|
||||
{"Node index not found","No se ha encontrado índice de nodo"}.
|
||||
{"Node not found","Nodo no encontrado"}.
|
||||
{"Node ~p","Nodo ~p"}.
|
||||
{"Node","Nodo"}.
|
||||
{"Nodeprep has failed","Ha fallado el procesado del nombre de nodo (nodeprep)"}.
|
||||
{"Nodes","Nodos"}.
|
||||
{"None","Ninguno"}.
|
||||
@@ -339,7 +347,7 @@
|
||||
{"Number of Offline Messages","Número de mensajes diferidos"}.
|
||||
{"Number of online users","Número de usuarios conectados"}.
|
||||
{"Number of registered users","Número de usuarios registrados"}.
|
||||
{"Number of seconds after which to automatically purge items","Número de segundos después de los cuales se purgarán elementos automáticamente"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segundos después de los cuales se purgarán elementos automáticamente, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}.
|
||||
{"Occupants are allowed to invite others","Los ocupantes pueden invitar a otras personas"}.
|
||||
{"Occupants May Change the Subject","Los ocupantes pueden cambiar el Asunto"}.
|
||||
{"October","Octubre"}.
|
||||
@@ -418,6 +426,7 @@
|
||||
{"Registered Users:","Usuarios registrados:"}.
|
||||
{"Register","Registrar"}.
|
||||
{"Remote copy","Copia remota"}.
|
||||
{"Remove a hat from a user","Quitarle un sombrero a un usuario"}.
|
||||
{"Remove All Offline Messages","Borrar todos los mensajes diferidos"}.
|
||||
{"Remove User","Eliminar usuario"}.
|
||||
{"Remove","Borrar"}.
|
||||
@@ -519,7 +528,7 @@
|
||||
{"The JIDs of those with an affiliation of owner","Los JIDs de quienes tienen una afiliación de dueños"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Los JIDs de quienes tienen una afiliación de publicadores"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","La lista de JIDs que pueden asociar nodos hijo con una colección"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection","El número máximo de nodos hijo que pueden asociarse a una colección"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","El número máximo de nodos hijo que pueden asociarse a una colección, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","El número mínimo de milisegundos entre dos envíos de resumen de notificaciones"}.
|
||||
{"The name of the node","El nombre del nodo"}.
|
||||
{"The node is a collection node","El nodo es una colección"}.
|
||||
@@ -544,7 +553,6 @@
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","El tipo de datos del nodo, usualmente especificado por el namespace del payload (en caso de haberlo)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de una transformación XSL que puede aplicarse a payloads para generar un elemento de contenido del mensaje apropiado."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformación XSL que puede aplicarse al formato de payload para generar un resultado de Formulario de Datos válido, que el cliente pueda mostrar usando un mecanismo de dibujado genérico de Formulario de Datos"}.
|
||||
{"The username is not valid","El nombre de usuario no es válido"}.
|
||||
{"There was an error changing the password: ","Hubo uno error al cambiar la contaseñ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: "}.
|
||||
@@ -571,7 +579,7 @@
|
||||
{"Too many users in this conference","Demasiados usuarios en esta sala"}.
|
||||
{"To","Para"}.
|
||||
{"Total rooms","Salas totales"}.
|
||||
{"Traffic rate limit is exceeded","Se ha exedido el límite de tráfico"}.
|
||||
{"Traffic rate limit is exceeded","Se ha excedido el límite de tráfico"}.
|
||||
{"Transactions Aborted:","Transacciones abortadas:"}.
|
||||
{"Transactions Committed:","Transacciones finalizadas:"}.
|
||||
{"Transactions Logged:","Transacciones registradas:"}.
|
||||
|
||||
+121
-5
@@ -5,11 +5,20 @@
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (Ajouter * à la fin du champ pour correspondre à la sous-chaîne)"}.
|
||||
{" has set the subject to: "," a défini le sujet sur : "}.
|
||||
{"# participants","# participants"}.
|
||||
{"A description of the node","Une description du nœud"}.
|
||||
{"A friendly name for the node","Un nom convivial pour le nœud"}.
|
||||
{"A password is required to enter this room","Un mot de passe est nécessaire pour accéder à ce salon"}.
|
||||
{"A Web Page","Une page Web"}.
|
||||
{"Accept","Accepter"}.
|
||||
{"Access denied by service policy","L'accès au service est refusé"}.
|
||||
{"Access model of authorize","Modèle d’accès de « autoriser »"}.
|
||||
{"Access model of open","Modèle d’accès de « ouvrir »"}.
|
||||
{"Access model of presence","Modèle d’accès de « présence »"}.
|
||||
{"Access model of roster","Modèle d’accès de « liste »"}.
|
||||
{"Access model of whitelist","Modèle d’accès de « liste blanche »"}.
|
||||
{"Access model","Modèle d’accès"}.
|
||||
{"Account doesn't exist","Le compte n’existe pas"}.
|
||||
{"Action on user","Action sur l'utilisateur"}.
|
||||
{"Add Jabber ID","Ajouter un Jabber ID"}.
|
||||
{"Add New","Ajouter"}.
|
||||
@@ -19,7 +28,9 @@
|
||||
{"Administrator privileges required","Les droits d'administrateur sont nécessaires"}.
|
||||
{"All activity","Toute activité"}.
|
||||
{"All Users","Tous les utilisateurs"}.
|
||||
{"Allow subscription","Autoriser l’abonnement"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","Autoriser ce Jabber ID à s'abonner à ce nœud PubSub ?"}.
|
||||
{"Allow this person to register with the room?","Autoriser cette personne à enregistrer ce salon ?"}.
|
||||
{"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"}.
|
||||
@@ -28,8 +39,25 @@
|
||||
{"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"}.
|
||||
{"Allow visitors to send voice requests","Permettre aux visiteurs d'envoyer des demandes de 'voice'"}.
|
||||
{"An associated LDAP group that defines room membership; this should be an LDAP Distinguished Name according to an implementation-specific or deployment-specific definition of a group.","Un groupe LDAP associé qui définit l’adhésion à un salon ; cela devrait être un nom distingué LDAP selon la définition spécifique à l’implémentation ou au déploiement d’un groupe."}.
|
||||
{"Announcements","Annonces"}.
|
||||
{"Answer associated with a picture","Réponse associée à une image"}.
|
||||
{"Answer associated with a video","Réponse associée à une vidéo"}.
|
||||
{"Answer associated with speech","Réponse associée à un discours"}.
|
||||
{"Answer to a question","Réponse à une question"}.
|
||||
{"Anyone in the specified roster group(s) may subscribe and retrieve items","N’importe qui dans le groupe de la liste spécifiée peut s’abonner et récupérer les items"}.
|
||||
{"Anyone may associate leaf nodes with the collection","N’importe qui peut associer les feuilles avec la collection"}.
|
||||
{"Anyone may publish","N’importe qui peut publier"}.
|
||||
{"Anyone may subscribe and retrieve items","N’importe qui peut s’abonner et récupérer les items"}.
|
||||
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","N’importe qui avec un abonnement de présence peut s’abonner et récupérer les items"}.
|
||||
{"Anyone with Voice","N’importe qui avec Voice"}.
|
||||
{"Anyone","N’importe qui"}.
|
||||
{"April","Avril"}.
|
||||
{"Attribute 'channel' is required for this request","L’attribut « channel » est requis pour la requête"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","L’attribut « id » est obligatoire pour les messages MIX"}.
|
||||
{"Attribute 'jid' is not allowed here","L’attribut « jid » n’est pas autorisé ici"}.
|
||||
{"Attribute 'node' is not allowed here","L’attribut « node » n’est pas autorisé ici"}.
|
||||
{"Attribute 'to' of stanza that triggered challenge","L’attribut « to » de la strophe qui a déclenché le défi"}.
|
||||
{"August","Août"}.
|
||||
{"Automatic node creation is not enabled","La creation implicite de nœud n'est pas disponible"}.
|
||||
{"Backup Management","Gestion des sauvegardes"}.
|
||||
@@ -43,10 +71,14 @@
|
||||
{"Cannot remove active list","La liste active ne peut être supprimée"}.
|
||||
{"Cannot remove default list","La liste par défaut ne peut être supprimée"}.
|
||||
{"CAPTCHA web page","Page web de CAPTCHA"}.
|
||||
{"Challenge ID","Identifiant du défi"}.
|
||||
{"Change Password","Modifier le mot de passe"}.
|
||||
{"Change User Password","Changer le mot de passe de l'utilisateur"}.
|
||||
{"Changing password is not allowed","La modification du mot de passe n'est pas autorisée"}.
|
||||
{"Changing role/affiliation is not allowed","La modification role/affiliation n'est pas autorisée"}.
|
||||
{"Channel already exists","Ce canal existe déjà"}.
|
||||
{"Channel does not exist","Le canal n’existe pas"}.
|
||||
{"Channels","Canaux"}.
|
||||
{"Characters not allowed:","Caractères non autorisés :"}.
|
||||
{"Chatroom configuration modified","Configuration du salon modifiée"}.
|
||||
{"Chatroom is created","Le salon de discussion est créé"}.
|
||||
@@ -58,30 +90,39 @@
|
||||
{"Choose storage type of tables","Choisissez un type de stockage pour les tables"}.
|
||||
{"Choose whether to approve this entity's subscription.","Choisissez d'approuver ou non l'abonnement de cette entité."}.
|
||||
{"City","Ville"}.
|
||||
{"Client acknowledged more stanzas than sent by server","Le client accuse réception de plus de strophes que ce qui est envoyé par le serveur"}.
|
||||
{"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"}.
|
||||
{"Connected Resources:","Ressources connectées :"}.
|
||||
{"Contact Addresses (normally, room owner or owners)","Adresses de contact (normalement les administrateurs du salon)"}.
|
||||
{"Country","Pays"}.
|
||||
{"CPU Time:","Temps CPU :"}.
|
||||
{"Current Discussion Topic","Sujet de discussion courant"}.
|
||||
{"Database failure","Échec 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 content","Supprimer le contenu"}.
|
||||
{"Delete message of the day on all hosts","Supprimer le message du jour sur tous les domaines"}.
|
||||
{"Delete message of the day","Supprimer le message du jour"}.
|
||||
{"Delete Selected","Suppression des éléments sélectionnés"}.
|
||||
{"Delete table","Supprimer la table"}.
|
||||
{"Delete User","Supprimer l'utilisateur"}.
|
||||
{"Deliver event notifications","Envoyer les notifications d'événement"}.
|
||||
{"Deliver payloads with event notifications","Inclure le contenu du message avec la notification"}.
|
||||
{"Description:","Description :"}.
|
||||
{"Disc only copy","Copie sur disque uniquement"}.
|
||||
{"'Displayed groups' not added (they do not exist!): ","« Groupes affichés » non ajoutés (ils n’existent pas !) : "}.
|
||||
{"Displayed:","Affichés :"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Ne révélez votre mot de passe à personne, pas même aux administrateurs du serveur XMPP."}.
|
||||
{"Dump Backup to Text File at ","Enregistrer la sauvegarde dans un fichier texte sur "}.
|
||||
{"Dump to Text File","Sauvegarder dans un fichier texte"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","Les groupes dupliqués ne sont pas autorisés par la RFC6121"}.
|
||||
{"Dynamically specify a replyto of the item publisher","Spécifie dynamiquement un « réponse à » de l’item de l’éditeur"}.
|
||||
{"Edit Properties","Modifier les propriétés"}.
|
||||
{"Either approve or decline the voice request.","Accepter ou refuser la demande de voix."}.
|
||||
{"ejabberd MUC module","Module MUC ejabberd"}.
|
||||
@@ -90,6 +131,7 @@
|
||||
{"ejabberd SOCKS5 Bytestreams module","Module SOCKS5 Bytestreams per ejabberd"}.
|
||||
{"ejabberd vCard module","Module vCard ejabberd"}.
|
||||
{"ejabberd Web Admin","Console Web d'administration de ejabberd"}.
|
||||
{"ejabberd","ejabberd"}.
|
||||
{"Elements","Éléments"}.
|
||||
{"Email Address","Adresse courriel"}.
|
||||
{"Email","Courriel"}.
|
||||
@@ -103,6 +145,7 @@
|
||||
{"Enter path to jabberd14 spool file","Entrez le chemin vers le fichier spool de Jabberd 1.4"}.
|
||||
{"Enter path to text file","Entrez le chemin vers le fichier texte"}.
|
||||
{"Enter the text you see","Tapez le texte que vous voyez"}.
|
||||
{"Erlang XMPP Server","Serveur XMPP Erlang"}.
|
||||
{"Error","Erreur"}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Exempter des Jabberd IDs du test CAPTCHA"}.
|
||||
{"Export all tables as SQL queries to a file:","Exporter toutes les tables vers un fichier SQL :"}.
|
||||
@@ -116,11 +159,15 @@
|
||||
{"Failed to parse HTTP response","Échec de lecture de la réponse HTTP"}.
|
||||
{"Failed to process option '~s'","Échec de traitement de l'option '~s'"}.
|
||||
{"Family Name","Nom de famille"}.
|
||||
{"FAQ Entry","Entrée FAQ"}.
|
||||
{"February","Février"}.
|
||||
{"File larger than ~w bytes","Taille de fichier suppérieur à ~w octets"}.
|
||||
{"Fill in the form to search for any matching XMPP User","Complétez le formulaire pour rechercher un utilisateur XMPP correspondant"}.
|
||||
{"Friday","Vendredi"}.
|
||||
{"From ~ts","De ~ts"}.
|
||||
{"From","De"}.
|
||||
{"Full List of Room Admins","Liste complète des administrateurs des salons"}.
|
||||
{"Full List of Room Owners","Liste complète des propriétaires des salons"}.
|
||||
{"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"}.
|
||||
@@ -140,6 +187,7 @@
|
||||
{"Host unknown","Serveur inconnu"}.
|
||||
{"Host","Serveur"}.
|
||||
{"HTTP File Upload","Téléversement de fichier HTTP"}.
|
||||
{"Idle connection","Connexion inactive"}.
|
||||
{"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"}.
|
||||
@@ -176,8 +224,10 @@
|
||||
{"July","Juillet"}.
|
||||
{"June","Juin"}.
|
||||
{"Just created","Vient d'être créé"}.
|
||||
{"Label:","Étiquette :"}.
|
||||
{"Last Activity","Dernière activité"}.
|
||||
{"Last login","Dernière connexion"}.
|
||||
{"Last message","Dernier message"}.
|
||||
{"Last month","Dernier mois"}.
|
||||
{"Last year","Dernière année"}.
|
||||
{"leaves the room","quitte le salon"}.
|
||||
@@ -192,7 +242,6 @@
|
||||
{"Make room public searchable","Rendre le salon public"}.
|
||||
{"Malformed username","Nom d'utilisateur invalide"}.
|
||||
{"March","Mars"}.
|
||||
{"Max # of items to persist","Nombre maximum d'éléments à stocker"}.
|
||||
{"Max payload size in bytes","Taille maximum pour le contenu du message en octet"}.
|
||||
{"Maximum file size","Taille maximale du fichier"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Nombre maximal de messages d'historique renvoyés par salle"}.
|
||||
@@ -210,6 +259,8 @@
|
||||
{"Middle Name","Autre nom"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Intervalle minimum entre les demandes de 'voice' (en secondes)"}.
|
||||
{"Moderator privileges required","Les droits de modérateur sont nécessaires"}.
|
||||
{"Moderator","Modérateur"}.
|
||||
{"Moderators Only","Modérateurs uniquement"}.
|
||||
{"Modified modules","Modules mis à jour"}.
|
||||
{"Module failed to handle the query","Échec de traitement de la demande"}.
|
||||
{"Monday","Lundi"}.
|
||||
@@ -223,12 +274,14 @@
|
||||
{"Neither 'role' nor 'affiliation' attribute found","Attribut 'role' ou 'affiliation' absent"}.
|
||||
{"Never","Jamais"}.
|
||||
{"New Password:","Nouveau mot de passe :"}.
|
||||
{"Nickname can't be empty","Le pseudonyme ne peut être laissé vide"}.
|
||||
{"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 '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 child elements found","Aucun élément enfant trouvé"}.
|
||||
{"No data form found","Formulaire non trouvé"}.
|
||||
{"No Data","Aucune information disponible"}.
|
||||
{"No features available","Aucune fonctionalité disponible"}.
|
||||
@@ -249,23 +302,30 @@
|
||||
{"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"}.
|
||||
{"Nobody","Personne"}.
|
||||
{"Node already exists","Ce nœud existe déjà"}.
|
||||
{"Node ID","Identifiant du nœud"}.
|
||||
{"Node index not found","Index de nœud non trouvé"}.
|
||||
{"Node not found","Nœud non trouvé"}.
|
||||
{"Node ~p","Nœud ~p"}.
|
||||
{"Node","Nœud"}.
|
||||
{"Nodeprep has failed","Échec de formattage"}.
|
||||
{"Nodes","Nœuds"}.
|
||||
{"None","Aucun"}.
|
||||
{"Not allowed","Non autorisé"}.
|
||||
{"Not Found","Nœud non trouvé"}.
|
||||
{"Not subscribed","Pas abonné"}.
|
||||
{"Notify subscribers when items are removed from the node","Avertir les abonnés lorsque des éléments sont supprimés sur le nœud"}.
|
||||
{"Notify subscribers when the node configuration changes","Avertir les abonnés lorsque la configuration du nœud change"}.
|
||||
{"Notify subscribers when the node is deleted","Avertir les abonnés lorsque le nœud est supprimé"}.
|
||||
{"November","Novembre"}.
|
||||
{"Number of answers required","Nombre de réponses requises"}.
|
||||
{"Number of occupants","Nombre d'occupants"}.
|
||||
{"Number of Offline Messages","Nombre de messages hors ligne"}.
|
||||
{"Number of online users","Nombre d'utilisateurs en ligne"}.
|
||||
{"Number of registered users","Nombre d'utilisateurs enregistrés"}.
|
||||
{"Occupants are allowed to invite others","Les occupants sont autorisés à inviter d’autres personnes"}.
|
||||
{"Occupants May Change the Subject","Les occupants peuvent changer le sujet"}.
|
||||
{"October","Octobre"}.
|
||||
{"Offline Messages","Messages en attente"}.
|
||||
{"Offline Messages:","Messages hors ligne :"}.
|
||||
@@ -274,6 +334,7 @@
|
||||
{"Online Users:","Utilisateurs connectés :"}.
|
||||
{"Online Users","Utilisateurs en ligne"}.
|
||||
{"Online","En ligne"}.
|
||||
{"Only admins can see this","Seuls les administrateurs peuvent voir cela"}.
|
||||
{"Only deliver notifications to available users","Envoyer les notifications uniquement aux utilisateurs disponibles"}.
|
||||
{"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"}.
|
||||
@@ -283,6 +344,7 @@
|
||||
{"Only moderators can approve voice requests","Seuls les modérateurs peuvent accépter les requêtes voix"}.
|
||||
{"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 publishers may publish","Seuls les éditeurs peuvent publier"}.
|
||||
{"Only service administrators are allowed to send service messages","Seuls les administrateurs du service sont autoriser à envoyer des messages de service"}.
|
||||
{"Organization Name","Nom de l'organisation"}.
|
||||
{"Organization Unit","Unité de l'organisation"}.
|
||||
@@ -290,6 +352,7 @@
|
||||
{"Outgoing s2s Connections:","Connexions s2s sortantes :"}.
|
||||
{"Owner privileges required","Les droits de propriétaire sont nécessaires"}.
|
||||
{"Packet","Paquet"}.
|
||||
{"Participant","Participant"}.
|
||||
{"Password Verification","Vérification du mot de passe"}.
|
||||
{"Password Verification:","Vérification du mot de passe :"}.
|
||||
{"Password","Mot de passe"}.
|
||||
@@ -299,13 +362,16 @@
|
||||
{"Pending","En suspens"}.
|
||||
{"Period: ","Période : "}.
|
||||
{"Persist items to storage","Stockage persistant des éléments"}.
|
||||
{"Persistent","Persistant"}.
|
||||
{"Ping query is incorrect","Requête ping incorrecte"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ces options sauvegardent uniquement la base de données interne Mnesia. Si vous utilisez le module ODBC vous devez sauvegarde votre base SQL séparément."}.
|
||||
{"Please, wait for a while before sending new voice request","Attendez un moment avant de re-lancer une requête de voix"}.
|
||||
{"Pong","Pong"}.
|
||||
{"Present real Jabber IDs to","Rendre le Jabber ID réel visible pour"}.
|
||||
{"private, ","privé"}.
|
||||
{"Previous session not found","Session précédente introuvable"}.
|
||||
{"Previous session timed out","La session précédente a expiré"}.
|
||||
{"private, ","privé, "}.
|
||||
{"Publish-Subscribe","Publication-Abonnement"}.
|
||||
{"PubSub subscriber request","Demande d'abonnement PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Purger tous les items lorsque publieur est hors-ligne"}.
|
||||
@@ -315,6 +381,7 @@
|
||||
{"RAM copy","Copie en mémoire vive (RAM)"}.
|
||||
{"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 an XMPP account","Inscrire un compte XMPP"}.
|
||||
{"Registered Users","Utilisateurs enregistrés"}.
|
||||
{"Registered Users:","Utilisateurs enregistrés :"}.
|
||||
{"Register","Enregistrer"}.
|
||||
@@ -323,6 +390,9 @@
|
||||
{"Remove User","Supprimer l'utilisateur"}.
|
||||
{"Remove","Supprimer"}.
|
||||
{"Replaced by new connection","Remplacé par une nouvelle connexion"}.
|
||||
{"Request has timed out","La demande a expiré"}.
|
||||
{"Request is ignored","La demande est ignorée"}.
|
||||
{"Requested role","Rôle demandé"}.
|
||||
{"Resources","Ressources"}.
|
||||
{"Restart Service","Redémarrer le service"}.
|
||||
{"Restart","Redémarrer"}.
|
||||
@@ -337,19 +407,24 @@
|
||||
{"Room Occupants","Occupants du salon"}.
|
||||
{"Room title","Titre du salon"}.
|
||||
{"Roster groups allowed to subscribe","Groupes de liste de contact autorisés à s'abonner"}.
|
||||
{"Roster of ~ts","Liste de contacts de ~ts"}.
|
||||
{"Roster size","Taille de la liste de contacts"}.
|
||||
{"Roster:","Liste de contacts :"}.
|
||||
{"RPC Call Error","Erreur d'appel RPC"}.
|
||||
{"Running Nodes","Nœuds actifs"}.
|
||||
{"Saturday","Samedi"}.
|
||||
{"Script check","Validation du script"}.
|
||||
{"Search Results for ","Résultats de recherche pour "}.
|
||||
{"Search until the date","Rechercher jusqu’à la date"}.
|
||||
{"Search users in ","Rechercher des utilisateurs "}.
|
||||
{"Select All","Tout sélectionner"}.
|
||||
{"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 users","Envoyer l'annonce à tous les utilisateurs"}.
|
||||
{"September","Septembre"}.
|
||||
{"Server:","Serveur :"}.
|
||||
{"Service list retrieval timed out","La récupération de la liste des services a expiré"}.
|
||||
{"Set message of the day and send to online users","Définir le message du jour et l'envoyer aux utilisateurs en ligne"}.
|
||||
{"Set message of the day on all hosts and send to online users","Définir le message du jour pour tous domaines et l'envoyer aux utilisateurs en ligne"}.
|
||||
{"Shared Roster Groups","Groupes de liste de contacts partagée"}.
|
||||
@@ -366,6 +441,7 @@
|
||||
{"Storage Type","Type de stockage"}.
|
||||
{"Store binary backup:","Sauvegarde binaire :"}.
|
||||
{"Store plain text backup:","Sauvegarde texte :"}.
|
||||
{"Stream management is already enabled","La gestion des flux est déjà activée"}.
|
||||
{"Subject","Sujet"}.
|
||||
{"Submit","Soumettre"}.
|
||||
{"Submitted","Soumis"}.
|
||||
@@ -373,26 +449,50 @@
|
||||
{"Subscription","Abonnement"}.
|
||||
{"Subscriptions are not allowed","Les abonnement ne sont pas autorisés"}.
|
||||
{"Sunday","Dimanche"}.
|
||||
{"Text associated with a picture","Texte associé à une image"}.
|
||||
{"Text associated with a sound","Texte associé à un son"}.
|
||||
{"Text associated with a video","Texte associé à une vidéo"}.
|
||||
{"Text associated with speech","Texte associé au discours"}.
|
||||
{"That nickname is already in use by another occupant","Le pseudo est déjà utilisé par un autre occupant"}.
|
||||
{"That nickname is registered by another person","Le pseudo est enregistré par une autre personne"}.
|
||||
{"The CAPTCHA is valid.","Le CAPTCHA est valide"}.
|
||||
{"The account already exists","Le compte existe déjà"}.
|
||||
{"The account was not unregistered","Le compte n’a pas été désinscrit"}.
|
||||
{"The body text of the last received message","Le corps du texte du dernier message reçu"}.
|
||||
{"The CAPTCHA is valid.","Le CAPTCHA est valide."}.
|
||||
{"The CAPTCHA verification has failed","La vérification du CAPTCHA a échoué"}.
|
||||
{"The captcha you entered is wrong","Le captcha que vous avez saisi est erroné"}.
|
||||
{"The collections with which a node is affiliated","Les collections avec lesquelle un nœud est affilié"}.
|
||||
{"The datetime when the node was created","La date à laquelle le nœud a été créé"}.
|
||||
{"The default language of the node","La langue par défaut du nœud"}.
|
||||
{"The feature requested is not supported by the conference","La demande de fonctionalité n'est pas supportée par la conférence"}.
|
||||
{"The JID of the node creator","Le JID du créateur du nœud"}.
|
||||
{"The name of the node","Le nom du nœud"}.
|
||||
{"The node is a collection node","Le nœud est un nœud de collecte"}.
|
||||
{"The number of subscribers to the node","Le nombre d’enregistrés au nœud"}.
|
||||
{"The number of unread or undelivered messages","Le nombre de messages non lus ou non remis"}.
|
||||
{"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 of your XMPP account was successfully changed.","Le mot de passe de votre compte XMPP a été modifié avec succès."}.
|
||||
{"The password was not changed","Le mot de passe n’a pas été modifié"}.
|
||||
{"The passwords are different","Les mots de passe sont différents"}.
|
||||
{"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/>"}.
|
||||
{"The room subject can be modified by participants","Le sujet du salon peut être modifié par les participants"}.
|
||||
{"The sender of the last received message","L’expéditeur du dernier message reçu"}.
|
||||
{"The subscription identifier associated with the subscription request","L’identificateur d’abonnement associé à la demande d’abonnement"}.
|
||||
{"There was an error changing the password: ","Une erreur s’est produite lors de la modification du mot de passe : "}.
|
||||
{"There was an error creating the account: ","Il y a eu une erreur en créant le compte : "}.
|
||||
{"There was an error deleting the account: ","Il y a eu une erreur en effaçant le compte : "}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","Cette page permet de désenregistrer un compte XMPP sur ce serveur XMPP."}.
|
||||
{"This room is not anonymous","Ce salon n'est pas anonyme"}.
|
||||
{"This service can not process the address: ~s","Ce service ne peut pas traiter l’adresse : ~s"}.
|
||||
{"Thursday","Jeudi"}.
|
||||
{"Time delay","Délais"}.
|
||||
{"Timed out waiting for stream resumption","Expiration du délai d’attente pour la reprise du flux"}.
|
||||
{"Time","Heure"}.
|
||||
{"To register, visit ~s","Pour vous enregistrer, visitez ~s"}.
|
||||
{"To ~ts","À ~ts"}.
|
||||
{"To","A"}.
|
||||
{"Token TTL","Jeton TTL"}.
|
||||
{"Too many active bytestreams","Trop de flux SOCKS5 actifs"}.
|
||||
@@ -400,6 +500,7 @@
|
||||
{"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 receiver fields were specified","Trop de champs de récepteurs ont été spécifiés"}.
|
||||
{"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"}.
|
||||
{"Total rooms","Nombre de salons"}.
|
||||
@@ -413,8 +514,12 @@
|
||||
{"Unable to register route on existing local domain","Impossible d'enregistrer la route sur un domaine locale existant"}.
|
||||
{"Unauthorized","Non autorisé"}.
|
||||
{"Unexpected action","Action inattendu"}.
|
||||
{"Unexpected error condition: ~p","Condition d’erreur inattendue : ~p"}.
|
||||
{"Unregister an XMPP account","Annuler l’enregistrement d’un compte XMPP"}.
|
||||
{"Unregister","Désinscrire"}.
|
||||
{"Unselect All","Tout désélectionner"}.
|
||||
{"Unsupported <index/> element","Elément <index/> non supporté"}.
|
||||
{"Unsupported version","Version non prise en charge"}.
|
||||
{"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 plan","Plan de mise à jour"}.
|
||||
@@ -422,12 +527,15 @@
|
||||
{"Update script","Script de mise à jour"}.
|
||||
{"Update","Mettre à jour"}.
|
||||
{"Uptime:","Temps depuis le démarrage :"}.
|
||||
{"URL for Archived Discussion Logs","URL des journaux de discussion archivés"}.
|
||||
{"User already exists","L'utilisateur existe déjà"}.
|
||||
{"User JID","JID de l'utilisateur "}.
|
||||
{"User JID","JID de l'utilisateur"}.
|
||||
{"User (jid)","Utilisateur (jid)"}.
|
||||
{"User Management","Gestion des utilisateurs"}.
|
||||
{"User removed","Utilisateur supprimé"}.
|
||||
{"User session not found","Session utilisateur non trouvée"}.
|
||||
{"User session terminated","Session utilisateur terminée"}.
|
||||
{"User ~ts","Utilisateur ~ts"}.
|
||||
{"Username:","Nom d'utilisateur :"}.
|
||||
{"Users are not allowed to register accounts so quickly","Les utilisateurs ne sont pas autorisés à enregistrer des comptes si rapidement"}.
|
||||
{"Users Last Activity","Dernière activité des utilisateurs"}.
|
||||
@@ -440,15 +548,22 @@
|
||||
{"Value of '~s' should be integer","La valeur de '~s' doit être un entier"}.
|
||||
{"Value 'set' of 'type' attribute is not allowed","La valeur de l'attribut 'type' ne peut être 'set'"}.
|
||||
{"vCard User Search","Recherche dans l'annnuaire"}.
|
||||
{"View Queue","Afficher la file d’attente"}.
|
||||
{"Virtual Hosts","Serveurs virtuels"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Les visiteurs ne sont pas autorisés à changer de pseudo dans ce salon"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Les visiteurs ne sont pas autorisés à envoyer des messages à tout les occupants"}.
|
||||
{"Visitor","Visiteur"}.
|
||||
{"Voice request","Demande de voix"}.
|
||||
{"Voice requests are disabled in this conference","Les demandes de voix sont désactivées dans cette conférence"}.
|
||||
{"Wednesday","Mercredi"}.
|
||||
{"When a new subscription is processed","Quand un nouvel abonnement est traité"}.
|
||||
{"When to send the last published item","A quel moment envoyer le dernier élément publié"}.
|
||||
{"Whether to allow subscriptions","Autoriser l'abonnement ?"}.
|
||||
{"Whether to allow subscriptions","Autoriser ou non les abonnements"}.
|
||||
{"Wrong parameters in the web formulary","Paramètres erronés dans le formulaire Web"}.
|
||||
{"Wrong xmlns","Xmlns incorrect"}.
|
||||
{"XMPP Account Registration","Enregistrement de compte XMPP"}.
|
||||
{"XMPP Domains","Domaines XMPP"}.
|
||||
{"You can later change your password using an XMPP client.","Vous pouvez modifier ultérieurement votre mot de passe à l’aide d’un client XMPP."}.
|
||||
{"You have been banned from this room","Vous avez été exclus de ce salon"}.
|
||||
{"You have joined too many conferences","Vous avec rejoint trop de conférences"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Vous devez préciser le champ \"pseudo\" dans le formulaire"}.
|
||||
@@ -458,4 +573,5 @@
|
||||
{"Your active privacy list has denied the routing of this stanza.","Votre règle de flitrage active a empêché le routage de ce stanza."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","La file d'attente de message de votre contact est pleine. Votre message a été détruit."}.
|
||||
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"}.
|
||||
{"Your XMPP account was successfully unregistered.","Votre compte XMPP a été désinscrit avec succès."}.
|
||||
{"You're not allowed to create nodes","Vous n'êtes pas autorisé à créer des nœuds"}.
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
{"Make room public searchable","Sala publicamente visible"}.
|
||||
{"Malformed username","Nome de usuario mal formado"}.
|
||||
{"March","Marzo"}.
|
||||
{"Max # of items to persist","Máximo # de elementos que persisten"}.
|
||||
{"Max payload size in bytes","Máximo tamaño do payload en bytes"}.
|
||||
{"Maximum Number of Occupants","Número máximo de ocupantes"}.
|
||||
{"May","Maio"}.
|
||||
|
||||
@@ -170,7 +170,6 @@
|
||||
{"Make room public searchable","הפוך חדר לחדר שנתון לחיפוש פומבי"}.
|
||||
{"Malformed username","שם משתמש פגום"}.
|
||||
{"March","מרץ"}.
|
||||
{"Max # of items to persist","מספר מרבי של פריטים לקיבוע"}.
|
||||
{"Max payload size in bytes","גודל מרבי של מטען ייעוד (payload) ביחידות מידה של byte"}.
|
||||
{"Maximum Number of Occupants","מספר מרבי של נוכחים"}.
|
||||
{"May","מאי"}.
|
||||
|
||||
@@ -388,7 +388,6 @@
|
||||
{"The query is only allowed from local users","A lekérdezés csak helyi felhasználóktól engedélyezett"}.
|
||||
{"The query must not contain <item/> elements","A lekérdezés nem tartalmazhat <item/> elemeket"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","A stanzának csak egyetlen <active/> elemet, egyetlen <default/> elemet vagy egyetlen <list/> elemet KELL tartalmaznia"}.
|
||||
{"The username is not valid","A felhasználónév nem érvényes"}.
|
||||
{"There was an error creating the account: ","Hiba történt a fiók létrehozásakor: "}.
|
||||
{"There was an error deleting the account: ","Hiba történt a fiók törlésekor: "}.
|
||||
{"This room is not anonymous","Ez a szoba nem névtelen"}.
|
||||
|
||||
+89
-11
@@ -13,8 +13,10 @@
|
||||
{"Accept","Diterima"}.
|
||||
{"Access denied by service policy","Akses ditolak oleh kebijakan layanan"}.
|
||||
{"Access model of authorize","Model akses otorisasi"}.
|
||||
{"Access model of open","Model akses terbuka"}.
|
||||
{"Access model of presence","Model akses kehadiran"}.
|
||||
{"Access model of roster","model akses daftar kontak"}.
|
||||
{"Access model of whitelist","Model akses daftar putih"}.
|
||||
{"Access model","Model akses"}.
|
||||
{"Account doesn't exist","Akun tidak ada"}.
|
||||
{"Action on user","Tindakan pada pengguna"}.
|
||||
@@ -34,7 +36,9 @@
|
||||
{"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 private messages to","Izinkan pengunjung mengirimkan pesan privat ke"}.
|
||||
{"Allow visitors to send status text in presence updates","Izinkan pengunjung untuk mengirim teks status terbaru"}.
|
||||
{"Allow visitors to send voice requests","Izinkan pengunjung mengirim permintaan suara"}.
|
||||
{"Announcements","Pengumuman"}.
|
||||
{"Answer associated with a picture","Jawaban yang berhubungan dengan gambar"}.
|
||||
{"Answer associated with a video","Jawaban yang berhubungan dengan video"}.
|
||||
@@ -44,6 +48,7 @@
|
||||
{"Anyone may publish","Siapapun dapat mempublikasi"}.
|
||||
{"Anyone may subscribe and retrieve items","Siapapun dapat berlangganan dan mengambil item"}.
|
||||
{"Anyone with Voice","Siapapun dengan fungsi suara"}.
|
||||
{"Anyone","Siapapun"}.
|
||||
{"April","April"}.
|
||||
{"Attribute 'channel' is required for this request","Atribut 'channel' diperlukan untuk permintaan ini"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","Atribut 'id' harus ada untuk pesan MIX"}.
|
||||
@@ -112,8 +117,9 @@
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Jangan beritahukan kata sandi Anda ke siapapun, bahkan ke administrator layanan XMPP."}.
|
||||
{"Dump Backup to Text File at ","Dump Backup menjadi File Teks di "}.
|
||||
{"Dump to Text File","Dump menjadi File Teks"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","Grup duplikat tidak diperbolehkan oleh RFC6121"}.
|
||||
{"Edit Properties","Ganti Properti"}.
|
||||
{"Either approve or decline the voice request.","Antara terima atau tolak permintaan suara"}.
|
||||
{"Either approve or decline the voice request.","Antara terima atau tolak permintaan suara."}.
|
||||
{"ejabberd HTTP Upload service","Layanan HTTP Upload ejabberd"}.
|
||||
{"ejabberd MUC module","Modul MUC ejabberd"}.
|
||||
{"ejabberd Multicast service","Layanan Multicast ejabberd"}.
|
||||
@@ -135,8 +141,10 @@
|
||||
{"Enter path to jabberd14 spool file","Masukkan path ke file jabberd14 spool"}.
|
||||
{"Enter path to text file","Masukkan path ke file teks"}.
|
||||
{"Enter the text you see","Masukkan teks yang Anda lihat"}.
|
||||
{"Erlang XMPP Server","Server Erlang XMPP"}.
|
||||
{"Error","Kesalahan"}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Kecualikan Jabber IDs dari tantangan CAPTCHA"}.
|
||||
{"Export all tables as SQL queries to a file:","Ekspor semua tabel sebagai kueri SQL ke file:"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Ekspor data dari semua pengguna pada layanan ke berkas PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Ekspor data pengguna pada sebuah host ke berkas PIEFXIS (XEP-0227):"}.
|
||||
{"External component failure","Kegagalan komponen eksternal"}.
|
||||
@@ -149,6 +157,7 @@
|
||||
{"FAQ Entry","Entri FAQ"}.
|
||||
{"February","Februari"}.
|
||||
{"File larger than ~w bytes","File lebih besar dari ~w bytes"}.
|
||||
{"Fill in the form to search for any matching XMPP User","Isi kolom untuk mencari pengguna XMPP"}.
|
||||
{"Friday","Jumat"}.
|
||||
{"From ~ts","Dari ~ts"}.
|
||||
{"From","Dari"}.
|
||||
@@ -161,8 +170,11 @@
|
||||
{"Get User Last Login Time","Lihat Waktu Login Terakhir Pengguna"}.
|
||||
{"Get User Password","Dapatkan User Password"}.
|
||||
{"Get User Statistics","Dapatkan Statistik Pengguna"}.
|
||||
{"Given Name","Nama"}.
|
||||
{"Grant voice to this person?","Ijinkan akses suara kepadanya?"}.
|
||||
{"Group","Grup"}.
|
||||
{"Groups that will be displayed to the members","Grup yang akan ditampilkan kepada anggota"}.
|
||||
{"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"}.
|
||||
@@ -170,17 +182,27 @@
|
||||
{"has been kicked","telah dikick"}.
|
||||
{"Host unknown","Host tidak dikenal"}.
|
||||
{"Host","Host"}.
|
||||
{"HTTP File Upload","Unggah Berkas HTTP"}.
|
||||
{"Idle connection","Koneksi menganggur"}.
|
||||
{"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"}.
|
||||
{"Import File","Impor File"}.
|
||||
{"Import user data from jabberd14 spool file:","Impor data pengguna dari sekumpulan berkas jabberd14:"}.
|
||||
{"Import User from File at ","Impor Pengguna dari File pada"}.
|
||||
{"Import User from File at ","Impor Pengguna dari File pada "}.
|
||||
{"Import users data from a PIEFXIS file (XEP-0227):","impor data-data pengguna dari sebuah PIEFXIS (XEP-0227):"}.
|
||||
{"Import users data from jabberd14 spool directory:","Импорт пользовательских данных из буферной директории jabberd14:"}.
|
||||
{"Import Users from Dir at ","Impor Pengguna dari Dir di"}.
|
||||
{"Import Users from Dir at ","Impor Pengguna dari Dir di "}.
|
||||
{"Import Users From jabberd14 Spool Files","Impor Pengguna Dari jabberd14 Spool File"}.
|
||||
{"Improper message type","Jenis pesan yang tidak benar"}.
|
||||
{"Incoming s2s Connections:","Koneksi s2s masuk:"}.
|
||||
{"Incorrect CAPTCHA submit","Isian CAPTCHA salah"}.
|
||||
{"Incorrect data form","Formulir data salah"}.
|
||||
{"Incorrect password","Kata sandi salah"}.
|
||||
{"Incorrect value of 'action' attribute","Nilai atribut 'aksi' salah"}.
|
||||
{"Incorrect value of 'action' in data form","Nilai 'tindakan' yang salah dalam formulir data"}.
|
||||
{"Insufficient privilege","Hak tidak mencukupi"}.
|
||||
{"Internal server error","Galat server internal"}.
|
||||
{"Invalid node name","Nama node tidak valid"}.
|
||||
{"IP addresses","Alamat IP"}.
|
||||
{"is now known as","sekarang dikenal sebagai"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi jenis \"groupchat \""}.
|
||||
@@ -205,7 +227,6 @@
|
||||
{"Make room persistent","Buat ruangan menjadi permanent"}.
|
||||
{"Make room public searchable","Buat ruangan dapat dicari"}.
|
||||
{"March","Maret"}.
|
||||
{"Max # of items to persist","Max item untuk bertahan"}.
|
||||
{"Max payload size in bytes","Max kapasitas ukuran dalam bytes"}.
|
||||
{"Maximum Number of Occupants","Maksimum Jumlah Penghuni"}.
|
||||
{"May","Mei"}.
|
||||
@@ -217,15 +238,17 @@
|
||||
{"Moderator privileges required","Hak istimewa moderator dibutuhkan"}.
|
||||
{"Modified modules","Modifikasi modul-modul"}.
|
||||
{"Monday","Senin"}.
|
||||
{"Multiple <item/> elements are not allowed by RFC6121","Beberapa elemen <item/> tidak diizinkan oleh RFC6121"}.
|
||||
{"Name","Nama"}.
|
||||
{"Name:","Nama:"}.
|
||||
{"Never","Tidak Pernah"}.
|
||||
{"New Password:","Password Baru:"}.
|
||||
{"Nickname Registration at ","Pendaftaran Julukan pada"}.
|
||||
{"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"}.
|
||||
{"No <forwarded/> element found","Tidak ada elemen <forwarded/> yang ditemukan"}.
|
||||
{"No limit","Tidak terbatas"}.
|
||||
{"Node ID","ID Node"}.
|
||||
{"Node not found","Node tidak ditemukan"}.
|
||||
@@ -259,28 +282,45 @@
|
||||
{"Outgoing s2s Connections:","Koneksi s2s yang keluar:"}.
|
||||
{"Owner privileges required","Hak istimewa owner dibutuhkan"}.
|
||||
{"Packet","Paket"}.
|
||||
{"Participant","Partisipan"}.
|
||||
{"Password Verification:","Verifikasi Kata Sandi:"}.
|
||||
{"Password Verification","Verifikasi Sandi"}.
|
||||
{"Password:","Kata Sandi:"}.
|
||||
{"Password","Sandi"}.
|
||||
{"Path to Dir","Jalur ke Dir"}.
|
||||
{"Path to File","Jalur ke File"}.
|
||||
{"Payload type","Tipe payload"}.
|
||||
{"Pending","Tertunda"}.
|
||||
{"Period: ","Periode:"}.
|
||||
{"Period: ","Periode: "}.
|
||||
{"Persist items to storage","Pertahankan item ke penyimpanan"}.
|
||||
{"Persistent","Persisten"}.
|
||||
{"Ping query is incorrect","Kueri ping salah"}.
|
||||
{"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"}.
|
||||
{"Present real Jabber IDs to","Tampilkan Jabber ID secara lengkap"}.
|
||||
{"Previous session not found","Sesi sebelumnya tidak ditemukan"}.
|
||||
{"Previous session PID has been killed","Sesi PID sebelumnya telah dimatikan"}.
|
||||
{"Previous session PID has exited","Sesi PID sebelumnya telah keluar"}.
|
||||
{"Previous session PID is dead","Sesi PID sebelumnya mati"}.
|
||||
{"Previous session timed out","Sesi sebelumnya habis waktu"}.
|
||||
{"private, ","pribadi, "}.
|
||||
{"Public","Publik"}.
|
||||
{"Publish model","Model penerbitan"}.
|
||||
{"Publish-Subscribe","Setujui-Pertemanan"}.
|
||||
{"PubSub subscriber request","Permintaan pertemanan PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Bersihkan semua item ketika penerbit yang relevan telah offline"}.
|
||||
{"Queries to the conference members are not allowed in this room","Permintaan untuk para anggota konferensi tidak diperbolehkan di ruangan ini"}.
|
||||
{"Query to another users is forbidden","Kueri ke pengguna lain dilarang"}.
|
||||
{"RAM and disc copy","RAM dan disc salinan"}.
|
||||
{"RAM copy","Salinan RAM"}.
|
||||
{"Really delete message of the day?","Benar-benar ingin menghapus pesan harian?"}.
|
||||
{"Receive notification from all descendent nodes","Terima notifikasi dari semua node turunan"}.
|
||||
{"Receive notification from direct child nodes only","Terima notifikasi dari child node saja"}.
|
||||
{"Receive notification of new items only","Terima notifikasi dari item baru saja"}.
|
||||
{"Receive notification of new nodes only","Terima notifikasi dari node baru saja"}.
|
||||
{"Recipient is not in the conference room","Penerima tidak berada di ruangan konferensi"}.
|
||||
{"Register an XMPP account","Daftarkan sebuah akun XMPP"}.
|
||||
{"Registered Users","Pengguna Terdaftar"}.
|
||||
{"Registered Users:","Pengguna Terdaftar:"}.
|
||||
{"Register","Mendaftar"}.
|
||||
@@ -289,28 +329,39 @@
|
||||
{"Remove User","Hapus Pengguna"}.
|
||||
{"Remove","Menghapus"}.
|
||||
{"Replaced by new connection","Diganti dengan koneksi baru"}.
|
||||
{"Request has timed out","Waktu permintaan telah habis"}.
|
||||
{"Request is ignored","Permintaan diabaikan"}.
|
||||
{"Requested role","Peran yang diminta"}.
|
||||
{"Resources","Sumber daya"}.
|
||||
{"Restart Service","Restart Layanan"}.
|
||||
{"Restart","Jalankan Ulang"}.
|
||||
{"Restore Backup from File at ","Kembalikan Backup dari File pada"}.
|
||||
{"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"}.
|
||||
{"Roles that May Send Private Messages","Peran yang Dapat Mengirim Pesan Pribadi"}.
|
||||
{"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 terminates","Ruang dihentikan"}.
|
||||
{"Room title","Nama Ruangan"}.
|
||||
{"Roster groups allowed to subscribe","Kelompok kontak yang diizinkan untuk berlangganan"}.
|
||||
{"Roster of ~ts","Daftar ~ts"}.
|
||||
{"Roster size","Ukuran Daftar Kontak"}.
|
||||
{"Roster:","Daftar:"}.
|
||||
{"RPC Call Error","Panggilan Kesalahan RPC"}.
|
||||
{"Running Nodes","Menjalankan Node"}.
|
||||
{"~s invites you to the room ~s","~s mengundang anda masuk kamar ~s"}.
|
||||
{"Saturday","Sabtu"}.
|
||||
{"Script check","Periksa naskah"}.
|
||||
{"Search Results for ","Hasil Pencarian untuk"}.
|
||||
{"Search users in ","Pencarian pengguna dalam"}.
|
||||
{"Search from the date","Cari dari tanggal"}.
|
||||
{"Search Results for ","Hasil Pencarian untuk "}.
|
||||
{"Search the text","Cari teks"}.
|
||||
{"Search until the date","Cari sampai tanggal"}.
|
||||
{"Search users in ","Pencarian pengguna dalam "}.
|
||||
{"Select All","Pilih Semua"}.
|
||||
{"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"}.
|
||||
@@ -323,9 +374,11 @@
|
||||
{"Show Integral Table","Tampilkan Tabel Terpisah"}.
|
||||
{"Show Ordinary Table","Tampilkan Tabel Normal"}.
|
||||
{"Shut Down Service","Shut Down Layanan"}.
|
||||
{"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}.
|
||||
{"Specify the access model","Tentukan model akses"}.
|
||||
{"Specify the event message type","Tentukan jenis acara pesan"}.
|
||||
{"Specify the publisher model","Tentukan model penerbitan"}.
|
||||
{"Stanza ID","ID Stanza"}.
|
||||
{"Statistics of ~p","statistik dari ~p"}.
|
||||
{"Statistics","Statistik"}.
|
||||
{"Stop","Hentikan"}.
|
||||
@@ -333,18 +386,35 @@
|
||||
{"Storage Type","Jenis Penyimpanan"}.
|
||||
{"Store binary backup:","Penyimpanan cadangan yang berpasangan:"}.
|
||||
{"Store plain text backup:","Simpan cadangan teks biasa:"}.
|
||||
{"Stream management is already enabled","Manajemen stream sudah diaktifkan"}.
|
||||
{"Stream management is not enabled","Manajemen stream tidak diaktifkan"}.
|
||||
{"Subject","Subyek"}.
|
||||
{"Submit","Serahkan"}.
|
||||
{"Submitted","Ulangi masukan"}.
|
||||
{"Subscriber Address","Alamat Pertemanan"}.
|
||||
{"Subscribers may publish","Pelanggan dapat mempublikasikan"}.
|
||||
{"Subscription","Berlangganan"}.
|
||||
{"Subscriptions are not allowed","Langganan tidak diperbolehkan"}.
|
||||
{"Sunday","Minggu"}.
|
||||
{"Text associated with a picture","Teks yang terkait dengan gambar"}.
|
||||
{"Text associated with a sound","Teks yang terkait dengan suara"}.
|
||||
{"Text associated with a video","Teks yang terkait dengan video"}.
|
||||
{"Text associated with speech","Teks yang terkait dengan ucapan"}.
|
||||
{"That nickname is already in use by another occupant","Julukan itu sudah digunakan oleh penghuni lain"}.
|
||||
{"That nickname is registered by another person","Julukan tersebut telah didaftarkan oleh orang lain"}.
|
||||
{"The account was not unregistered","Akun tidak terdaftar"}.
|
||||
{"The CAPTCHA is valid.","Captcha ini benar."}.
|
||||
{"The CAPTCHA verification has failed","Verifikasi CAPTCHA telah gagal"}.
|
||||
{"The captcha you entered is wrong","Isian captcha yang anda masukkan salah"}.
|
||||
{"The collections with which a node is affiliated","Koleksi dengan yang berafiliasi dengan sebuah node"}.
|
||||
{"The JID of the node creator","JID dari pembuat node"}.
|
||||
{"The JIDs of those to contact with questions","JID dari mereka untuk dihubungi dengan pertanyaan"}.
|
||||
{"The JIDs of those with an affiliation of owner","JID dari mereka yang memiliki afiliasi pemilik"}.
|
||||
{"The JIDs of those with an affiliation of publisher","JID dari mereka yang memiliki afiliasi penerbit"}.
|
||||
{"The name of the node","Nama node"}.
|
||||
{"The node is a collection node","Node adalah node koleksi"}.
|
||||
{"The node is a leaf node (default)","Node adalah leaf node (default)"}.
|
||||
{"The NodeID of the relevant node","NodeID dari node yang relevan"}.
|
||||
{"The number of subscribers to the node","Jumlah pendaftar di node"}.
|
||||
{"The number of unread or undelivered messages","Jumlah pesan yang belum dibaca atau tidak terkirim"}.
|
||||
{"The password contains unacceptable characters","Kata sandi mengandung karakter yang tidak dapat diterima"}.
|
||||
@@ -354,8 +424,9 @@
|
||||
{"The passwords are different","Kata sandi berbeda"}.
|
||||
{"There was an error changing the password: ","Ada kesalahan saat merubah kata kunci: "}.
|
||||
{"There was an error creating the account: ","Ada kesalahan saat membuat akun: "}.
|
||||
{"There was an error deleting the account: ","Ada kesalahan saat menghapus akun:"}.
|
||||
{"There was an error deleting the account: ","Ada kesalahan saat menghapus akun: "}.
|
||||
{"This room is not anonymous","Ruangan ini tidak dikenal"}.
|
||||
{"This service can not process the address: ~s","Layanan ini tidak dapat memproses alamat: ~s"}.
|
||||
{"Thursday","Kamis"}.
|
||||
{"Time delay","Waktu tunda"}.
|
||||
{"Time","Waktu"}.
|
||||
@@ -363,10 +434,13 @@
|
||||
{"To ~ts","Kepada ~ts"}.
|
||||
{"Token TTL","TTL Token"}.
|
||||
{"To","Kepada"}.
|
||||
{"Too many active bytestreams","Terlalu banyak bytestream aktif"}.
|
||||
{"Too many CAPTCHA requests","Terlalu banyak permintaan CAPTCHA"}.
|
||||
{"Too many child elements","Terlalu banyak elemen turunan"}.
|
||||
{"Too many <item/> elements","Terlalu banyak <item/> elemen"}.
|
||||
{"Too many <list/> elements","Terlalu banyak <list/> elemen"}.
|
||||
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Terlalu banyak (~p) percobaan otentifikasi yang gagal dari alamat IP (~s). Alamat akan di unblok pada ~s UTC"}.
|
||||
{"Too many receiver fields were specified","Terlalu banyak bidang penerima yang ditentukan"}.
|
||||
{"Too many users in this conference","Terlalu banyak pengguna di grup ini"}.
|
||||
{"Total rooms","Total kamar"}.
|
||||
{"Traffic rate limit is exceeded","Batas tingkat lalu lintas terlampaui"}.
|
||||
@@ -377,6 +451,7 @@
|
||||
{"~ts's Offline Messages Queue","~ts's antrian Pesan Offline"}.
|
||||
{"Tuesday","Selasa"}.
|
||||
{"Unable to generate a CAPTCHA","Tidak dapat menghasilkan CAPTCHA"}.
|
||||
{"Unable to register route on existing local domain","Tidak dapat mendaftarkan rute di domain lokal yang ada"}.
|
||||
{"Unauthorized","Ditolak"}.
|
||||
{"Unexpected action","Aksi yang tidak diharapkan"}.
|
||||
{"Unexpected error condition: ~p","Kondisi kerusakan yang tidak diduga: ~p"}.
|
||||
@@ -414,7 +489,7 @@
|
||||
{"vCard User Search","vCard Pencarian Pengguna"}.
|
||||
{"View Queue","Lihat antrian"}.
|
||||
{"View Roster","Lihat daftar kontak"}.
|
||||
{"Virtual Hosts","Virtual Hosts"}.
|
||||
{"Virtual Hosts","Host Virtual"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Tamu tidak diperbolehkan untuk mengubah nama panggilan di ruangan ini"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Tamu tidak diperbolehkan untuk mengirim pesan ke semua penghuni"}.
|
||||
{"Visitor","Tamu"}.
|
||||
@@ -428,11 +503,14 @@
|
||||
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","Apakah entitas ingin menerima ringkasan(agregasi) pemberitahuan atau semua pemberitahuan satu per satu"}.
|
||||
{"Whether an entity wants to receive or disable notifications","Apakah entitas ingin menerima atau menonaktifkan pemberitahuan"}.
|
||||
{"Whether owners or publisher should receive replies to items","Apakah pemilik atau penerbit harus menerima balasan dari item"}.
|
||||
{"Whether the node is a leaf (default) or a collection","Apakah node adalah leaf (default) atau koleksi"}.
|
||||
{"Whether to allow subscriptions","Apakah diperbolehkan untuk berlangganan"}.
|
||||
{"Whether to make all subscriptions temporary, based on subscriber presence","Apakah akan menjadikan semua langganan sementara, berdasarkan keberadaan pelanggan"}.
|
||||
{"Whether to notify owners about new subscribers and unsubscribes","Apakah akan memberi tahu pemilik tentang pelanggan baru dan berhenti berlangganan"}.
|
||||
{"Who may associate leaf nodes with a collection","Siapa yang dapat mengaitkan leaf node dengan koleksi"}.
|
||||
{"Wrong parameters in the web formulary","Parameter yang salah di formula web"}.
|
||||
{"Wrong xmlns","xmlns salah"}.
|
||||
{"XMPP Account Registration","Pendaftaran Akun XMPP"}.
|
||||
{"XMPP Domains","Domain XMPP"}.
|
||||
{"XMPP Show Value of Away","XMPP menunjukkan status Away"}.
|
||||
{"XMPP Show Value of Chat","XMPP menunjukkan status Chat"}.
|
||||
|
||||
+1
-1
@@ -3,6 +3,7 @@
|
||||
%% To improve translations please read:
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (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"}.
|
||||
{" has set the subject to: "," ha modificato l'oggetto in: "}.
|
||||
{"A friendly name for the node","Un nome comodo per il nodo"}.
|
||||
{"A password is required to enter this room","Per entrare in questa stanza è prevista una password"}.
|
||||
@@ -144,7 +145,6 @@
|
||||
{"Make room persistent","Rendere la stanza persistente"}.
|
||||
{"Make room public searchable","Rendere la sala visibile al pubblico"}.
|
||||
{"March","Marzo"}.
|
||||
{"Max # of items to persist","Numero massimo di elementi da conservare persistentemente"}.
|
||||
{"Max payload size in bytes","Dimensione massima del contenuto del messaggio in byte"}.
|
||||
{"Maximum Number of Occupants","Numero massimo di occupanti"}.
|
||||
{"May","Maggio"}.
|
||||
|
||||
@@ -191,7 +191,6 @@
|
||||
{"Make room public searchable","チャットルームを検索可"}.
|
||||
{"Malformed username","不正な形式のユーザー名"}.
|
||||
{"March","3月"}.
|
||||
{"Max # of items to persist","アイテムの最大保存数"}.
|
||||
{"Max payload size in bytes","最大ぺイロードサイズ (byte)"}.
|
||||
{"Maximum file size","最大ファイルサイズ"}.
|
||||
{"Maximum Number of Occupants","最大在室者数"}.
|
||||
@@ -367,7 +366,6 @@
|
||||
{"The password of your XMPP account was successfully changed.","XMPP アカウントのパスワード変更に成功しました。"}.
|
||||
{"The password was not changed","このパスワードは変更されませんでした"}.
|
||||
{"The passwords are different","このパスワードが違います"}.
|
||||
{"The username is not valid","ユーザー名が正しくありません"}.
|
||||
{"There was an error creating the account: ","アカウントの作成中にエラーが発生しました: "}.
|
||||
{"There was an error deleting the account: ","アカウントの削除中にエラーが発生しました: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","大文字と小文字は区別しません: macbeth は MacBeth や Macbeth と同じです。"}.
|
||||
|
||||
@@ -150,7 +150,6 @@
|
||||
{"Make room persistent","Chatruimte blijvend maken"}.
|
||||
{"Make room public searchable","Chatruimte doorzoekbaar maken"}.
|
||||
{"March","Maart"}.
|
||||
{"Max # of items to persist","Maximum aantal in het geheugen te bewaren items"}.
|
||||
{"Max payload size in bytes","Maximumgrootte van bericht in bytes"}.
|
||||
{"Maximum Number of Occupants","Maximum aantal aanwezigen"}.
|
||||
{"May","Mei"}.
|
||||
|
||||
@@ -165,7 +165,6 @@
|
||||
{"Make room persistent","Gjør rommet vedvarende"}.
|
||||
{"Make room public searchable","Gjør rommet offentlig søkbart"}.
|
||||
{"March","mars"}.
|
||||
{"Max # of items to persist","Høyeste # elementer som skal lagres"}.
|
||||
{"Maximum file size","Maksimal filstørrelse"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Maksimalt antall historikkmeldinger tilbudt av rommet"}.
|
||||
{"May","mai"}.
|
||||
@@ -333,7 +332,6 @@
|
||||
{"The query must not contain <item/> elements","Spørringen kan ikke inneholde <item/>-elementer"}.
|
||||
{"The room subject can be modified by participants","Romemnet kan endres av dets deltagere"}.
|
||||
{"The sender of the last received message","Avsender for sist mottatte melding"}.
|
||||
{"The username is not valid","Brukernavnet er ikke gyldig"}.
|
||||
{"There was an error creating the account: ","En feil inntraff under oppretting av kontoen: "}.
|
||||
{"There was an error deleting the account: ","En feil inntraff under sletting av kontoen: "}.
|
||||
{"This room is not anonymous","Dette rommet er ikke anonymt"}.
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
{"Make room public searchable","Pozwól wyszukiwać pokój"}.
|
||||
{"Malformed username","Nieprawidłowa nazwa użytkownika"}.
|
||||
{"March","Marzec"}.
|
||||
{"Max # of items to persist","Maksymalna liczba przechowywanych przedmiotów"}.
|
||||
{"Max payload size in bytes","Maksymalna wielkość powiadomienia w bajtach"}.
|
||||
{"Maximum Number of Occupants","Maksymalna liczba uczestników"}.
|
||||
{"May","Maj"}.
|
||||
|
||||
+11
-4
@@ -20,6 +20,7 @@
|
||||
{"Access model","Modelo de acesso"}.
|
||||
{"Account doesn't exist","A conta não existe"}.
|
||||
{"Action on user","Ação no usuário"}.
|
||||
{"Add a hat to a user","Adiciona um chapéu num usuário"}.
|
||||
{"Add Jabber ID","Adicionar ID jabber"}.
|
||||
{"Add New","Adicionar novo"}.
|
||||
{"Add User","Adicionar usuário"}.
|
||||
@@ -136,6 +137,7 @@
|
||||
{"Elements","Elementos"}.
|
||||
{"Email Address","Endereço de e-mail"}.
|
||||
{"Email","Email"}.
|
||||
{"Enable hats","Ativa chapéus"}.
|
||||
{"Enable logging","Permitir criação de logs"}.
|
||||
{"Enable message archiving","Habilitar arquivamento de mensagens"}.
|
||||
{"Enabling push without 'node' attribute is not supported","Abilitar push sem o atributo 'node' não é suportado"}.
|
||||
@@ -186,6 +188,9 @@
|
||||
{"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}.
|
||||
{"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"}.
|
||||
{"Hat title","Título do chapéu"}.
|
||||
{"Hat URI","URI do chapéu"}.
|
||||
{"Hats limit exceeded","O limite dos chapéus foi excedido"}.
|
||||
{"Host unknown","Máquina desconhecida"}.
|
||||
{"Host","Máquina"}.
|
||||
{"HTTP File Upload","Upload de arquivo HTTP"}.
|
||||
@@ -237,6 +242,8 @@
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Bits menos significativos do hash sha-256 do texto devem ser iguais ao rótulo hexadecimal"}.
|
||||
{"leaves the room","Sair da sala"}.
|
||||
{"List of rooms","Lista de salas"}.
|
||||
{"List of users with hats","Lista os usuários com chapéus"}.
|
||||
{"List users with hats","Lista os usuários com chapéus"}.
|
||||
{"Logging","Registrando no log"}.
|
||||
{"Low level update script","Script de atualização low level"}.
|
||||
{"Make participants list public","Tornar pública a lista de participantes"}.
|
||||
@@ -249,7 +256,7 @@
|
||||
{"Malformed username","Nome de usuário inválido"}.
|
||||
{"MAM preference modification denied by service policy","Modificação de preferência MAM negada por causa da política de serviços"}.
|
||||
{"March","Março"}.
|
||||
{"Max # of items to persist","Máximo # de elementos que persistem"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Máximo # de itens para persistir ou `max` para nenhum limite específico que não seja um servidor imposto como máximo"}.
|
||||
{"Max payload size in bytes","Máximo tamanho do payload em bytes"}.
|
||||
{"Maximum file size","Tamanho máximo do arquivo"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Quantidade máxima das mensagens do histórico que foram devolvidas por sala"}.
|
||||
@@ -340,7 +347,7 @@
|
||||
{"Number of Offline Messages","Quantidade das mensagens offline"}.
|
||||
{"Number of online users","Número de usuários online"}.
|
||||
{"Number of registered users","Número de usuários registrados"}.
|
||||
{"Number of seconds after which to automatically purge items","Quantidade de segundos para excluir os itens automaticamente"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Quantidade de segundos após limpar automaticamente os itens ou `max` para nenhum limite específico que não seja um servidor imposto máximo"}.
|
||||
{"Occupants are allowed to invite others","As pessoas estão autorizadas a convidar outras pessoas"}.
|
||||
{"Occupants May Change the Subject","As pessoas talvez possam alterar o assunto"}.
|
||||
{"October","Outubro"}.
|
||||
@@ -419,6 +426,7 @@
|
||||
{"Registered Users","Usuários Registrados"}.
|
||||
{"Register","Registrar"}.
|
||||
{"Remote copy","Cópia remota"}.
|
||||
{"Remove a hat from a user","Remove um chapéu de um usuário"}.
|
||||
{"Remove All Offline Messages","Remover Todas as Mensagens Offline"}.
|
||||
{"Remove User","Remover usuário"}.
|
||||
{"Remove","Remover"}.
|
||||
@@ -520,7 +528,7 @@
|
||||
{"The JIDs of those with an affiliation of owner","Os JIDs daqueles com uma afiliação de proprietário"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Os JIDs daqueles com uma afiliação de editor"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","A lista dos JIDs que podem associar as páginas dos nós em uma coleção"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection","A quantidade máxima dos nós relacionados que podem ser associados com uma coleção"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","A quantidade máxima de nós relacionados que podem ser associados a uma coleção ou `máximo` para nenhum limite específico que não seja um servidor imposto no máximo"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","O número mínimo de milissegundos entre o envio do resumo das duas notificações"}.
|
||||
{"The name of the node","O nome do nó"}.
|
||||
{"The node is a collection node","O nó é um nó da coleção"}.
|
||||
@@ -545,7 +553,6 @@
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","O tipo dos dados do nó, normalmente definido pelo espaço dos nomes da carga útil (caso haja)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","O URL da transformação XSL que pode ser aplicada nas cargas úteis para gerar um elemento apropriado no corpo da mensagem."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","A URL de uma transformação XSL que pode ser aplicada ao formato de carga útil para gerar um Formulário de Dados válido onde o cliente possa exibir usando um mecanismo genérico de renderização do Formulários de Dados"}.
|
||||
{"The username is not valid","O nome do usuário não é válido"}.
|
||||
{"There was an error changing the password: ","Houve um erro ao alterar 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: "}.
|
||||
|
||||
+567
-1
@@ -3,103 +3,669 @@
|
||||
%% To improve translations please read:
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (Adicione * no final do campo para combinar com a substring)"}.
|
||||
{" has set the subject to: "," colocou o tópico: "}.
|
||||
{"# participants","# participantes"}.
|
||||
{"A description of the node","Uma descrição do nó"}.
|
||||
{"A friendly name for the node","Um nome familiar para o nó"}.
|
||||
{"A password is required to enter this room","Se necessita palavra-passe para entrar nesta sala"}.
|
||||
{"A Web Page","Uma página da web"}.
|
||||
{"Accept","Aceito"}.
|
||||
{"Access denied by service policy","Acesso negado pela política de serviço"}.
|
||||
{"Access model of authorize","Modelo de acesso da autorização"}.
|
||||
{"Access model of open","Modelo para acesso aberto"}.
|
||||
{"Access model of presence","Modelo para acesso presença"}.
|
||||
{"Access model of roster","Modelo para acesso lista"}.
|
||||
{"Access model of whitelist","Modelo de acesso da lista branca"}.
|
||||
{"Access model","Modelo de acesso"}.
|
||||
{"Account doesn't exist","A conta não existe"}.
|
||||
{"Action on user","Acção no utilizador"}.
|
||||
{"Add a hat to a user","Adiciona um chapéu num utilizador"}.
|
||||
{"Add Jabber ID","Adicionar ID jabber"}.
|
||||
{"Add New","Adicionar novo"}.
|
||||
{"Add User","Adicionar utilizador"}.
|
||||
{"Administration of ","Administração de "}.
|
||||
{"Administration","Administração"}.
|
||||
{"Administrator privileges required","São necessários privilégios de administrador"}.
|
||||
{"All activity","Todas atividades"}.
|
||||
{"All Users","Todos os utilizadores"}.
|
||||
{"Allow subscription","Permitir a assinatura"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","Autorizar este Jabber ID para a inscrição neste tópico pubsub?"}.
|
||||
{"Allow this person to register with the room?","Permita que esta pessoa se registe na sala?"}.
|
||||
{"Allow users to change the subject","Permitir a utilizadores modificar o assunto"}.
|
||||
{"Allow users to query other users","Permitir a utilizadores pesquisar informações sobre os demais"}.
|
||||
{"Allow users to send invites","Permitir a utilizadores envio de convites"}.
|
||||
{"Allow users to send private messages","Permitir a utilizadores enviarem mensagens privadas"}.
|
||||
{"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 estado aos visitantes"}.
|
||||
{"Allow visitors to send voice requests","Permitir aos visitantes o envio de requisições de voz"}.
|
||||
{"An associated LDAP group that defines room membership; this should be an LDAP Distinguished Name according to an implementation-specific or deployment-specific definition of a group.","Um grupo LDAP associado que define a adesão à sala; este deve ser um Nome Distinto LDAP de acordo com uma definição específica da implementação ou da implantação específica de um grupo."}.
|
||||
{"Announcements","Anúncios"}.
|
||||
{"Answer associated with a picture","Resposta associada com uma foto"}.
|
||||
{"Answer associated with a video","Resposta associada com um vídeo"}.
|
||||
{"Answer associated with speech","Resposta associada com a fala"}.
|
||||
{"Answer to a question","Resposta para uma pergunta"}.
|
||||
{"Anyone in the specified roster group(s) may subscribe and retrieve items","Qualquer pessoa do(s) grupo(s) informado(s) podem se inscrever e recuperar itens"}.
|
||||
{"Anyone may associate leaf nodes with the collection","Qualquer pessoa pode associar nós das páginas à coleção"}.
|
||||
{"Anyone may publish","Qualquer pessoa pode publicar"}.
|
||||
{"Anyone may subscribe and retrieve items","Qualquer pessoa pode se inscrever e recuperar os itens"}.
|
||||
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualquer pessoa com uma assinatura presente dos dois ou de ambos pode se inscrever e recuperar os itens"}.
|
||||
{"Anyone with Voice","Qualquer pessoa com voz"}.
|
||||
{"Anyone","Qualquer pessoa"}.
|
||||
{"April","Abril"}.
|
||||
{"Attribute 'channel' is required for this request","O atributo 'canal' é necessário para esta solicitação"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","O atributo 'id' é obrigatório para mensagens MIX"}.
|
||||
{"Attribute 'jid' is not allowed here","O atributo 'jid' não é permitido aqui"}.
|
||||
{"Attribute 'node' is not allowed here","O Atributo 'nó' não é permitido aqui"}.
|
||||
{"Attribute 'to' of stanza that triggered challenge","O atributo 'para' da estrofe que desencadeou o desafio"}.
|
||||
{"August","Agosto"}.
|
||||
{"Automatic node creation is not enabled","Criação automatizada de nós está desativada"}.
|
||||
{"Backup Management","Gestão de cópias de segurança"}.
|
||||
{"Backup of ~p","Backup de ~p"}.
|
||||
{"Backup to File at ","Guardar cópia de segurança para ficheiro em "}.
|
||||
{"Backup","Guardar cópia de segurança"}.
|
||||
{"Bad format","Formato incorreto"}.
|
||||
{"Birthday","Data de nascimento"}.
|
||||
{"Both the username and the resource are required","Nome de utilizador e recurso são necessários"}.
|
||||
{"Bytestream already activated","Bytestream já foi ativado"}.
|
||||
{"Cannot remove active list","Não é possível remover uma lista ativa"}.
|
||||
{"Cannot remove default list","Não é possível remover uma lista padrão"}.
|
||||
{"CAPTCHA web page","CAPTCHA web page"}.
|
||||
{"Challenge ID","ID do desafio"}.
|
||||
{"Change Password","Mudar palavra-chave"}.
|
||||
{"Change User Password","Alterar Palavra-passe do Utilizador"}.
|
||||
{"Changing password is not allowed","Não é permitida a alteração da palavra-passe"}.
|
||||
{"Changing role/affiliation is not allowed","Não é permitida a alteração da função/afiliação"}.
|
||||
{"Channel already exists","O canal já existe"}.
|
||||
{"Channel does not exist","O canal não existe"}.
|
||||
{"Channels","Canais"}.
|
||||
{"Characters not allowed:","Caracteres não aceitos:"}.
|
||||
{"Chatroom configuration modified","Configuração da sala de bate-papo modificada"}.
|
||||
{"Chatroom is created","A sala de chat está criada"}.
|
||||
{"Chatroom is destroyed","A sala de chat está destruída"}.
|
||||
{"Chatroom is started","A sala de chat está iniciada"}.
|
||||
{"Chatroom is stopped","A sala de chat está parada"}.
|
||||
{"Chatrooms","Salas de Chat"}.
|
||||
{"Choose a username and password to register with this server","Escolha um nome de utilizador e palavra-chave para se registar neste servidor"}.
|
||||
{"Choose storage type of tables","Seleccione o tipo de armazenagem das tabelas"}.
|
||||
{"Choose whether to approve this entity's subscription.","Aprovar esta assinatura."}.
|
||||
{"City","Cidade"}.
|
||||
{"Client acknowledged more stanzas than sent by server","O cliente reconheceu mais estrofes do que as enviadas pelo servidor"}.
|
||||
{"Commands","Comandos"}.
|
||||
{"Conference room does not exist","A sala não existe"}.
|
||||
{"Configuration of room ~s","Configuração para ~s"}.
|
||||
{"Configuration","Configuração"}.
|
||||
{"Connected Resources:","Recursos conectados:"}.
|
||||
{"Contact Addresses (normally, room owner or owners)","Endereços de contato (normalmente, o proprietário ou os proprietários da sala)"}.
|
||||
{"Country","País"}.
|
||||
{"CPU Time:","Tempo da CPU:"}.
|
||||
{"Current Discussion Topic","Assunto em discussão"}.
|
||||
{"Database failure","Falha no banco 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","Utilizadores padrões como participantes"}.
|
||||
{"Delete content","Apagar o conteúdo"}.
|
||||
{"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 Selected","Eliminar os seleccionados"}.
|
||||
{"Delete table","Apagar a tabela"}.
|
||||
{"Delete User","Deletar Utilizador"}.
|
||||
{"Deliver event notifications","Entregar as notificações de evento"}.
|
||||
{"Deliver payloads with event notifications","Enviar payloads junto com as notificações de eventos"}.
|
||||
{"Description:","Descrição:"}.
|
||||
{"Disc only copy","Cópia apenas em disco"}.
|
||||
{"'Displayed groups' not added (they do not exist!): ","Os 'Grupos exibidos' não foi adicionado (eles não existem!): "}.
|
||||
{"Displayed:","Exibido:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Não revele a sua palavra-passe a ninguém, nem mesmo para o administrador deste servidor XMPP."}.
|
||||
{"Dump Backup to Text File at ","Exporta cópia de segurança para ficheiro de texto em "}.
|
||||
{"Dump to Text File","Exportar para ficheiro de texto"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","Os grupos duplicados não são permitidos pela RFC6121"}.
|
||||
{"Dynamically specify a replyto of the item publisher","Definir de forma dinâmica uma resposta da editora do item"}.
|
||||
{"Edit Properties","Editar propriedades"}.
|
||||
{"Either approve or decline the voice request.","Deve aprovar/desaprovar a requisição de voz."}.
|
||||
{"ejabberd HTTP Upload service","serviço HTTP de upload ejabberd"}.
|
||||
{"ejabberd MUC module","Módulo MUC de ejabberd"}.
|
||||
{"ejabberd Multicast service","Serviço multicast ejabberd"}.
|
||||
{"ejabberd Publish-Subscribe module","Módulo para Publicar Tópicos do ejabberd"}.
|
||||
{"ejabberd SOCKS5 Bytestreams module","Modulo ejabberd SOCKS5 Bytestreams"}.
|
||||
{"ejabberd vCard module","Módulo vCard de ejabberd"}.
|
||||
{"ejabberd Web Admin","ejabberd Web Admin"}.
|
||||
{"ejabberd","ejabberd"}.
|
||||
{"Elements","Elementos"}.
|
||||
{"Email Address","Endereço de e-mail"}.
|
||||
{"Email","Email"}.
|
||||
{"Enable hats","Ativa chapéus"}.
|
||||
{"Enable logging","Permitir criação de logs"}.
|
||||
{"Enable message archiving","Ativar arquivamento de mensagens"}.
|
||||
{"Enabling push without 'node' attribute is not supported","Abilitar push sem o atributo 'node' não é suportado"}.
|
||||
{"End User Session","Terminar Sessão do Utilizador"}.
|
||||
{"Enter nickname you want to register","Introduza a alcunha que quer registar"}.
|
||||
{"Enter path to backup file","Introduza o caminho do ficheiro de cópia de segurança"}.
|
||||
{"Enter path to jabberd14 spool dir","Introduza o caminho para o directório de spools do jabberd14"}.
|
||||
{"Enter path to jabberd14 spool file","Introduza o caminho para o ficheiro de spool do jabberd14"}.
|
||||
{"Enter path to text file","Introduza caminho para o ficheiro de texto"}.
|
||||
{"Enter the text you see","Insira o texto que vê"}.
|
||||
{"Erlang XMPP Server","Servidor XMPP Erlang"}.
|
||||
{"Error","Erro"}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Excluir IDs Jabber de serem submetidos ao CAPTCHA"}.
|
||||
{"Export all tables as SQL queries to a file:","Exportar todas as tabelas como SQL para um ficheiro:"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar todos os dados de todos os utilizadores no servidor, para ficheiros de formato PIEFXIS (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dados dos utilizadores num host, para ficheiros de PIEFXIS (XEP-0227):"}.
|
||||
{"External component failure","Falha de componente externo"}.
|
||||
{"External component timeout","Tempo esgotado à espera de componente externo"}.
|
||||
{"Failed to activate bytestream","Falha ao ativar bytestream"}.
|
||||
{"Failed to extract JID from your voice request approval","Não foi possível extrair o JID (Jabber ID) da requisição de voz"}.
|
||||
{"Failed to map delegated namespace to external component","Falha ao mapear namespace delegado ao componente externo"}.
|
||||
{"Failed to parse HTTP response","Falha ao analisar resposta HTTP"}.
|
||||
{"Failed to process option '~s'","Falha ao processar opção '~s'"}.
|
||||
{"Family Name","Apelido"}.
|
||||
{"FAQ Entry","Registo das perguntas frequentes"}.
|
||||
{"February","Fevereiro"}.
|
||||
{"File larger than ~w bytes","Ficheiro é maior que ~w bytes"}.
|
||||
{"Fill in the form to search for any matching XMPP User","Preencha campos para procurar por quaisquer utilizadores XMPP"}.
|
||||
{"Friday","Sexta"}.
|
||||
{"From ~ts","De ~s"}.
|
||||
{"From","De"}.
|
||||
{"Full List of Room Admins","Lista completa dos administradores das salas"}.
|
||||
{"Full List of Room Owners","Lista completa dos proprietários das salas"}.
|
||||
{"Full Name","Nome completo"}.
|
||||
{"Get Number of Online Users","Obter quantidade de utilizadores online"}.
|
||||
{"Get Number of Registered Users","Obter quantidade de utilizadores registados"}.
|
||||
{"Get Pending","Obter os pendentes"}.
|
||||
{"Get User Last Login Time","Obter a data do último login"}.
|
||||
{"Get User Password","Obter palavra-passe do utilizador"}.
|
||||
{"Get User Statistics","Obter estatísticas do utilizador"}.
|
||||
{"Given Name","Sobrenome"}.
|
||||
{"Grant voice to this person?","Dar voz a esta pessoa?"}.
|
||||
{"Group","Grupo"}.
|
||||
{"Groups that will be displayed to the members","Os grupos que serão exibidos para os membros"}.
|
||||
{"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 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"}.
|
||||
{"Hat title","Título do chapéu"}.
|
||||
{"Hat URI","URI do chapéu"}.
|
||||
{"Hats limit exceeded","O limite dos chapéus foi excedido"}.
|
||||
{"Host unknown","Máquina desconhecida"}.
|
||||
{"Host","Máquina"}.
|
||||
{"HTTP File Upload","Upload de ficheiros por HTTP"}.
|
||||
{"Idle connection","Conexão inativa"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Se não conseguir ver o CAPTCHA aqui, visite a web page."}.
|
||||
{"Import Directory","Importar directório"}.
|
||||
{"Import File","Importar ficheiro"}.
|
||||
{"Import user data from jabberd14 spool file:","Importar dados dos utilizadores de uma fila jabberd14:"}.
|
||||
{"Import User from File at ","Importar utilizador a partir do ficheiro em "}.
|
||||
{"Import users data from a PIEFXIS file (XEP-0227):","Importe os utilizadores de um ficheiro PIEFXIS (XEP-0227):"}.
|
||||
{"Import users data from jabberd14 spool directory:","Importar dados dos utilizadores de um diretório-fila jabberd14:"}.
|
||||
{"Import Users from Dir at ","Importar utilizadores a partir do directório em "}.
|
||||
{"Import Users From jabberd14 Spool Files","Importar utilizadores de ficheiros de jabberd14 (spool files)"}.
|
||||
{"Improper domain part of 'from' attribute","Atributo 'from' contém domínio incorreto"}.
|
||||
{"Improper message type","Tipo de mensagem incorrecto"}.
|
||||
{"Incoming s2s Connections:","Conexões s2s de Entrada:"}.
|
||||
{"Incorrect CAPTCHA submit","CAPTCHA submetido incorretamente"}.
|
||||
{"Incorrect data form","Formulário dos dados incorreto"}.
|
||||
{"Incorrect password","Palavra-chave incorrecta"}.
|
||||
{"Incorrect value of 'action' attribute","Valor incorreto do atributo 'action'"}.
|
||||
{"Incorrect value of 'action' in data form","Valor incorreto de 'action' no formulário de dados"}.
|
||||
{"Incorrect value of 'path' in data form","Valor incorreto de 'path' no formulário de dados"}.
|
||||
{"Insufficient privilege","Privilégio insuficiente"}.
|
||||
{"Internal server error","Erro interno do servidor"}.
|
||||
{"Invalid 'from' attribute in forwarded message","Atributo 'from' inválido na mensagem reenviada"}.
|
||||
{"Invalid node name","Nome do nó inválido"}.
|
||||
{"Invalid 'previd' value","Valor 'previd' inválido"}.
|
||||
{"Invitations are not allowed in this conference","Os convites não são permitidos nesta conferência"}.
|
||||
{"IP addresses","Endereços 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 para a sala. O membro (~s) enviou uma mensagem de erro (~s) e foi expulso da sala"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Não é permitido enviar mensagens privadas do tipo \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Impedir o envio de mensagens privadas para a sala"}.
|
||||
{"It is not allowed to send private messages","Não é permitido enviar mensagens privadas"}.
|
||||
{"Jabber ID","ID Jabber"}.
|
||||
{"January","Janeiro"}.
|
||||
{"JID normalization denied by service policy","Normalização JID negada por causa da política de serviços"}.
|
||||
{"JID normalization failed","A normalização JID falhou"}.
|
||||
{"joins the room","Entrar na sala"}.
|
||||
{"July","Julho"}.
|
||||
{"June","Junho"}.
|
||||
{"Just created","Acabou de ser criado"}.
|
||||
{"Label:","Rótulo:"}.
|
||||
{"Last Activity","Última actividade"}.
|
||||
{"Last login","Último login"}.
|
||||
{"Last message","Última mensagem"}.
|
||||
{"Last month","Último mês"}.
|
||||
{"Last year","Último ano"}.
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Bits menos significativos do hash sha-256 do texto devem ser iguais ao rótulo hexadecimal"}.
|
||||
{"leaves the room","Sair da sala"}.
|
||||
{"List of rooms","Lista de salas"}.
|
||||
{"List of users with hats","Lista os utilizadores com chapéus"}.
|
||||
{"List users with hats","Lista os utilizadores com chapéus"}.
|
||||
{"Logging","Registando no log"}.
|
||||
{"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 palavra-passe da sala"}.
|
||||
{"Make room members-only","Tornar sala apenas para membros"}.
|
||||
{"Make room moderated","Tornar a sala moderada"}.
|
||||
{"Make room password protected","Tornar sala protegida à palavra-passe"}.
|
||||
{"Make room persistent","Tornar sala persistente"}.
|
||||
{"Make room public searchable","Tornar sala pública possível de ser encontrada"}.
|
||||
{"Malformed username","Nome de utilizador inválido"}.
|
||||
{"MAM preference modification denied by service policy","Modificação de preferência MAM negada por causa da política de serviços"}.
|
||||
{"March","Março"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Máximo # de itens para persistir ou `max` para nenhum limite específico que não seja um servidor imposto como máximo"}.
|
||||
{"Max payload size in bytes","Máximo tamanho do payload em bytes"}.
|
||||
{"Maximum file size","Tamanho máximo do ficheiro"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Quantidade máxima das mensagens do histórico que foram devolvidas por sala"}.
|
||||
{"Maximum number of items to persist","Quantidade máxima dos itens para manter"}.
|
||||
{"Maximum Number of Occupants","Quantidate máxima de participantes"}.
|
||||
{"May","Maio"}.
|
||||
{"Members not added (inexistent vhost!): ","Membros que não foram adicionados (o vhost não existe!): "}.
|
||||
{"Membership is required to enter this room","É necessário ser membro desta sala para poder entrar"}.
|
||||
{"Members:","Membros:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","Memorize a sua palavra-passe ou anote-a num papel guardado num local seguro. No XMPP, não há uma maneira automatizada de recuperar a sua palavra-passe caso a esqueça."}.
|
||||
{"Memory","Memória"}.
|
||||
{"Mere Availability in XMPP (No Show Value)","Mera disponibilidade no XMPP (Sem valor para ser exibido)"}.
|
||||
{"Message body","Corpo da mensagem"}.
|
||||
{"Message not found in forwarded payload","Mensagem não encontrada em conteúdo encaminhado"}.
|
||||
{"Messages from strangers are rejected","As mensagens vindas de estranhos são rejeitadas"}.
|
||||
{"Messages of type headline","Mensagens do tipo do título"}.
|
||||
{"Messages of type normal","Mensagens do tipo normal"}.
|
||||
{"Middle Name","Segundo nome"}.
|
||||
{"Minimum interval between voice requests (in seconds)","O intervalo mínimo entre requisições de voz (em segundos)"}.
|
||||
{"Moderator privileges required","São necessários privilégios de moderador"}.
|
||||
{"Moderator","Moderador"}.
|
||||
{"Moderators Only","Somente moderadores"}.
|
||||
{"Modified modules","Módulos atualizados"}.
|
||||
{"Module failed to handle the query","Módulo falhou ao processar a consulta"}.
|
||||
{"Monday","Segunda"}.
|
||||
{"Multicast","Multicast"}.
|
||||
{"Multiple <item/> elements are not allowed by RFC6121","Vários elementos <item/> não são permitidos pela RFC6121"}.
|
||||
{"Multi-User Chat","Chat multi-utilizador"}.
|
||||
{"Name in the rosters where this group will be displayed","O nome nas listas onde este grupo será exibido"}.
|
||||
{"Name","Nome"}.
|
||||
{"Name:","Nome:"}.
|
||||
{"Natural Language for Room Discussions","Idioma nativo para as discussões na sala"}.
|
||||
{"Natural-Language Room Name","Nome da sala no idioma nativo"}.
|
||||
{"Neither 'jid' nor 'nick' attribute found","Nem o atributo 'jid' nem 'nick' foram encontrados"}.
|
||||
{"Neither 'role' nor 'affiliation' attribute found","Nem o atributo 'role' nem 'affiliation' foram encontrados"}.
|
||||
{"Never","Nunca"}.
|
||||
{"New Password:","Nova Palavra-passe:"}.
|
||||
{"Nickname can't be empty","O apelido não pode ser vazio"}.
|
||||
{"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"}.
|
||||
{"No address elements found","Nenhum elemento endereço foi encontrado"}.
|
||||
{"No addresses element found","Nenhum elemento endereços foi encontrado"}.
|
||||
{"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 child elements found","Nenhum elemento filho foi encontrado"}.
|
||||
{"No data form found","Nenhum formulário de dados foi encontrado"}.
|
||||
{"No Data","Nenhum dado"}.
|
||||
{"No features available","Nenhuma funcionalidade disponível"}.
|
||||
{"No <forwarded/> element found","Nenhum elemento <forwarded/> foi encontrado"}.
|
||||
{"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 'item' element found","O elemento 'item' não foi encontrado"}.
|
||||
{"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 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","Nenhuma 'palavra-passe' foi encontrado nesta consulta"}.
|
||||
{"No 'path' found in data form","'path' não foi encontrado em formulário de dados"}.
|
||||
{"No pending subscriptions found","Não foram encontradas subscrições"}.
|
||||
{"No privacy list with this name found","Nenhuma lista de privacidade encontrada com este nome"}.
|
||||
{"No private data found in this query","Nenhum dado privado encontrado nesta consulta"}.
|
||||
{"No running node found","Nenhum nó em execução foi encontrado"}.
|
||||
{"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"}.
|
||||
{"Nobody","Ninguém"}.
|
||||
{"Node already exists","Nó já existe"}.
|
||||
{"Node ID","ID do Tópico"}.
|
||||
{"Node index not found","O índice do nó não foi encontrado"}.
|
||||
{"Node not found","Nodo não encontrado"}.
|
||||
{"Node ~p","Nó ~p"}.
|
||||
{"Node","Nó"}.
|
||||
{"Nodeprep has failed","Processo de identificação de nó falhou (nodeprep)"}.
|
||||
{"Nodes","Nodos"}.
|
||||
{"None","Nenhum"}.
|
||||
{"Not allowed","Não é permitido"}.
|
||||
{"Not Found","Não encontrado"}.
|
||||
{"Not subscribed","Não subscrito"}.
|
||||
{"Notify subscribers when items are removed from the node","Notificar assinantes quando itens forem eliminados do nó"}.
|
||||
{"Notify subscribers when the node configuration changes","Notificar assinantes a configuração do nó mudar"}.
|
||||
{"Notify subscribers when the node is deleted","Notificar assinantes quando o nó for eliminado se elimine"}.
|
||||
{"November","Novembro"}.
|
||||
{"Number of answers required","Quantidade de respostas necessárias"}.
|
||||
{"Number of occupants","Quantidade de participantes"}.
|
||||
{"Number of Offline Messages","Quantidade das mensagens offline"}.
|
||||
{"Number of online users","Quantidade de utilizadores online"}.
|
||||
{"Number of registered users","Quantidade de utilizadores registados"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Quantidade de segundos após limpar automaticamente os itens ou `max` para nenhum limite específico que não seja um servidor imposto máximo"}.
|
||||
{"Occupants are allowed to invite others","As pessoas estão autorizadas a convidar outras pessoas"}.
|
||||
{"Occupants May Change the Subject","As pessoas talvez possam alterar o assunto"}.
|
||||
{"October","Outubro"}.
|
||||
{"Offline Messages","Mensagens offline"}.
|
||||
{"Offline Messages:","Mensagens offline:"}.
|
||||
{"OK","OK"}.
|
||||
{"Old Password:","Palavra-passe Antiga:"}.
|
||||
{"Online Users","Utilizadores ligados"}.
|
||||
{"Online Users:","Utilizadores online:"}.
|
||||
{"Online","Ligado"}.
|
||||
{"Only admins can see this","Apenas administradores podem ver isso"}.
|
||||
{"Only collection node owners may associate leaf nodes with the collection","Apenas um grupo dos proprietários dos nós podem associar as páginas na coleção"}.
|
||||
{"Only deliver notifications to available users","Somente enviar notificações aos utilizadores disponíveis"}.
|
||||
{"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"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Somente os moderadores e os participamentes podem alterar o assunto desta sala"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Somente os moderadores podem alterar o assunto desta sala"}.
|
||||
{"Only moderators can approve voice requests","Somente moderadores podem aprovar requisições de voz"}.
|
||||
{"Only occupants are allowed to send messages to the conference","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 publishers may publish","Apenas os editores podem publicar"}.
|
||||
{"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"}.
|
||||
{"Only those on a whitelist may associate leaf nodes with the collection","Apenas aqueles presentes numa lista branca podem associar páginas na coleção"}.
|
||||
{"Only those on a whitelist may subscribe and retrieve items","Apenas aqueles presentes numa lista branca podem se inscrever e recuperar os itens"}.
|
||||
{"Organization Name","Nome da organização"}.
|
||||
{"Organization Unit","Unidade da organização"}.
|
||||
{"Outgoing s2s Connections","Conexões s2s de Saída"}.
|
||||
{"Outgoing s2s Connections:","Saída das conexões s2s:"}.
|
||||
{"Owner privileges required","São necessários privilégios de dono"}.
|
||||
{"Packet relay is denied by service policy","A retransmissão de pacote é negada por causa da política de serviço"}.
|
||||
{"Packet","Pacote"}.
|
||||
{"Participant","Participante"}.
|
||||
{"Password Verification:","Verificação da Palavra-passe:"}.
|
||||
{"Password Verification","Verificação de Palavra-passe"}.
|
||||
{"Password","Palavra-chave"}.
|
||||
{"Password:","Palavra-chave:"}.
|
||||
{"Path to Dir","Caminho para o directório"}.
|
||||
{"Path to File","Caminho do ficheiro"}.
|
||||
{"Payload type","Tipo da carga útil"}.
|
||||
{"Pending","Pendente"}.
|
||||
{"private, ","privado"}.
|
||||
{"Period: ","Período: "}.
|
||||
{"Persist items to storage","Persistir elementos ao armazenar"}.
|
||||
{"Persistent","Persistente"}.
|
||||
{"Ping query is incorrect","A consulta ping está incorreta"}.
|
||||
{"Ping","Ping"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Observe que tais opções farão backup apenas da base de dados Mnesia. Caso esteja a utilizar o modulo ODBC, precisará fazer backup da 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"}.
|
||||
{"Possessing 'ask' attribute is not allowed by RFC6121","Possuir o atributo 'ask' não é permitido pela RFC6121"}.
|
||||
{"Present real Jabber IDs to","Tornar o Jabber ID real visível por"}.
|
||||
{"Previous session not found","A sessão anterior não foi encontrada"}.
|
||||
{"Previous session PID has been killed","O PID da sessão anterior foi excluído"}.
|
||||
{"Previous session PID has exited","O PID da sessão anterior foi encerrado"}.
|
||||
{"Previous session PID is dead","O PID da sessão anterior está morto"}.
|
||||
{"Previous session timed out","A sessão anterior expirou"}.
|
||||
{"private, ","privado, "}.
|
||||
{"Public","Público"}.
|
||||
{"Publish model","Publicar o modelo"}.
|
||||
{"Publish-Subscribe","Publicação de Tópico"}.
|
||||
{"PubSub subscriber request","PubSub requisição de assinante"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Descartar todos os itens quando o publicante principal estiver offline"}.
|
||||
{"Push record not found","O registo push não foi encontrado"}.
|
||||
{"Queries to the conference members are not allowed in this room","Nesta sala não são permitidas consultas aos seus membros"}.
|
||||
{"Query to another users is forbidden","Consultar a outro utilizador é proibido"}.
|
||||
{"RAM and disc copy","Cópia em RAM e em disco"}.
|
||||
{"RAM copy","Cópia em RAM"}.
|
||||
{"Really delete message of the day?","Deletar realmente a mensagem do dia?"}.
|
||||
{"Receive notification from all descendent nodes","Receba a notificação de todos os nós descendentes"}.
|
||||
{"Receive notification from direct child nodes only","Receba apenas as notificações dos nós relacionados"}.
|
||||
{"Receive notification of new items only","Receba apenas as notificações dos itens novos"}.
|
||||
{"Receive notification of new nodes only","Receba apenas as notificações dos nós novos"}.
|
||||
{"Recipient is not in the conference room","O destinatário não está na sala"}.
|
||||
{"Register an XMPP account","Registe uma conta XMPP"}.
|
||||
{"Registered Users","Utilizadores registados"}.
|
||||
{"Registered Users:","Utilizadores registados:"}.
|
||||
{"Register","Registar"}.
|
||||
{"Remote copy","Cópia remota"}.
|
||||
{"Remove a hat from a user","Remove um chapéu de um utilizador"}.
|
||||
{"Remove All Offline Messages","Remover Todas as Mensagens Offline"}.
|
||||
{"Remove User","Eliminar utilizador"}.
|
||||
{"Remove","Remover"}.
|
||||
{"Replaced by new connection","Substituído por nova conexão"}.
|
||||
{"Request has timed out","O pedido expirou"}.
|
||||
{"Request is ignored","O pedido foi ignorado"}.
|
||||
{"Requested role","Função solicitada"}.
|
||||
{"Resources","Recursos"}.
|
||||
{"Restart Service","Reiniciar Serviço"}.
|
||||
{"Restart","Reiniciar"}.
|
||||
{"Restore Backup from File at ","Restaura cópia de segurança a partir do ficheiro 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 imediatamente o backup binário:"}.
|
||||
{"Restore plain text backup immediately:","Restaurar backup formato texto imediatamente:"}.
|
||||
{"Restore","Restaurar"}.
|
||||
{"Roles and Affiliations that May Retrieve Member List","As funções e as afiliações que podem recuperar a lista dos membros"}.
|
||||
{"Roles for which Presence is Broadcasted","Para quem a presença será notificada"}.
|
||||
{"Roles that May Send Private Messages","Atribuições que talvez possam enviar mensagens privadas"}.
|
||||
{"Room Configuration","Configuração de salas"}.
|
||||
{"Room creation is denied by service policy","Sala não pode ser criada devido à política do serviço"}.
|
||||
{"Room description","Descrição da Sala"}.
|
||||
{"Room Occupants","Quantidade de participantes"}.
|
||||
{"Room terminates","Terminação da sala"}.
|
||||
{"Room title","Título da sala"}.
|
||||
{"Roster groups allowed to subscribe","Listar grupos autorizados"}.
|
||||
{"Roster of ~ts","Lista de ~ts"}.
|
||||
{"Roster size","Tamanho da Lista"}.
|
||||
{"Roster:","Lista:"}.
|
||||
{"RPC Call Error","Erro de chamada RPC"}.
|
||||
{"Running Nodes","Nodos a correr"}.
|
||||
{"~s invites you to the room ~s","~s convidaram-o à sala ~s"}.
|
||||
{"Saturday","Sábado"}.
|
||||
{"Script check","Verificação de Script"}.
|
||||
{"Search from the date","Pesquise a partir da data"}.
|
||||
{"Search Results for ","Resultados de pesquisa para "}.
|
||||
{"Search the text","Pesquise o texto"}.
|
||||
{"Search until the date","Pesquise até a data"}.
|
||||
{"Search users in ","Procurar utilizadores em "}.
|
||||
{"Select All","Selecione tudo"}.
|
||||
{"Send announcement to all online users on all hosts","Enviar anúncio a todos utilizadores online em todas as máquinas"}.
|
||||
{"Send announcement to all online users","Enviar anúncio a todos os utilizadorns online"}.
|
||||
{"Send announcement to all users on all hosts","Enviar aviso para todos os utilizadores em todos os hosts"}.
|
||||
{"Send announcement to all users","Enviar anúncio a todos os utilizadores"}.
|
||||
{"September","Setembro"}.
|
||||
{"Server:","Servidor:"}.
|
||||
{"Service list retrieval timed out","A recuperação da lista dos serviços expirou"}.
|
||||
{"Session state copying timed out","A cópia do estado da sessão expirou"}.
|
||||
{"Set message of the day and send to online users","Definir mensagem do dia e enviar a todos utilizadores online"}.
|
||||
{"Set message of the day on all hosts and send to online users","Definir mensagem do dia em todos os hosts e enviar para os utilizadores online"}.
|
||||
{"Shared Roster Groups","Grupos Shared Roster"}.
|
||||
{"Show Integral Table","Mostrar Tabela Integral"}.
|
||||
{"Show Ordinary Table","Mostrar Tabela Ordinária"}.
|
||||
{"Shut Down Service","Parar Serviço"}.
|
||||
{"SOCKS5 Bytestreams","Bytestreams SOCKS5"}.
|
||||
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alguns clientes XMPP podem armazenar a sua palavra-passe no seu computador, só faça isso no seu computador particular por questões de segurança."}.
|
||||
{"Specify the access model","Especificar os modelos de acesso"}.
|
||||
{"Specify the event message type","Especificar o tipo de mensagem para o evento"}.
|
||||
{"Specify the publisher model","Especificar o modelo do publicante"}.
|
||||
{"Stanza ID","ID da estrofe"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Defina uma resposta fixa do(s) proprietário(s) do nó"}.
|
||||
{"Statistics of ~p","Estatísticas de ~p"}.
|
||||
{"Statistics","Estatísticas"}.
|
||||
{"Stop","Parar"}.
|
||||
{"Stopped Nodes","Nodos parados"}.
|
||||
{"Storage Type","Tipo de armazenagem"}.
|
||||
{"Store binary backup:","Armazenar backup binário:"}.
|
||||
{"Store plain text backup:","Armazenar backup em texto:"}.
|
||||
{"Stream management is already enabled","A gestão do fluxo já está ativada"}.
|
||||
{"Stream management is not enabled","A gestão do fluxo não está ativada"}.
|
||||
{"Subject","Assunto"}.
|
||||
{"Submit","Enviar"}.
|
||||
{"Submitted","Submetido"}.
|
||||
{"Subscriber Address","Endereço dos Assinantes"}.
|
||||
{"Subscribers may publish","Os assinantes podem publicar"}.
|
||||
{"Subscription requests must be approved and only subscribers may retrieve items","Os pedidos de assinatura devem ser aprovados e apenas os assinantes podem recuperar os itens"}.
|
||||
{"Subscriptions are not allowed","Subscrições não estão permitidas"}.
|
||||
{"Subscription","Subscrição"}.
|
||||
{"Sunday","Domingo"}.
|
||||
{"Text associated with a picture","Um texto associado a uma imagem"}.
|
||||
{"Text associated with a sound","Um texto associado a um som"}.
|
||||
{"Text associated with a video","Um texto associado a um vídeo"}.
|
||||
{"Text associated with speech","Um texto associado à fala"}.
|
||||
{"That nickname is already in use by another occupant","O apelido (nick) já está a ser utilizado"}.
|
||||
{"That nickname is registered by another person","O apelido já está registado por outra pessoa"}.
|
||||
{"The account already exists","A conta já existe"}.
|
||||
{"The account was not unregistered","A conta não estava não registada"}.
|
||||
{"The body text of the last received message","O corpo do texto da última mensagem que foi recebida"}.
|
||||
{"The CAPTCHA is valid.","O CAPTCHA é inválido."}.
|
||||
{"The CAPTCHA verification has failed","A verificação do CAPTCHA falhou"}.
|
||||
{"The captcha you entered is wrong","O captcha que digitou está errado"}.
|
||||
{"The child nodes (leaf or collection) associated with a collection","Os nós relacionados (página ou coleção) associados com uma coleção"}.
|
||||
{"The collections with which a node is affiliated","As coleções com as quais o nó está relacionado"}.
|
||||
{"The DateTime at which a leased subscription will end or has ended","A data e a hora que uma assinatura alugada terminará ou terá terminado"}.
|
||||
{"The datetime when the node was created","A data em que o nó foi criado"}.
|
||||
{"The default language of the node","O idioma padrão do nó"}.
|
||||
{"The feature requested is not supported by the conference","A funcionalidade solicitada não é suportada pela sala de conferência"}.
|
||||
{"The JID of the node creator","O JID do criador do nó"}.
|
||||
{"The JIDs of those to contact with questions","Os JIDs daqueles para entrar em contato com perguntas"}.
|
||||
{"The JIDs of those with an affiliation of owner","Os JIDs daqueles com uma afiliação de proprietário"}.
|
||||
{"The JIDs of those with an affiliation of publisher","Os JIDs daqueles com uma afiliação de editor"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","A lista dos JIDs que podem associar as páginas dos nós numa coleção"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","A quantidade máxima de nós relacionados que podem ser associados a uma coleção ou `máximo` para nenhum limite específico que não seja um servidor imposto no máximo"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","A quantidade mínima de milissegundos entre o envio do resumo das duas notificações"}.
|
||||
{"The name of the node","O nome do nó"}.
|
||||
{"The node is a collection node","O nó é um nó da coleção"}.
|
||||
{"The node is a leaf node (default)","O nó é uma página do nó (padrão)"}.
|
||||
{"The NodeID of the relevant node","O NodeID do nó relevante"}.
|
||||
{"The number of pending incoming presence subscription requests","A quantidade pendente dos pedidos da presença da assinatura"}.
|
||||
{"The number of subscribers to the node","A quantidade dos assinantes para o nó"}.
|
||||
{"The number of unread or undelivered messages","A quantidade das mensagens que não foram lidas ou não foram entregues"}.
|
||||
{"The password contains unacceptable characters","A palavra-passe contém caracteres proibidos"}.
|
||||
{"The password is too weak","Palavra-passe considerada muito fraca"}.
|
||||
{"the password is","a palavra-passe é"}.
|
||||
{"The password of your XMPP account was successfully changed.","A palavra-passe da sua conta XMPP foi alterada com sucesso."}.
|
||||
{"The password was not changed","A palavra-passe não foi alterada"}.
|
||||
{"The passwords are different","As palavras-passe não batem"}.
|
||||
{"The presence states for which an entity wants to receive notifications","As condições da presença para os quais uma entidade queira receber as notificações"}.
|
||||
{"The query is only allowed from local users","Esta consulta só é permitida a partir de utilizadores locais"}.
|
||||
{"The query must not contain <item/> elements","A consulta não pode conter elementos <item/>"}.
|
||||
{"The room subject can be modified by participants","O tema da sala pode ser alterada pelos próprios participantes"}.
|
||||
{"The sender of the last received message","O remetente da última mensagem que foi recebida"}.
|
||||
{"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/>"}.
|
||||
{"The subscription identifier associated with the subscription request","O identificador da assinatura associado à solicitação da assinatura"}.
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","O tipo dos dados do nó, normalmente definido pelo espaço dos nomes da carga útil (caso haja)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","O URL da transformação XSL que pode ser aplicada nas cargas úteis para gerar um elemento apropriado no corpo da mensagem."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","A URL de uma transformação XSL que pode ser aplicada ao formato de carga útil para gerar um Formulário de Dados válido onde o cliente possa exibir usando um mecanismo genérico de renderização do Formulários de Dados"}.
|
||||
{"There was an error changing the password: ","Houve um erro ao alterar a palavra-passe: "}.
|
||||
{"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: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","O tamanho da caixa não importa: macbeth é o mesmo que MacBeth e Macbeth."}.
|
||||
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Esta pagina permite a criação de novas contas XMPP neste servidor. O seu JID (Identificador Jabber) será da seguinte maneira: utilizador@servidor. Por favor, leia cuidadosamente as instruções para preencher todos os campos corretamente."}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","Esta página permite a exclusão de uma conta XMPP neste servidor."}.
|
||||
{"This room is not anonymous","Essa sala não é anônima"}.
|
||||
{"This service can not process the address: ~s","Este serviço não pode processar o endereço: ~s"}.
|
||||
{"Thursday","Quinta"}.
|
||||
{"Time delay","Intervalo (Tempo)"}.
|
||||
{"Timed out waiting for stream resumption","Tempo limite expirou durante à espera da retomada da transmissão"}.
|
||||
{"Time","Data"}.
|
||||
{"To register, visit ~s","Para registar, visite ~s"}.
|
||||
{"To ~ts","Para ~s"}.
|
||||
{"Token TTL","Token TTL"}.
|
||||
{"Too many active bytestreams","Quantidade excessiva de bytestreams ativos"}.
|
||||
{"Too many CAPTCHA requests","Quantidade excessiva de requisições para o CAPTCHA"}.
|
||||
{"Too many child elements","Quantidade excessiva de elementos filho"}.
|
||||
{"Too many <item/> elements","Quantidade excessiva de elementos <item/>"}.
|
||||
{"Too many <list/> elements","Quantidade excessiva de elementos <list/>"}.
|
||||
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Tentativas excessivas (~p) com falha de autenticação (~s). O endereço será desbloqueado às ~s UTC"}.
|
||||
{"Too many receiver fields were specified","Foram definidos receptores demais nos campos"}.
|
||||
{"Too many unacked stanzas","Quantidade excessiva de instâncias sem confirmação"}.
|
||||
{"Too many users in this conference","Há uma quantidade excessiva de utilizadores nesta conferência"}.
|
||||
{"To","Para"}.
|
||||
{"Total rooms","Salas no total"}.
|
||||
{"Traffic rate limit is exceeded","Limite de banda excedido"}.
|
||||
{"Transactions Aborted:","Transações abortadas:"}.
|
||||
{"Transactions Committed:","Transações salvas:"}.
|
||||
{"Transactions Logged:","Transações de log:"}.
|
||||
{"Transactions Restarted:","Transações reiniciadas:"}.
|
||||
{"~ts's Offline Messages Queue","~s's Fila de Mensagens Offline"}.
|
||||
{"Tuesday","Terça"}.
|
||||
{"Unable to generate a CAPTCHA","Impossível gerar um CAPTCHA"}.
|
||||
{"Unable to register route on existing local domain","Não foi possível registar rota no domínio local existente"}.
|
||||
{"Unauthorized","Não Autorizado"}.
|
||||
{"Unexpected action","Ação inesperada"}.
|
||||
{"Unexpected error condition: ~p","Condição de erro inesperada: ~p"}.
|
||||
{"Unregister an XMPP account","Excluir uma conta XMPP"}.
|
||||
{"Unregister","Deletar registo"}.
|
||||
{"Unselect All","Desmarcar todos"}.
|
||||
{"Unsupported <index/> element","Elemento <index/> não suportado"}.
|
||||
{"Unsupported version","Versão sem suporte"}.
|
||||
{"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","Actualizar"}.
|
||||
{"Uptime:","Tempo de atividade:"}.
|
||||
{"URL for Archived Discussion Logs","A URL para o arquivamento dos registos da discussão"}.
|
||||
{"User already exists","Utilizador já existe"}.
|
||||
{"User (jid)","Utilizador (jid)"}.
|
||||
{"User JID","Utilizador JID"}.
|
||||
{"User Management","Gestão de utilizadores"}.
|
||||
{"User removed","O utilizador foi removido"}.
|
||||
{"User session not found","A sessão do utilizador não foi encontrada"}.
|
||||
{"User session terminated","Sessão de utilizador terminada"}.
|
||||
{"User ~ts","Utilizador ~s"}.
|
||||
{"Username:","Utilizador:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Utilizadores não estão autorizados a registar contas imediatamente"}.
|
||||
{"Users Last Activity","Últimas atividades dos utilizadores"}.
|
||||
{"Users","Utilizadores"}.
|
||||
{"User","Utilizador"}.
|
||||
{"Validate","Validar"}.
|
||||
{"Value 'get' of 'type' attribute is not allowed","Valor 'get' não permitido para atributo 'type'"}.
|
||||
{"Value of '~s' should be boolean","Value de '~s' deveria ser um booleano"}.
|
||||
{"Value of '~s' should be datetime string","Valor de '~s' deveria ser data e hora"}.
|
||||
{"Value of '~s' should be integer","Valor de '~s' deveria ser um inteiro"}.
|
||||
{"Value 'set' of 'type' attribute is not allowed","Valor 'set' não permitido para atributo 'type'"}.
|
||||
{"vCard User Search","Busca de Utilizador vCard"}.
|
||||
{"View Queue","Exibir a fila"}.
|
||||
{"View Roster","Ver a lista"}.
|
||||
{"Virtual Hosts","Hosts virtuais"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Nesta sala, os visitantes não podem mudar os apelidos deles"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","Os visitantes não podem enviar mensagens para todos os ocupantes"}.
|
||||
{"Visitor","Visitante"}.
|
||||
{"Voice request","Requisição de voz"}.
|
||||
{"Voice requests are disabled in this conference","Requisições de voz estão desativadas nesta sala de conferência"}.
|
||||
{"Wednesday","Quarta"}.
|
||||
{"When a new subscription is processed and whenever a subscriber comes online","Quando uma nova assinatura é processada e sempre que um assinante fica online"}.
|
||||
{"When a new subscription is processed","Quando uma nova assinatura é processada"}.
|
||||
{"When to send the last published item","Quando enviar o último tópico publicado"}.
|
||||
{"Whether an entity wants to receive an XMPP message body in addition to the payload format","Caso uma entidade queira receber o corpo de uma mensagem XMPP além do formato de carga útil"}.
|
||||
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","Caso uma entidade queira receber os resumos (as agregações) das notificações ou todas as notificações individualmente"}.
|
||||
{"Whether an entity wants to receive or disable notifications","Caso uma entidade queira receber ou desativar as notificações"}.
|
||||
{"Whether owners or publisher should receive replies to items","Caso os proprietários ou a editora devam receber as respostas nos itens"}.
|
||||
{"Whether the node is a leaf (default) or a collection","Caso o nó seja uma folha (padrão) ou uma coleção"}.
|
||||
{"Whether to allow subscriptions","Permitir subscrições"}.
|
||||
{"Whether to make all subscriptions temporary, based on subscriber presence","Caso todas as assinaturas devam ser temporárias, com base na presença do assinante"}.
|
||||
{"Whether to notify owners about new subscribers and unsubscribes","Caso deva notificar os proprietários sobre os novos assinantes e aqueles que cancelaram a assinatura"}.
|
||||
{"Who may associate leaf nodes with a collection","Quem pode associar as folhas dos nós numa coleção"}.
|
||||
{"Wrong parameters in the web formulary","O formulário web está com os parâmetros errados"}.
|
||||
{"Wrong xmlns","Xmlns errado"}.
|
||||
{"XMPP Account Registration","Registo da Conta XMPP"}.
|
||||
{"XMPP Domains","Domínios XMPP"}.
|
||||
{"XMPP Show Value of Away","XMPP Exiba o valor da ausência"}.
|
||||
{"XMPP Show Value of Chat","XMPP Exiba o valor do chat"}.
|
||||
{"XMPP Show Value of DND (Do Not Disturb)","XMPP Exiba o valor do DND (Não Perturbe)"}.
|
||||
{"XMPP Show Value of XA (Extended Away)","XMPP Exiba o valor do XA (Ausência Estendida)"}.
|
||||
{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI da publicação do nó associado da assinatura"}.
|
||||
{"You are being removed from the room because of a system shutdown","Está a ser removido da sala devido ao desligamento do sistema"}.
|
||||
{"You are not joined to the channel","Não está inscrito no canal"}.
|
||||
{"You can later change your password using an XMPP client.","Pode alterar a sua palavra-passe mais tarde usando um cliente XMPP."}.
|
||||
{"You have been banned from this room","Foi banido desta sala"}.
|
||||
{"You have joined too many conferences","Entrou em demais salas de conferência"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Deve completar o campo \"Apelido\" no formulário"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","Precisa de um cliente com suporte de x:data para poder registar o apelido"}.
|
||||
{"You need a client that supports x:data to register the nickname","Precisa de um cliente com suporte a x:data para registar o seu apelido"}.
|
||||
{"You need an x:data capable client to search","É necessário um cliente com suporte de x:data para poder procurar"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","A sua lista de privacidade ativa negou o roteamento desta instância."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","A fila de contatos offline esta cheia. A sua mensagem foi descartada."}.
|
||||
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","As suas mensagens para ~s estão bloqueadas. Para desbloqueá-las, visite: ~s"}.
|
||||
{"Your XMPP account was successfully registered.","A sua conta XMPP foi registada com sucesso."}.
|
||||
{"Your XMPP account was successfully unregistered.","A sua conta XMPP foi excluída com sucesso."}.
|
||||
{"You're not allowed to create nodes","Não tem autorização para criar nós"}.
|
||||
|
||||
@@ -201,7 +201,6 @@
|
||||
{"Malformed username","Недопустимое имя пользователя"}.
|
||||
{"MAM preference modification denied by service policy","Изменение настроек архива сообщений запрещено политикой службы"}.
|
||||
{"March","марта"}.
|
||||
{"Max # of items to persist","Максимальное число сохраняемых публикаций"}.
|
||||
{"Max payload size in bytes","Максимальный размер полезной нагрузки в байтах"}.
|
||||
{"Maximum Number of Occupants","Максимальное количество участников"}.
|
||||
{"May","мая"}.
|
||||
@@ -411,7 +410,6 @@
|
||||
{"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/>"}.
|
||||
{"The username is not valid","Недопустимое имя пользователя"}.
|
||||
{"There was an error creating the account: ","Ошибка при создании аккаунта:"}.
|
||||
{"There was an error deleting the account: ","Ошибка при удалении аккаунта:"}.
|
||||
{"This room is not anonymous","Эта комната не анонимная"}.
|
||||
|
||||
@@ -144,7 +144,6 @@
|
||||
{"Make room persistent","Nastaviť miestnosť ako trvalú"}.
|
||||
{"Make room public searchable","Nastaviť miestnosť ako verejne prehľadávateľnú"}.
|
||||
{"March","Marec"}.
|
||||
{"Max # of items to persist","Maximálny počet položiek, ktoré je možné natrvalo uložiť"}.
|
||||
{"Max payload size in bytes","Maximálny náklad v bajtoch"}.
|
||||
{"Maximum Number of Occupants","Počet účastníkov"}.
|
||||
{"May","Máj"}.
|
||||
|
||||
@@ -331,7 +331,6 @@
|
||||
{"The password was not changed","Fjalëkalimi s’u ndryshua"}.
|
||||
{"The passwords are different","Fjalëkalimet janë të ndryshëm"}.
|
||||
{"The sender of the last received message","Dërguesi i mesazhit të fundit të marrë"}.
|
||||
{"The username is not valid","Emri i përdoruesit s’është i vlefshëm"}.
|
||||
{"There was an error changing the password: ","Pati një gabim në ndryshimin e fjalëkalimit: "}.
|
||||
{"There was an error creating the account: ","Pati një gabim në krijimin e llogarisë: "}.
|
||||
{"This room is not anonymous","Kjo dhomë s’është anonime"}.
|
||||
|
||||
@@ -129,7 +129,6 @@
|
||||
{"Make room persistent","Gör rummet permanent"}.
|
||||
{"Make room public searchable","Gör rummet publikt sökbart"}.
|
||||
{"March","Mars"}.
|
||||
{"Max # of items to persist","Högsta antal dataposter som sparas"}.
|
||||
{"Max payload size in bytes","Högsta innehållsstorlek i bytes"}.
|
||||
{"Maximum Number of Occupants","Maximalt antal av användare"}.
|
||||
{"May","Maj"}.
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
{"Make room persistent","สร้างเป็นห้องถาวร"}.
|
||||
{"Make room public searchable","สร้างเป็นห้องที่บุคคลทั่วไปสามารถค้นหาได้"}.
|
||||
{"March","มีนาคม"}.
|
||||
{"Max # of items to persist","จำนวนสูงสุดของรายการที่ยืนยัน"}.
|
||||
{"Max payload size in bytes","ขนาดสูงสุดของส่วนของข้อมูล (payload) มีหน่วยเป็นไบต์"}.
|
||||
{"Maximum Number of Occupants","จำนวนผู้ครอบครองห้องสูงสุด"}.
|
||||
{"May","พฤษภาคม"}.
|
||||
|
||||
@@ -143,7 +143,6 @@
|
||||
{"Make room persistent","Odayı kalıcı hale getir"}.
|
||||
{"Make room public searchable","Odayı herkes tarafından aranabilir hale getir"}.
|
||||
{"March","Mart"}.
|
||||
{"Max # of items to persist","Kalıcı hale getirilecek en fazla öğe sayısı"}.
|
||||
{"Max payload size in bytes","En fazla yük (payload) boyutu (bayt olarak)"}.
|
||||
{"Maximum Number of Occupants","Odada En Fazla Bulunabilecek Kişi Sayısı"}.
|
||||
{"May","Mayıs"}.
|
||||
|
||||
@@ -153,7 +153,6 @@
|
||||
{"Make room persistent","Зробити кімнату постійною"}.
|
||||
{"Make room public searchable","Зробити кімнату видимою всім"}.
|
||||
{"March","березня"}.
|
||||
{"Max # of items to persist","Максимальне число збережених публікацій"}.
|
||||
{"Max payload size in bytes","Максимальний розмір корисного навантаження в байтах"}.
|
||||
{"Maximum Number of Occupants","Максимальна кількість учасників"}.
|
||||
{"May","травня"}.
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
{"Make room persistent","Tạo phòng bền vững"}.
|
||||
{"Make room public searchable","Tạo phòng có thể tìm kiếm công khai"}.
|
||||
{"March","Tháng Ba"}.
|
||||
{"Max # of items to persist","Số mục tối đa để lưu trữ"}.
|
||||
{"Max payload size in bytes","Kích thước dung lượng byte tối đa"}.
|
||||
{"Maximum Number of Occupants","Số Lượng Người Tham Dự Tối Đa"}.
|
||||
{"May","Tháng Năm"}.
|
||||
|
||||
@@ -153,7 +153,6 @@
|
||||
{"Make room persistent","Rinde li såle permaninte"}.
|
||||
{"Make room public searchable","Rinde li såle di berdelaedje cweråve publicmint"}.
|
||||
{"March","måss"}.
|
||||
{"Max # of items to persist","Nombe macsimoms di cayets permanints"}.
|
||||
{"Max payload size in bytes","Contnou macsimom en octets"}.
|
||||
{"Maximum Number of Occupants","Nombe macsimom di prezints"}.
|
||||
{"May","may"}.
|
||||
|
||||
+20
-20
@@ -4,7 +4,7 @@
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (在字段末添加*来匹配子串)"}.
|
||||
{" has set the subject to: ","已将标题设置为: "}.
|
||||
{" has set the subject to: "," 已将标题设置为: "}.
|
||||
{"# participants","# 个参与人"}.
|
||||
{"A description of the node","该节点的描述"}.
|
||||
{"A friendly name for the node","该节点的友好名称"}.
|
||||
@@ -23,7 +23,7 @@
|
||||
{"Add Jabber ID","添加Jabber ID"}.
|
||||
{"Add New","添加新用户"}.
|
||||
{"Add User","添加用户"}.
|
||||
{"Administration of ","管理"}.
|
||||
{"Administration of ","管理 "}.
|
||||
{"Administration","管理"}.
|
||||
{"Administrator privileges required","需要管理员权限"}.
|
||||
{"All activity","所有活动"}.
|
||||
@@ -62,7 +62,7 @@
|
||||
{"Automatic node creation is not enabled","未启用自动节点创建"}.
|
||||
{"Backup Management","备份管理"}.
|
||||
{"Backup of ~p","~p的备份"}.
|
||||
{"Backup to File at ","备份文件位于"}.
|
||||
{"Backup to File at ","备份文件位于 "}.
|
||||
{"Backup","备份"}.
|
||||
{"Bad format","格式错误"}.
|
||||
{"Birthday","出生日期"}.
|
||||
@@ -102,7 +102,7 @@
|
||||
{"Current Discussion Topic","当前讨论话题"}.
|
||||
{"Database failure","数据库失败"}.
|
||||
{"Database Tables at ~p","位于~p的数据库表"}.
|
||||
{"Database Tables Configuration at ","数据库表格配置位于"}.
|
||||
{"Database Tables Configuration at ","数据库表格配置位于 "}.
|
||||
{"Database","数据库"}.
|
||||
{"December","十二月"}.
|
||||
{"Default users as participants","用户默认被视为参与人"}.
|
||||
@@ -119,12 +119,12 @@
|
||||
{"'Displayed groups' not added (they do not exist!): ","'显示的群组' 未被添加 (它们不存在!): "}.
|
||||
{"Displayed:","已显示:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","不要将密码告诉任何人, 就算是XMPP服务器的管理员也不可以."}.
|
||||
{"Dump Backup to Text File at ","转储备份到文本文件于"}.
|
||||
{"Dump Backup to Text File at ","将备份转储到位于以下位置的文本文件 "}.
|
||||
{"Dump to Text File","转储到文本文件"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","按照RFC6121的规则,不允许有重复的群组"}.
|
||||
{"Dynamically specify a replyto of the item publisher","为项目发布者动态指定一个 replyto"}.
|
||||
{"Edit Properties","编辑属性"}.
|
||||
{"Either approve or decline the voice request.","接受或拒绝声音请求"}.
|
||||
{"Either approve or decline the voice request.","接受或拒绝声音请求."}.
|
||||
{"ejabberd HTTP Upload service","ejabberd HTTP 上传服务"}.
|
||||
{"ejabberd MUC module","ejabberd MUC 模块"}.
|
||||
{"ejabberd Multicast service","ejabberd多重映射服务"}.
|
||||
@@ -173,7 +173,7 @@
|
||||
{"Get Number of Online Users","获取在线用户数"}.
|
||||
{"Get Number of Registered Users","获取注册用户数"}.
|
||||
{"Get Pending","获取挂起"}.
|
||||
{"Get User Last Login Time","获取用户上次登陆时间"}.
|
||||
{"Get User Last Login Time","获取用户上次登录时间"}.
|
||||
{"Get User Password","获取用户密码"}.
|
||||
{"Get User Statistics","获取用户统计"}.
|
||||
{"Given Name","中间名"}.
|
||||
@@ -194,10 +194,10 @@
|
||||
{"Import Directory","导入目录"}.
|
||||
{"Import File","导入文件"}.
|
||||
{"Import user data from jabberd14 spool file:","从 jabberd14 Spool 文件导入用户数据:"}.
|
||||
{"Import User from File at ","导入用户的文件位于"}.
|
||||
{"Import User from File at ","从以下位置的文件导入用户 "}.
|
||||
{"Import users data from a PIEFXIS file (XEP-0227):","从 PIEFXIS 文件 (XEP-0227) 导入用户数据:"}.
|
||||
{"Import users data from jabberd14 spool directory:","从jabberd14 Spool目录导入用户数据:"}.
|
||||
{"Import Users from Dir at ","导入用户的目录位于"}.
|
||||
{"Import Users from Dir at ","从以下位置目录导入用户 "}.
|
||||
{"Import Users From jabberd14 Spool Files","从 jabberd14 Spool 文件导入用户"}.
|
||||
{"Improper domain part of 'from' attribute","不恰当的'from'属性域名部分"}.
|
||||
{"Improper message type","不恰当的消息类型"}.
|
||||
@@ -230,7 +230,7 @@
|
||||
{"Just created","刚刚创建"}.
|
||||
{"Label:","标签:"}.
|
||||
{"Last Activity","上次活动"}.
|
||||
{"Last login","上次登陆"}.
|
||||
{"Last login","上次登录"}.
|
||||
{"Last message","最近消息"}.
|
||||
{"Last month","上个月"}.
|
||||
{"Last year","上一年"}.
|
||||
@@ -249,7 +249,7 @@
|
||||
{"Malformed username","用户名无效"}.
|
||||
{"MAM preference modification denied by service policy","MAM偏好被服务策略拒绝"}.
|
||||
{"March","三月"}.
|
||||
{"Max # of items to persist","允许持久化的最大内容条目数"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","要保留的最大项目数 #,`max`表示除了服务器强加的最大值之外没有特定限制"}.
|
||||
{"Max payload size in bytes","最大有效负载字节数"}.
|
||||
{"Maximum file size","最大文件大小"}.
|
||||
{"Maximum Number of History Messages Returned by Room","房间返回的历史消息最大值"}.
|
||||
@@ -288,7 +288,7 @@
|
||||
{"Never","从未"}.
|
||||
{"New Password:","新密码:"}.
|
||||
{"Nickname can't be empty","昵称不能为空"}.
|
||||
{"Nickname Registration at ","昵称注册于"}.
|
||||
{"Nickname Registration at ","昵称注册于 "}.
|
||||
{"Nickname ~s does not exist in the room","昵称~s不在该房间"}.
|
||||
{"Nickname","昵称"}.
|
||||
{"No address elements found","没有找到地址的各元素"}.
|
||||
@@ -326,6 +326,7 @@
|
||||
{"Node ~p","节点~p"}.
|
||||
{"Nodeprep has failed","Nodeprep 已失效"}.
|
||||
{"Nodes","节点"}.
|
||||
{"Node","节点"}.
|
||||
{"None","无"}.
|
||||
{"Not allowed","不允许"}.
|
||||
{"Not Found","没有找到"}.
|
||||
@@ -339,7 +340,7 @@
|
||||
{"Number of Offline Messages","离线消息数量"}.
|
||||
{"Number of online users","在线用户数"}.
|
||||
{"Number of registered users","注册用户数"}.
|
||||
{"Number of seconds after which to automatically purge items","自动清除项目要等待的秒数"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","等待多少秒后自动清除项目,“max”表示除服务器施加的最大值外没有特定限制"}.
|
||||
{"Occupants are allowed to invite others","允许成员邀请其他人"}.
|
||||
{"Occupants May Change the Subject","成员可以修改主题"}.
|
||||
{"October","十月"}.
|
||||
@@ -428,7 +429,7 @@
|
||||
{"Resources","资源"}.
|
||||
{"Restart Service","重启服务"}.
|
||||
{"Restart","重启"}.
|
||||
{"Restore Backup from File at ","要恢复的备份文件位于"}.
|
||||
{"Restore Backup from File at ","从以下位置的文件恢复备份 "}.
|
||||
{"Restore binary backup after next ejabberd restart (requires less memory):","在下次 ejabberd 重启后恢复二进制备份(需要的内存更少):"}.
|
||||
{"Restore binary backup immediately:","立即恢复二进制备份:"}.
|
||||
{"Restore plain text backup immediately:","立即恢复普通文本备份:"}.
|
||||
@@ -455,7 +456,7 @@
|
||||
{"Search Results for ","搜索结果属于关键词 "}.
|
||||
{"Search the text","搜索文本"}.
|
||||
{"Search until the date","搜索截至日期"}.
|
||||
{"Search users in ","搜索用户于"}.
|
||||
{"Search users in ","在以下位置搜索用户 "}.
|
||||
{"Select All","全选"}.
|
||||
{"Send announcement to all online users on all hosts","发送通知给所有主机的在线用户"}.
|
||||
{"Send announcement to all online users","发送通知给所有在线用户"}.
|
||||
@@ -519,7 +520,7 @@
|
||||
{"The JIDs of those with an affiliation of owner","隶属所有人的JID"}.
|
||||
{"The JIDs of those with an affiliation of publisher","隶属发布人的JID"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","可以将叶节点与集合关联的JID列表"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection","可以与集合关联的最大子节点数"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","可以与集合相关联的最大子节点数,“max”表示除服务器施加的最大值外没有特定限制"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","发送任何两个通知摘要之间的最小毫秒数"}.
|
||||
{"The name of the node","该节点的名称"}.
|
||||
{"The node is a collection node","该节点是集合节点"}.
|
||||
@@ -544,13 +545,12 @@
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","节点数据的类型, 如果有, 通常由有效负载的名称空间指定"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","XSL转换的URL,可以将其应用于有效负载以生成适当的消息正文元素。"}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","XSL转换的URL, 可以将其应用于有效负载格式, 以生成有效的数据表单结果, 客户端可以使用通用数据表单呈现引擎来显示该结果"}.
|
||||
{"The username is not valid","用户名无效"}.
|
||||
{"There was an error changing the password: ","修改密码出错: "}.
|
||||
{"There was an error creating the account: ","帐户创建出错: "}.
|
||||
{"There was an error deleting the account: ","帐户删除失败: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","此处不区分大小写: macbeth 与 MacBeth 和 Macbeth 是一样的."}.
|
||||
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","本页面允许在此服务器上注册XMPP帐户. 你的JID (Jabber ID) 的形式如下: 用户名@服务器. 请仔细阅读说明并正确填写相应字段."}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","此页面允许在此XMPP服务器上注销XMPP帐户"}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","此页面允许在此 XMPP 服务器上注销 XMPP 帐户。"}.
|
||||
{"This room is not anonymous","此房间不是匿名房间"}.
|
||||
{"This service can not process the address: ~s","此服务无法处理地址: ~s"}.
|
||||
{"Thursday","星期四"}.
|
||||
@@ -565,7 +565,7 @@
|
||||
{"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","来自IP地址(~p)的(~s)失败认证太多. 该地址将在UTC时间~s被禁用."}.
|
||||
{"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 receiver fields were specified","指定的接收者字段太多"}.
|
||||
{"Too many unacked stanzas","未被确认的节太多"}.
|
||||
{"Too many users in this conference","该会议的用户太多"}.
|
||||
@@ -656,7 +656,7 @@
|
||||
{"You need a client that supports x:data to register the nickname","您需要一个支持 x:data 的客户端来注册昵称"}.
|
||||
{"You need an x:data capable client to search","您需要一个兼容 x:data 的客户端来搜索"}.
|
||||
{"Your active privacy list has denied the routing of this stanza.","你的活跃私聊列表拒绝了在此房间进行路由分发."}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","您的联系人离线消息队列已满. 消息已被丢弃"}.
|
||||
{"Your contact offline message queue is full. The message has been discarded.","您的联系人离线消息队列已满。消息已被丢弃。"}.
|
||||
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","您发送给~s的消息已被阻止. 要解除阻止, 请访问 ~s"}.
|
||||
{"Your XMPP account was successfully registered.","你的XMPP帐户注册成功."}.
|
||||
{"Your XMPP account was successfully unregistered.","你的XMPP帐户注销成功."}.
|
||||
|
||||
+86
-30
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -19,51 +19,62 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
{deps, [{base64url, ".*", {git, "https://github.com/dvv/base64url", {tag, "1.0.1"}}},
|
||||
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.28"}}},
|
||||
{eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.20"}}},
|
||||
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.30"}}},
|
||||
{eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.22"}}},
|
||||
{if_var_true, tools,
|
||||
{ejabberd_po, ".*", {git, "https://github.com/processone/ejabberd-po", {branch, "main"}}}},
|
||||
{if_var_true, elixir,
|
||||
{elixir, ".*", {git, "https://github.com/elixir-lang/elixir", {tag, "v1.4.4"}}}},
|
||||
{if_var_true, pam,
|
||||
{epam, ".*", {git, "https://github.com/processone/epam", {tag, "1.0.10"}}}},
|
||||
{epam, ".*", {git, "https://github.com/processone/epam", {tag, "1.0.12"}}}},
|
||||
{if_var_true, redis,
|
||||
{eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.0.8"}}}},
|
||||
{eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}},
|
||||
{if_var_true, sip,
|
||||
{esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.42"}}}},
|
||||
{esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.47"}}}},
|
||||
{if_var_true, zlib,
|
||||
{ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.9"}}}},
|
||||
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.12"}}},
|
||||
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.46"}}},
|
||||
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.31"}}},
|
||||
{ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.12"}}}},
|
||||
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.15"}}},
|
||||
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.49"}}},
|
||||
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.33"}}},
|
||||
{idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}},
|
||||
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.0.5"}}},
|
||||
{jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.9.0"}}},
|
||||
{lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.6.10"}}},
|
||||
{if_version_above, "19",
|
||||
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}},
|
||||
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "1.1.0"}}} % for R19 and below
|
||||
},
|
||||
{jose, ".*", {git, "https://github.com/potatosalad/erlang-jose", {tag, "1.11.1"}}},
|
||||
{if_version_below, "22",
|
||||
{lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}}
|
||||
},
|
||||
{if_var_true, lua,
|
||||
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "v0.3"}}}},
|
||||
{mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.13"}}},
|
||||
{p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.12"}}},
|
||||
{if_not_rebar3,
|
||||
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0"}}}
|
||||
}},
|
||||
{if_var_true, lua,
|
||||
{if_rebar3,
|
||||
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}}
|
||||
}},
|
||||
{mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.15"}}},
|
||||
{p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.19"}}},
|
||||
{if_var_true, mysql,
|
||||
{p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.18"}}}},
|
||||
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.9"}}},
|
||||
{p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.19"}}}},
|
||||
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}},
|
||||
{if_var_true, pgsql,
|
||||
{p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.11"}}}},
|
||||
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.22"}}},
|
||||
{pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.7"}}},
|
||||
{p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.18"}}}},
|
||||
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.25"}}},
|
||||
{pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.9"}}},
|
||||
{if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix
|
||||
{if_var_true, elixir,
|
||||
{rebar_elixir_plugin, ".*", {git, "https://github.com/processone/rebar_elixir_plugin", "0.1.0"}}}},
|
||||
{if_var_true, sqlite,
|
||||
{sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.12"}}}},
|
||||
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.25"}}},
|
||||
{sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.13"}}}},
|
||||
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.28"}}},
|
||||
{if_var_true, stun,
|
||||
{stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.43"}}}},
|
||||
{xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.3"}}},
|
||||
{yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.11"}}}
|
||||
{stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.2"}}}},
|
||||
{xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.5.8"}}},
|
||||
{yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.13"}}}
|
||||
]}.
|
||||
|
||||
{gitonly_deps, [elixir, luerl]}.
|
||||
{gitonly_deps, [elixir]}.
|
||||
|
||||
{if_var_true, latest_deps,
|
||||
{floating_deps, [cache_tab,
|
||||
@@ -94,21 +105,22 @@
|
||||
{erl_opts, [nowarn_deprecated_function,
|
||||
{i, "include"},
|
||||
{if_version_above, "20", {d, 'DEPRECATED_GET_STACKTRACE'}},
|
||||
{if_version_above, "20", {d, 'HAVE_ERL_ERROR'}},
|
||||
{if_version_above, "20", {d, 'HAVE_URI_STRING'}},
|
||||
{if_version_below, "21", {d, 'USE_OLD_HTTP_URI'}},
|
||||
{if_version_below, "22", {d, 'LAGER'}},
|
||||
{if_version_below, "21", {d, 'NO_CUSTOMIZE_HOSTNAME_CHECK'}},
|
||||
{if_version_below, "23", {d, 'USE_OLD_CRYPTO_HMAC'}},
|
||||
{if_version_below, "23", {d, 'USE_OLD_PG2'}},
|
||||
{if_version_below, "24", {d, 'COMPILER_REPORTS_ONLY_LINES'}},
|
||||
{if_var_match, db_type, mssql, {d, 'mssql'}},
|
||||
{if_version_below, "24", {d, 'SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL'}},
|
||||
{if_var_false, debug, no_debug_info},
|
||||
{if_var_true, debug, debug_info},
|
||||
{if_var_true, elixir, {d, 'ELIXIR_ENABLED'}},
|
||||
{if_var_true, new_sql_schema, {d, 'NEW_SQL_SCHEMA'}},
|
||||
{if_var_true, roster_gateway_workaround, {d, 'ROSTER_GATWAY_WORKAROUND'}},
|
||||
{if_var_true, roster_gateway_workaround, {d, 'ROSTER_GATEWAY_WORKAROUND'}},
|
||||
{if_var_true, sip, {d, 'SIP'}},
|
||||
{if_var_true, stun, {d, 'STUN'}},
|
||||
{if_have_fun, {erl_error, format_exception, 6}, {d, 'HAVE_ERL_ERROR'}},
|
||||
{src_dirs, [src,
|
||||
{if_rebar3, sql},
|
||||
{if_var_true, tools, tools},
|
||||
@@ -155,6 +167,8 @@
|
||||
|
||||
{cover_enabled, true}.
|
||||
{cover_export_enabled, true}.
|
||||
{coveralls_coverdata, "_build/test/cover/ct.coverdata"}.
|
||||
{coveralls_service_name, "github"}.
|
||||
{recursive_cmds, ['configure-deps']}.
|
||||
|
||||
{overrides, [
|
||||
@@ -169,6 +183,48 @@
|
||||
{"fast_yaml", []},
|
||||
{"stringprep", []}]}.
|
||||
|
||||
{relx, [{release, {ejabberd, {cmd, "grep {vsn, vars.config | sed 's|{vsn, \"||;s|\"}.||' | tr -d '\012'"}},
|
||||
[ejabberd]},
|
||||
{sys_config, "./rel/sys.config"},
|
||||
{vm_args, "./rel/vm.args"},
|
||||
{overlay_vars, "vars.config"},
|
||||
{overlay, [{mkdir, "logs"},
|
||||
{mkdir, "database"},
|
||||
{mkdir, "conf"},
|
||||
{copy, "rel/files/erl", "erts-\{\{erts_vsn\}\}/bin/erl"},
|
||||
{template, "ejabberdctl.template", "bin/ejabberdctl"},
|
||||
{copy, "inetrc", "conf/inetrc"},
|
||||
{copy, "tools/captcha*.sh", "lib/ejabberd-\{\{release_version\}\}/priv/bin/"},
|
||||
{copy, "rel/files/install_upgrade.escript", "bin/install_upgrade.escript"}]}
|
||||
]}.
|
||||
|
||||
{profiles, [{prod, [{relx, [{debug_info, strip},
|
||||
{dev_mode, false},
|
||||
{include_erts, true},
|
||||
{include_src, true},
|
||||
{generate_start_script, false},
|
||||
{overlay, [{copy, "sql/*", "lib/ejabberd-\{\{release_version\}\}/priv/sql/"},
|
||||
{copy, "ejabberdctl.cfg.example", "conf/ejabberdctl.cfg"},
|
||||
{copy, "ejabberd.yml.example", "conf/ejabberd.yml"}]}]}]},
|
||||
{dev, [{post_hooks, [{release, "rel/setup-dev.sh"}]},
|
||||
{relx, [{debug_info, keep},
|
||||
{dev_mode, true},
|
||||
{include_erts, true},
|
||||
{include_src, false},
|
||||
{generate_start_script, true},
|
||||
{extended_start_script, true},
|
||||
{overlay, [{copy, "ejabberdctl.cfg.example", "conf/ejabberdctl.cfg.example"},
|
||||
{copy, "ejabberd.yml.example", "conf/ejabberd.yml.example"},
|
||||
{copy, "test/ejabberd_SUITE_data/ca.pem", "conf/"},
|
||||
{copy, "test/ejabberd_SUITE_data/cert.pem", "conf/"}]}]}]},
|
||||
{test, [{erl_opts, [nowarn_export_all]}]}]}.
|
||||
|
||||
{alias, [{relive, [{shell, "--apps ejabberd \
|
||||
--config rel/relive.config \
|
||||
--script rel/relive.escript \
|
||||
--name ejabberd@localhost"}]}
|
||||
]}.
|
||||
|
||||
%% Local Variables:
|
||||
%% mode: erlang
|
||||
%% End:
|
||||
|
||||
+47
-17
@@ -1,6 +1,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
@@ -339,17 +339,44 @@ fun(Deps, FDeps) ->
|
||||
end, Deps)
|
||||
end,
|
||||
|
||||
TravisPostHooks =
|
||||
fun(true) ->
|
||||
[{ct, "echo '\n%%! -pa ebin/ deps/coveralls/ebin\n" ++
|
||||
"main(_)->{ok,F}=file:open(\"erlang.json\",[write])," ++
|
||||
"io:fwrite(F,\"~s\",[coveralls:convert_file(" ++
|
||||
"\"logs/all.coverdata\", \"" ++
|
||||
os:getenv("TRAVIS_JOB_ID") ++
|
||||
"\", \"travis-ci\",\"\")]).' > getcover.erl"},
|
||||
{ct, "escript ./getcover.erl"}];
|
||||
(_) ->
|
||||
[]
|
||||
|
||||
VarsApps = case file:consult(filename:join([filename:dirname(SCRIPT),"vars.config"])) of
|
||||
{ok, TermsV} ->
|
||||
case proplists:get_bool(odbc, TermsV) of
|
||||
true -> [odbc];
|
||||
false -> []
|
||||
end;
|
||||
_->
|
||||
[]
|
||||
end,
|
||||
|
||||
ProcessRelx = fun(Relx, Deps) ->
|
||||
{value, {release, NameVersion, DefaultApps}, RelxTail} = lists:keytake(release, 1, Relx),
|
||||
ProfileApps = case os:getenv("REBAR_PROFILE") of
|
||||
"dev" -> [observer, runtime_tools, wx, debugger];
|
||||
_ -> []
|
||||
end,
|
||||
DepApps = lists:map(fun({DepName, _, _}) -> DepName;
|
||||
({DepName, _}) -> DepName
|
||||
end, Deps),
|
||||
[{release, NameVersion, DefaultApps ++ VarsApps ++ ProfileApps ++ DepApps} | RelxTail]
|
||||
end,
|
||||
|
||||
GithubConfig = case {os:getenv("GITHUB_ACTIONS"), os:getenv("GITHUB_TOKEN")} of
|
||||
{"true", Token} when is_list(Token) ->
|
||||
CONFIG1 = [{coveralls_repo_token, Token},
|
||||
{coveralls_service_job_id, os:getenv("GITHUB_RUN_ID")},
|
||||
{coveralls_commit_sha, os:getenv("GITHUB_SHA")},
|
||||
{coveralls_service_number, os:getenv("GITHUB_RUN_NUMBER")}],
|
||||
case os:getenv("GITHUB_EVENT_NAME") =:= "pull_request"
|
||||
andalso string:tokens(os:getenv("GITHUB_REF"), "/") of
|
||||
[_, "pull", PRNO, _] ->
|
||||
[{coveralls_service_pull_request, PRNO} | CONFIG1];
|
||||
_ ->
|
||||
CONFIG1
|
||||
end;
|
||||
_ ->
|
||||
[]
|
||||
end,
|
||||
|
||||
Rules = [
|
||||
@@ -358,10 +385,10 @@ Rules = [
|
||||
{compile, {asn, compile}},
|
||||
{clean, {asn, clean}}
|
||||
]}]), []},
|
||||
{[deps], os:getenv("TRAVIS") == "true",
|
||||
AppendList([{coveralls, ".*", {git, "https://github.com/markusn/coveralls-erl", {tag, "v2.0.1"}}}]), []},
|
||||
{[post_hooks], [cover_enabled], os:getenv("TRAVIS") == "true",
|
||||
AppendList2(TravisPostHooks), [], false},
|
||||
{[plugins], IsRebar3 and (os:getenv("GITHUB_ACTIONS") == "true"),
|
||||
AppendList([{coveralls, {git,
|
||||
"https://github.com/processone/coveralls-erl.git",
|
||||
{branch, "addjsonfile"}}} ]), []},
|
||||
{[overrides], [post_hook_configure], SystemDeps == false,
|
||||
AppendList2(GenDepsConfigure), [], []},
|
||||
{[ct_extra_params], [eunit_compile_opts], true,
|
||||
@@ -370,6 +397,8 @@ Rules = [
|
||||
ProcessErlOpt, []},
|
||||
{[xref_queries], [xref_exclusions], true,
|
||||
AppendList2(ProcssXrefExclusions), [], []},
|
||||
{[relx], [deps], IsRebar3,
|
||||
ProcessRelx, [], []},
|
||||
{[deps], [floating_deps], true,
|
||||
ProcessFloatingDeps, [], []},
|
||||
{[deps], [gitonly_deps], IsRebar3,
|
||||
@@ -379,7 +408,8 @@ Rules = [
|
||||
],
|
||||
|
||||
Config = [{plugin_dir, filename:join([filename:dirname(SCRIPT),"plugins"])}]++
|
||||
FilterConfig(ProcessVars(CONFIG, []), Rules),
|
||||
FilterConfig(ProcessVars(CONFIG, []), Rules)++
|
||||
GithubConfig,
|
||||
|
||||
%io:format("ejabberd configuration:~n ~p~n", [Config]),
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[{mnesia, [{dir, "_build/relive/database"}]},
|
||||
{ejabberd, [{config, "_build/relive/conf/ejabberd.yml"},
|
||||
{log_path, "_build/relive/logs/ejabberd.log"}]}].
|
||||
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env escript
|
||||
|
||||
main(_) ->
|
||||
Base = "_build/relive",
|
||||
prepare(Base, "", none),
|
||||
prepare(Base, "conf", {os, cmd, "rel/setup-relive.sh"}),
|
||||
prepare(Base, "database", none),
|
||||
prepare(Base, "logs", none),
|
||||
c:erlangrc([os:cmd("echo -n $HOME")]),
|
||||
ok.
|
||||
|
||||
prepare(BaseDir, SuffixDir, MFA) ->
|
||||
Dir = filename:join(BaseDir, SuffixDir),
|
||||
case file:make_dir(Dir) of
|
||||
ok ->
|
||||
io:format("Preparing relive dir ~s...~n", [Dir]),
|
||||
case MFA of
|
||||
none -> ok;
|
||||
{M, F, A} -> M:F(A)
|
||||
end;
|
||||
{error, eexist} ->
|
||||
ok;
|
||||
{error, LogsError} ->
|
||||
io:format("Error creating dir ~s: ~p~n", [Dir, LogsError]),
|
||||
halt(1)
|
||||
end.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user