Merge pull request #2911 from modoboa/imap-migration-to-v2

Import imap-migration
This commit is contained in:
Antoine Nguyen
2023-04-20 11:51:30 +02:00
committed by GitHub
374 changed files with 105573 additions and 60474 deletions
+55
View File
@@ -0,0 +1,55 @@
IMAP Migration for Modoboa
===========================
.. _imap:
A simple `Modoboa <http://modoboa.org/>`_ extension which provides a
way to transfer your account from another provider/server
provided that you have IMAP access to it.
Configuration
-------------
The plugin configuration is done from the admin panel (*Modoboa >
Parameters > IMAP Migration*). And you have a specific tab to configure
your migration that is visible for SuperAdmins.
These settings are only available on the new admin interface.
.. warning::
You must have enabled "Auto create domain" in modoboa parameters for this extension to work.
This extension can create `OfflineIMAP <https://www.offlineimap.org/doc/installation.html>`_
configuration file with the command:
.. sourcecode:: bash
> python manage.py generate_offlineimap_config
You then need to setup `OfflineIMAP <https://www.offlineimap.org/doc/quick_start.html>`_.
..
This will sync back-and-forth user mailbox.
Providers
---------
Mail server can host multiple domains so the provider address
may be different from the domain part of your email address.
Associated domain is the domain part of the email address.
You can leave "Local Domain" blank if you keep the same domain.
This domain will be auto-created if needed.
you must create the domain beforhand if you want to migrate an account
from `user@domain1.tld` to `user@domain2.tld`.
Migrations
----------
Migrations are automatically handled when providers have been configured.
Users use their old credential to log and the account is automatically created.
They shall use the new domain on next logins if a local domain was set in the provider configuration.
If you have installed OfflineIMAP, you may delete the migration to stop mailbox sync.
SuperAdmins may check migrations in the `IMAP Migration` tab.
+4 -4
View File
@@ -34,6 +34,10 @@ It provides built-in features by default :
| |containing account | |
| |credentials | |
+---------------------------------------------------------+-------------------------+------------------------------------------------------+
|modoboa-imap-migration |Transfer accounts from |:ref:`modoboa_imap-migration Documentation <imap>` |
| |other mail server | |
| |automatically | |
+---------------------------------------------------------+-------------------------+------------------------------------------------------+
And it is extensible by nature and comes with a lot of additional extensions:
@@ -49,10 +53,6 @@ And it is extensible by nature and comes with a lot of additional extensions:
| | | |
| | | |
+---------------------------------------------------------+-------------------------+------------------------------------------------------+
|`modoboa-imap-migration |Migrate mailboxes from an|https://github.com/modoboa/modoboa-imap-migration |
|<https://github.com/modoboa/modoboa-imap-migration>`_ |existing server using | |
| |IMAP (and offlineimap) | |
+---------------------------------------------------------+-------------------------+------------------------------------------------------+
|`modoboa-pfxadmin-migrate |A tool to migrate from |https://github.com/modoboa/modoboa-pfxadmin-migrate |
|<https://github.com/modoboa/modoboa-pfxadmin-migrate>`_ |Postfixadmin | |
+---------------------------------------------------------+-------------------------+------------------------------------------------------+
+19 -5
View File
@@ -111,9 +111,20 @@ Specific instructions
2.1.0
=====
The ``modoboa-dmarc`` and ``modoboa.pdfcredentials`` plugins have been merged into the core.
The ``modoboa-dmarc``, ``modoboa-pdfcredentials`` and ``modoboa-imapmigration``
plugins have been merged into the core.
Add ``'modoboa.dmarc'`` and ``'modoboa.pdfcredentials'`` to ``MODOBOA_APPS``:
Add ``'django_rename_app,'`` To ``INSTALLED_APPS``:
.. sourcecode:: python
INSTALLED_APPS = (
...,
'django_rename_app',
)
Add ``'modoboa.dmarc'``, ``'modoboa.pdfcredentials'`` and ``'modoboa.imap_migration'``
to ``MODOBOA_APPS``:
.. sourcecode:: python
@@ -130,16 +141,19 @@ Add ``'modoboa.dmarc'`` and ``'modoboa.pdfcredentials'`` to ``MODOBOA_APPS``:
'modoboa.policyd',
'modoboa.maillog',
'modoboa.dmarc',
'modoboa.pdfcredentials'
'modoboa.pdfcredentials',
'modoboa.imap_migration',
)
And remove any reference to ``'modoboa_dmarc'`` or ``'modoboa.pdfcredentials'`` in this same variable.
And remove any reference to ``'modoboa_dmarc'``, ``'modoboa_pdfcredentials'`` or ``'modoboa_imap_migration'``
in this same variable.
After upgrading modoboa, run the following commands from your virtual environment:
.. sourcecode:: bash
python manage.py rename_app modoboa_dmarc dmarc
> python manage.py rename_app modoboa_dmarc dmarc
> python manage.py rename_app modoboa_imap_migration imap_migration
2.0.4
+2 -2
View File
@@ -3,7 +3,7 @@ version: '3'
services:
api:
container_name: modoboa_api
restart: always
restart: unless-stopped
build:
context: .
dockerfile: docker/Dockerfile.dev
@@ -24,7 +24,7 @@ services:
front:
container_name: modoboa_front
restart: always
restart: unless-stopped
build:
context: .
dockerfile: docker/Dockerfile.front.dev
+2 -2
View File
@@ -7,7 +7,7 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH"
FROM base as build
RUN apk add --update openssl librrd python3-dev libffi-dev gcc g++ musl-dev libxml2-dev libxslt-dev \
libressl-dev jpeg-dev rrdtool-dev file make gettext \
libressl-dev jpeg-dev rrdtool-dev file make gettext freetype-dev \
&& rm -rf /var/cache/apk/*
RUN python3 -m venv $VIRTUAL_ENV
WORKDIR /tmp
@@ -18,7 +18,7 @@ RUN pip install -r requirements.txt -r test-requirements.txt
FROM base as run
COPY --from=build $VIRTUAL_ENV $VIRTUAL_ENV
RUN apk add --no-cache --update librrd libxslt libjpeg libressl git rrdtool \
RUN apk add --no-cache --update librrd libxslt libjpeg libressl git rrdtool libmagic \
&& rm -rf /var/cache/apk/*
RUN mkdir /code
WORKDIR /code
+2 -2
View File
@@ -47,9 +47,9 @@ translations: ./$(INPUT_DIR)/translations.json
# Generate .po files for each available language.
@for lang in $(LOCALES); do \
export PO_FILE=$(OUTPUT_DIR)/locale/$$lang/LC_MESSAGES/app.po; \
echo "msgmerge --update $$PO_FILE $@"; \
echo "msgmerge --backup=off --update $$PO_FILE $@"; \
mkdir -p $$(dirname $$PO_FILE); \
[ -f $$PO_FILE ] && msgmerge --lang=$$lang --update $$PO_FILE $@ || msginit --no-translator --locale=$$lang --input=$@ --output-file=$$PO_FILE; \
[ -f $$PO_FILE ] && msgmerge --backup=off --lang=$$lang --update $$PO_FILE $@ || msginit --no-translator --locale=$$lang --input=$@ --output-file=$$PO_FILE; \
msgattrib --no-wrap --no-obsolete -o $$PO_FILE $$PO_FILE; \
done;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

@@ -0,0 +1,15 @@
import repository from '@/api/repository'
const resource = 'migrations'
export default {
getMigrations (params) {
return repository.get(`/${resource}/`, { params })
},
getMigration (slug, query) {
return repository.get(`/${resource}/${slug}/`, query)
},
deleteMigration (slug) {
return repository.delete(`/${resource}/${slug}/`)
}
}
@@ -0,0 +1,30 @@
import repository from '@/api/repository'
const resource = 'email-providers'
export default {
getProviders (params) {
return repository.get(`/${resource}/`, { params })
},
getProvider (providerId) {
return repository.get(`/${resource}/${providerId}/`)
},
createProvider (params) {
return repository.post(`/${resource}/`, params)
},
updateProvider (slug, params) {
return repository.put(`/${resource}/${slug}/`, params)
},
patchProvider (providerId, params) {
return repository.patch(`/${resource}/${providerId}/`, params)
},
deleteProvider (slug) {
return repository.delete(`/${resource}/${slug}/`)
},
checkProvider (params) {
return repository.post(`/${resource}/check_connection/`, params)
},
checkAssociatedDomain (params) {
return repository.post(`/${resource}/check_associated_domain/`, params)
}
}
@@ -0,0 +1,117 @@
<template>
<v-card class="mt-6">
<v-toolbar flat>
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<v-btn v-bind="attrs" v-on="on" small>
Actions <v-icon right>mdi-chevron-down</v-icon>
</v-btn>
</template>
<v-list dense>
</v-list>
</v-menu>
<v-spacer></v-spacer>
<v-text-field
v-model="search"
prepend-inner-icon="mdi-magnify"
placeholder="Search"
filled
outlined
dense
hide-details
></v-text-field>
</v-toolbar>
<v-data-table
v-model="selected"
:headers="headers"
:items="migrations"
:search="search"
item-key="id"
:options.sync="options"
:server-items-length="totalMigrations"
:loading="loading"
class="elevation-1"
show-select
>
<template v-slot:item.mailbox="{ item }">
<router-link :to="{ name: 'AccountDetail', params: { id: item.mailbox.user } }">
{{ item.mailbox.full_address }}
</router-link>
</template>
<template v-slot:item.actions="{ item }">
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<v-btn icon v-bind="attrs" v-on="on">
<v-icon>mdi-dots-horizontal</v-icon>
</v-btn>
</template>
<menu-items :items="getMenuItems(item)" :object="item" />
</v-menu>
</template>
</v-data-table>
</v-card>
</template>
<script>
import Migration from '@/api/imap_migration/migrations'
import MenuItems from '@/components/tools/MenuItems'
import { bus } from '@/main'
export default {
components: {
MenuItems
},
data () {
return {
migrations: [],
headers: [
{ text: this.$gettext('Provider'), value: 'provider.name' },
{ text: this.$gettext('Old account'), value: 'username' },
{ text: this.$gettext('New account'), value: 'mailbox' },
{ text: this.$gettext('Actions'), value: 'actions', sortable: false, align: 'right' }
],
selected: [],
loading: true,
search: '',
options: {},
totalMigrations: 0
}
},
methods: {
deleteMigration (migration) {
Migration.deleteMigration(migration.id).then(response => {
bus.$emit('notification', { msg: this.$gettext('Migration deleted') })
this.migrations = this.migrations.filter(item => {
return item.id !== migration.id
})
})
},
getMigrations (filter) {
this.loading = true
let query = {}
if (filter !== undefined) {
query = { params: { search: filter } }
}
Migration.getMigrations(query).then(response => {
this.migrations = response.data
this.totalMigrations = this.migrations.length
this.loading = false
})
},
getMenuItems (item) {
const result = []
result.push({
label: this.$gettext('Delete'),
icon: 'mdi-delete-outline',
onClick: this.deleteMigration,
color: 'red'
})
return result
}
},
mounted () {
this.getMigrations()
}
}
</script>
@@ -0,0 +1,143 @@
<template>
<validation-observer ref="observer">
<validation-provider
v-slot="{ errors }"
rules=""
vid="name"
>
<v-text-field
ref="initialdomainField"
v-model="domain.name"
:error-messages="errors"
:placeholder="'Name of the domain to migrate' | translate"
outlined
dense
@input="update"
@keydown="onKeyDown"
/>
</validation-provider>
<validation-provider
v-slot="{ errors }"
rules=""
vid="new_domain"
>
<v-autocomplete
v-model="domain.new_domain"
:error-messages="errors"
:label="'Local domain (optional)'|translate"
:items="localDomains"
item-text="name"
return-object
outlined
dense
@input="update"
@keydown="onKeyDown"
/>
</validation-provider>
<v-btn
color="primary"
@click="addDomain"
>
<v-icon>mdi-plus</v-icon>
</v-btn>
<v-spacer />
<v-chip
v-for="(domain, index) in domains"
:key="index"
class="mr-2 mt-2"
close
@click:close="removeDomain(index)"
>
<template v-if="domain.new_domain">
{{domain.name}} --> {{domain.new_domain.name}}
</template>
<template v-else>
{{domain.name}}
</template>
</v-chip>
</validation-observer>
</template>
<script>
import domainsApi from '@/api/domains'
import providerApi from '@/api/imap_migration/providers'
export default {
props: ['value'],
data () {
return {
domains: [],
domain: {
name: '',
new_domain: ''
},
localDomains: []
}
},
methods: {
reset () {
this.domains = []
this.domain = {
name: '',
new_domain: ''
}
},
async validateForm () {
return await this.$refs.observer.validate()
},
update () {
this.$emit('input', this.domains)
},
async addDomain () {
if (await this.validateForm()) {
providerApi.checkAssociatedDomain(this.domain).then(response => {
if (response.status === 200) {
this.domains.push({
name: this.domain.name,
new_domain: this.domain.new_domain
})
this.$refs.observer.reset()
this.domain = {
name: '',
new_domain: ''
}
this.$emit('input', this.domains)
}
}).catch(error => {
this.$refs.observer.setErrors(error.response.data)
})
}
},
removeDomain (index) {
this.domains.splice(index, 1)
this.$emit('input', this.domains)
},
onKeyDown (e) {
const keyCode = e.keyCode
if (keyCode === 13 || keyCode === 9) {
// on enter or tab
this.addDomain()
e.preventDefault()
}
}
},
mounted () {
domainsApi.getDomains().then(resp => {
this.localDomains = resp.data
})
},
watch: {
value: {
handler: function (newValue) {
if (newValue) {
this.domains = [...newValue]
} else {
this.domains = []
}
},
immediate: true
}
}
}
</script>
@@ -0,0 +1,132 @@
<template>
<creation-form
ref="form"
:title="'New provider'|translate"
:steps="steps"
:form-observer-getter="getObserver"
:form-getter="getForm"
:validate-object="validateProvider"
:summary-sections="summarySections"
@close="close"
@create="submit"
>
<template v-slot:form.general="{ step }">
<provider-general-form :ref="`form_${step}`" v-model="provider" />
</template>
<template v-slot:form.associated="{ step }">
<provider-associated-form :ref="`form_${step}`" v-model="provider.domains" />
</template>
</creation-form>
</template>
<script>
import { bus } from '@/main'
import CreationForm from '@/components/tools/CreationForm'
import ProviderAssociatedForm from './ProviderAssociatedForm'
import ProviderGeneralForm from './ProviderGeneralForm'
export default {
props: ['value'],
components: {
CreationForm,
'provider-associated-form': ProviderAssociatedForm,
ProviderGeneralForm
},
computed: {
associatedDomainsSummary () {
const result = []
for (const domain of this.provider.domains) {
const value = domain.new_domain ? `${domain.name} => ${domain.new_domain.name}` : domain.name
result.push(
{ key: '', value }
)
}
return result
},
summarySections () {
const result = [
{
title: this.$gettext('General'),
items: [
{ key: this.$gettext('Name'), value: this.provider.name },
{ key: this.$gettext('Address'), value: this.provider.address },
{ key: this.$gettext('Port'), value: this.provider.port },
{ key: this.$gettext('Secured'), value: this.provider.secured, type: 'yesno' }
]
},
{
title: this.$gettext('Associated domains'),
items: this.associatedDomainsSummary
}
]
return result
},
steps () {
return [
{ name: 'general', title: this.$gettext('General') },
{ name: 'associated', title: this.$gettext('Associated domains') }
]
}
},
data () {
return {
provider: {
domains: []
},
formErrors: {}
}
},
mounted () {
this.initProvider()
},
methods: {
initProvider () {
this.provider = {
name: '',
address: '',
port: 993,
secured: true,
domains: []
}
},
close () {
this.initProvider()
this.$refs.form.resetForm()
this.$emit('close')
},
getForm (step) {
return this.$refs[`form_${step}`]
},
getObserver (step) {
return this.$refs[`form_${step}`].$refs.observer
},
validateProvider () {
},
submit () {
const data = { ...this.provider }
data.domains = []
for (const domain of this.provider.domains) {
if (domain.new_domain) {
data.domains.push({
name: domain.name,
new_domain: domain.new_domain.pk
})
} else {
data.domains.push(domain)
}
}
this.$store.dispatch('providers/createProvider', data).then(() => {
bus.$emit('notification', { msg: this.$gettext('Provider created') })
this.close()
})
}
}
}
</script>
<style lang="scss">
.highligth {
background-color: #515D78;
}
</style>
@@ -0,0 +1,151 @@
<template>
<div>
<v-expansion-panels v-model="panel">
<v-expansion-panel>
<v-expansion-panel-header v-slot="{ open }">
<v-row no-gutters>
<v-col cols="4">
<translate>General</translate>
</v-col>
<v-col
cols="8"
class="text--secondary"
>
<v-fade-transition leave-absolute>
<span v-if="open"></span>
<v-row
v-else
no-gutters
style="width: 100%"
>
<v-col cols="6">
<translate>Name: </translate> {{ editedProvider.name }}
</v-col>
</v-row>
</v-fade-transition>
</v-col>
</v-row>
</v-expansion-panel-header>
<v-expansion-panel-content>
<provider-general-form ref="generalForm" v-model="editedProvider" />
</v-expansion-panel-content>
</v-expansion-panel>
<v-expansion-panel>
<v-expansion-panel-header v-slot="{ open }">
<v-row no-gutters>
<v-col cols="4">
<translate>Associated domains</translate>
</v-col>
<v-col
cols="8"
class="text--secondary"
>
<v-fade-transition leave-absolute>
<span v-if="open"></span>
<v-row
v-else
no-gutters
style="width: 100%"
>
<v-col v-if="editedProvider.domains.length > 0" cols="6">
<translate>Number of associated domains: </translate> {{ editedProvider.domains.length }}
</v-col>
<v-col v-else cols="6">
<translate>No associated domains</translate>
</v-col>
</v-row>
</v-fade-transition>
</v-col>
</v-row>
</v-expansion-panel-header>
<v-expansion-panel-content>
<provider-associated-form ref="associatedForm" v-model="editedProvider.domains" />
</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
<div class="mt-4 d-flex justify-end">
<v-btn @click="$router.go(-1)">
<translate>Cancel</translate>
</v-btn>
<v-btn class="ml-4" color="primary darken-1" @click="save">
<translate>Save</translate>
</v-btn>
</div>
</div>
</template>
<script>
import { bus } from '@/main'
import providers from '@/api/imap_migration/providers'
import ProviderGeneralForm from './ProviderGeneralForm'
import ProviderAssociatedForm from './ProviderAssociatedForm'
export default {
components: {
ProviderGeneralForm,
ProviderAssociatedForm
},
props: ['provider'],
data () {
return {
editedProvider: {},
panel: 0
}
},
methods: {
async save () {
if (this.$refs.generalForm !== undefined) {
const valid = await this.$refs.generalForm.validateForm()
if (!valid) {
return
}
}
if (this.$refs.associatedForm !== undefined) {
const valid = await this.$refs.associatedForm.validateForm()
if (!valid) {
return
}
}
try {
const data = { ...this.editedProvider }
data.domains = []
for (const domain of this.editedProvider.domains) {
if (domain.new_domain) {
data.domains.push({
name: domain.name,
new_domain: domain.new_domain.pk || domain.new_domain.id
})
} else {
data.domains.push(domain)
}
}
await providers.patchProvider(this.editedProvider.id, data).then(() => {
bus.$emit('notification', { msg: this.$gettext('Provider updated') })
this.$store.dispatch('providers/getProviders')
this.$router.push({ name: 'ProvidersList' })
})
} catch (error) {
if (this.$refs.generalForm) {
this.$refs.generalForm.$refs.observer.setErrors(error.response.data)
}
if (this.$refs.associatedForm) {
this.$refs.associatedForm.$refs.observer.setErrors(error.response.data)
}
}
}
},
watch: {
provider: {
handler: function (val) {
if (val) {
this.editedProvider = { ...val }
if (!this.editedProvider.domains) {
this.editedProvider.domains = []
}
}
},
immediate: true
}
}
}
</script>
@@ -0,0 +1,175 @@
<template>
<validation-observer ref="observer">
<validation-provider
v-slot="{ errors }"
rules="required"
>
<v-text-field
:label="'Provider name' | translate"
v-model="form.name"
:error-messages="errors"
outlined
@input="update"
/>
</validation-provider>
<validation-provider
v-slot="{ errors }"
rules="required"
>
<v-text-field
:label="'Address (hostname or IP)' | translate"
v-model="form.address"
:error-messages="errors"
outlined
@input="update"
/>
</validation-provider>
<validation-provider
v-slot="{ errors }"
rules="required|portNumber"
>
<v-text-field
:label="'IMAP Port' | translate"
v-model="form.port"
type="number"
:error-messages="errors"
outlined
@input="update"
/>
</validation-provider>
<v-switch
:label="'Secured' | translate"
v-model="form.secured"
:hint="'Control if the IMAP is secured through SSL/TLS or Start SSL' | translate"
persistent-hint
@change="update"
/>
<div class="my-7">
<v-btn
:loading="loading"
color="primary"
@click="checkConnection"
>
<translate>Check connection: </translate>
<v-icon
v-if="connectionStatus === 0"
color="blue-grey-darken-2"
>
mdi-help-circle-outline
</v-icon>
<v-icon
v-else-if="connectionStatus === 1"
color="success"
>
mdi-check-all
</v-icon>
<v-icon
v-else
color="warning"
>
mdi-alert-circle-outline
</v-icon>
<template v-slot:loader>
<span class="custom-loader">
<v-icon light>mdi-cached</v-icon>
</span>
</template>
</v-btn>
</div>
</validation-observer>
</template>
<script>
import Provider from '@/api/imap_migration/providers'
export default {
props: ['value'],
data () {
return {
form: {},
connectionStatus: 0,
loading: false
}
},
methods: {
reset () {
this.form = {}
},
async checkConnection () {
if (await this.validateForm()) {
this.loading = true
const params = {
address: this.form.address,
port: this.form.port,
secured: this.form.secured
}
console.error(params)
Provider.checkProvider(params).then(response => {
this.connectionStatus = 1
this.loading = false
}).catch(error => {
console.log(error)
this.loading = false
this.connectionStatus = 2
})
}
},
async validateForm () {
return await this.$refs.observer.validate()
},
update () {
this.connectionStatus = 0
console.log(this.form)
this.$emit('input', this.form)
}
},
watch: {
value: {
handler (newValue) {
this.form = { ...newValue }
},
immediate: true
}
}
}
</script>
<style>
.custom-loader {
animation: loader 1s infinite;
display: flex;
}
@-moz-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-webkit-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-o-keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@keyframes loader {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
</style>
@@ -0,0 +1,154 @@
<template>
<v-card class="mt-6">
<v-toolbar flat>
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<v-btn v-bind="attrs" v-on="on" small>
Actions <v-icon right>mdi-chevron-down</v-icon>
</v-btn>
</template>
<v-list dense>
</v-list>
</v-menu>
<v-spacer></v-spacer>
<v-text-field
v-model="search"
prepend-inner-icon="mdi-magnify"
placeholder="Search"
filled
outlined
dense
hide-details
></v-text-field>
</v-toolbar>
<v-data-table
v-model="selected"
:headers="headers"
:items="providers"
:search="search"
item-key="name"
single-expand
:expanded.sync="expanded"
class="elevation-1"
show-select
@click:row="(item, slot) => slot.expand(!slot.isExpanded)"
>
<template v-slot:item.secured="{ item }">
<v-icon
v-if="item.secured === true"
color="green"
>
mdi-lock
</v-icon>
<v-icon
color="red"
v-else
>
mdi-lock-off
</v-icon>
</template>
<template v-slot:item.domains="{ item }">
<v-chip
v-if="item.domains.length > 0"
>
{{item.domains.length}} associated domain(s)
</v-chip>
<v-chip
v-else
>
No associated domain
</v-chip>
</template>
<template v-slot:expanded-item="{ headers, item }">
<td :colspan="headers.length">
<v-chip
v-for="(domain, index) in item.domains"
:key="index"
>
<template v-if="domain.new_domain">
{{domain.name}} --> {{domain.new_domain.name}}
</template>
<template v-else>
{{domain.name}} --> {{domain.name}}
</template>
</v-chip>
</td>
</template>
<template v-slot:item.actions="{ item }">
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<v-btn icon v-bind="attrs" v-on="on">
<v-icon>mdi-dots-horizontal</v-icon>
</v-btn>
</template>
<menu-items :items="getMenuItems(item)" :object="item" />
</v-menu>
</template>
</v-data-table>
</v-card>
</template>
<script>
import { mapGetters } from 'vuex'
import { bus } from '@/main'
import MenuItems from '@/components/tools/MenuItems'
export default {
components: {
MenuItems
},
computed: mapGetters({
providers: 'providers/providers'
}),
data () {
return {
headers: [
{ text: this.$gettext('Name'), value: 'name' },
{ text: this.$gettext('Address'), value: 'address' },
{ text: this.$gettext('Port'), value: 'port' },
{ text: this.$gettext('Secured'), value: 'secured' },
{ text: this.$gettext('Associated domains'), value: 'domains' },
{ text: this.$gettext('Actions'), value: 'actions', sortable: false, align: 'right' }
],
selected: [],
search: '',
expanded: []
}
},
methods: {
deleteProvider (provider) {
this.$store.dispatch('providers/deleteProvider', { id: provider.id }).then(resp => {
bus.$emit('notification', { msg: this.$gettext('Provider deleted') })
})
},
editProvider (provider) {
this.$router.push({ name: 'ProviderEdit', params: { id: provider.id } })
},
loadAssociatedDomains ({ item, value }) {
if (!value) {
return
}
this.$set(this.item.domains)
},
getMenuItems (item) {
const result = []
result.push({
label: this.$gettext('Delete'),
icon: 'mdi-delete-outline',
onClick: this.deleteProvider,
color: 'red'
})
result.push({
label: this.$gettext('Edit'),
icon: 'mdi-circle-edit-outline',
onClick: this.editProvider
})
return result
}
},
created () {
this.$store.dispatch('providers/getProviders')
}
}
</script>
+30 -2
View File
@@ -114,6 +114,7 @@
<script>
import parameters from '@/api/parameters'
import { bus } from '@/main'
import { mapGetters } from 'vuex'
export default {
@@ -154,6 +155,7 @@ export default {
},
data () {
return {
imapMigration: false,
drawer: true,
mainMenuItems: [
{
@@ -196,6 +198,23 @@ export default {
}
]
},
{
icon: 'mdi-email-sync-outline',
text: this.$gettext('IMAP Migration'),
roles: ['SuperAdmins', 'Resellers'],
children: [
{
text: this.$gettext('Email providers'),
to: { name: 'ProvidersList' },
roles: ['SuperAdmins', 'Resellers']
},
{
text: this.$gettext('Migrations'),
to: { name: 'MigrationsList' },
roles: ['Resellers', 'SuperAdmins']
}
]
},
{
icon: 'mdi-cog',
text: this.$gettext('Settings'),
@@ -261,16 +280,25 @@ export default {
created () {
parameters.getApplications().then(response => {
response.data.forEach(item => {
this.mainMenuItems[5].children.push({
this.mainMenuItems[6].children.push({
text: item.label,
to: { name: 'ParametersEdit', params: { app: item.name } }
})
})
})
parameters.getApplication('imap_migration').then(response => {
this.imapMigration = response.data.params.enabled_imapmigration
})
bus.$on('imapSettingsChanged', (status) => { this.imapMigration = status })
},
methods: {
displayMenuItem (item) {
return (item.roles === undefined || item.roles.indexOf(this.authUser.role) !== -1) && (item.condition === undefined || item.condition())
const condition = (item.roles === undefined || item.roles.indexOf(this.authUser.role) !== -1) && (item.condition === undefined || item.condition()) && (item.activated !== false)
if (item.icon === 'mdi-email-sync-outline') {
// For imapMigration
return condition && this.imapMigration
}
return condition
},
logout () {
this.$store.dispatch('auth/logout').then(() => {
@@ -27,6 +27,8 @@
v-model="parameters[param.name]"
:label="param.label"
:hint="param.help_text"
:error="formErrors[param.name] !== undefined"
:error-messages="formErrors[param.name]"
persistent-hint
v-if="param.widget === 'BooleanField'"
/>
@@ -136,6 +138,9 @@ export default {
this.formErrors = {}
parameters.saveApplication(this.$route.params.app, this.parameters).then(() => {
bus.$emit('notification', { msg: this.$gettext('Parameters updated') })
if (this.$route.params.app === 'imap_migration') {
bus.$emit('imapSettingsChanged', this.parameters.enabled_imapmigration)
}
}).catch(error => {
this.formErrors = error.response.data
})
+9
View File
@@ -36,6 +36,15 @@ extend('validPassword', {
},
message: $gettext('Invalid password')
})
extend('portNumber', {
validate: async (value) => {
if (value < 0 || value > 65535) {
return false
}
return true
},
message: $gettext('Specify a valid port number')
})
// Register components globally
Vue.component('ValidationObserver', ValidationObserver)
+27
View File
@@ -56,6 +56,33 @@ const routes = [
allowedRoles: ['DomainAdmins', 'Resellers', 'SuperAdmins']
}
},
{
path: '/imap_migration/migrations',
name: 'MigrationsList',
component: () => import('../components/imap_migration/MigrationsList.vue'),
meta: {
requiresAuth: true,
allowedRoles: ['Resellers', 'SuperAdmins']
}
},
{
path: '/imap_migration/providers',
name: 'ProvidersList',
component: () => import('../views/imap_migration/Providers.vue'),
meta: {
requiresAuth: true,
allowedRoles: ['Resellers', 'SuperAdmins']
}
},
{
path: '/imap_migration/providers/:id/edit',
name: 'ProviderEdit',
component: () => import('../views/imap_migration/ProviderEdit.vue'),
meta: {
requiresAuth: true,
allowedRoles: ['Resellers', 'SuperAdmins']
}
},
{
path: '/identities',
name: 'Identities',
+3 -1
View File
@@ -4,6 +4,7 @@ import Vuex from 'vuex'
import auth from '@/store/modules/auth'
import domains from '@/store/modules/domains'
import identities from '@/store/modules/identities'
import providers from '@/store/modules/providers'
Vue.use(Vuex)
@@ -11,7 +12,8 @@ export default new Vuex.Store({
modules: {
auth,
domains,
identities
identities,
providers
},
strict: process.env.NODE_ENV !== 'production'
})
+73
View File
@@ -0,0 +1,73 @@
import Vue from 'vue'
import providerApi from '@/api/imap_migration/providers'
// mutation types
export const ADD_PROVIDER = 'ADD_PROVIDER'
export const UPDATE_PROVIDER = 'SET_PROVIDER'
export const SET_PROVIDERS = 'SET_PROVIDERS'
export const DELETE_PROVIDER = 'DELETE_PROVIDER'
const state = {
providersLoaded: false,
providers: []
}
const getters = {
providers: state => state.providers
}
const actions = {
getProviders ({ commit }, params) {
return providerApi.getProviders(params).then(response => {
commit(SET_PROVIDERS, { providers: response.data })
})
},
createProvider ({ commit }, data) {
return new Promise((resolve, reject) => {
providerApi.createProvider(data).then(response => {
commit(ADD_PROVIDER, { provider: response.data })
resolve(response)
}).catch(error => {
reject(error)
})
})
},
updateProvider ({ commit }, data) {
return providerApi.updateProvider(data.id, data).then(response => {
commit(UPDATE_PROVIDER, { provider: response.data })
})
},
deleteProvider ({ commit }, data) {
return providerApi.deleteProvider(data.id).then(response => {
commit(DELETE_PROVIDER, data)
})
}
}
const mutations = {
[SET_PROVIDERS] (state, { providers }) {
state.providersLoaded = true
state.providers = providers
},
[ADD_PROVIDER] (state, { provider }) {
state.providers.push(provider)
},
[UPDATE_PROVIDER] (state, { provider }) {
state.providers.forEach(function (item, pos) {
if (item.pk === provider.pk) {
Vue.set(state.providers, pos, provider)
}
})
},
[DELETE_PROVIDER] (state, data) {
state.providers = state.providers.filter(item => item.id !== data.id)
}
}
export default {
namespaced: true,
state,
getters,
actions,
mutations
}
File diff suppressed because one or more lines are too long
@@ -33,6 +33,7 @@
</template>
<script>
import { bus } from '@/main'
import accounts from '@/api/accounts'
import AccountAliases from '@/components/identities/AccountAliases'
import AccountSenderAddresses from '@/components/identities/AccountSenderAddresses'
@@ -58,6 +59,11 @@ export default {
mounted () {
accounts.get(this.$route.params.id).then(resp => {
this.account = resp.data
}).catch(error => {
if (error.response.status === 404) {
bus.$emit('notification', { msg: this.$gettext('Account not found!'), type: 'error' })
this.$router.push({ name: 'Identities' })
}
})
parameters.getApplication('limits').then(resp => {
this.limitsConfig = resp.data
@@ -0,0 +1,28 @@
<template>
<div>
<span class="text-h4"><translate>Edit provider</translate></span>
<div class="mt-4" />
<provider-form :provider="provider" />
</div>
</template>
<script>
import providers from '@/api/imap_migration/providers'
import ProviderForm from '@/components/imap_migration/ProviderForm'
export default {
components: {
ProviderForm
},
data () {
return {
provider: {}
}
},
mounted () {
providers.getProvider(this.$route.params.id).then(resp => {
this.provider = resp.data
})
}
}
</script>
@@ -0,0 +1,56 @@
<template>
<div>
<v-toolbar flat>
<v-toolbar-title><translate>Providers</translate></v-toolbar-title>
<v-spacer />
<v-btn
offset-y
color="primary"
@click="showProviderWizard = true"
>
<v-icon left>mdi-plus</v-icon>
<translate>New</translate>
</v-btn>
</v-toolbar>
<providers-list />
<v-dialog
v-model="showProviderWizard"
fullscreen
scrollable
transition="dialog-bottom-transition"
>
<provider-creation-form @close="showProviderWizard = false" />
<template v-slot:help>
<ul>
<li><em>domain; name; quota; default mailbox quota; enabled</em></li>
<li><em>domainalias; name; targeted domain; enabled</em></li>
</ul>
</template>
</v-dialog>
</div>
</template>
<script>
import ProviderCreationForm from '@/components/imap_migration/ProviderCreationForm'
import ProvidersList from '@/components/imap_migration/ProvidersList'
export default {
components: {
ProviderCreationForm,
ProvidersList
},
data () {
return {
showProviderWizard: false
}
}
}
</script>
<style scoped>
.v-toolbar {
background-color: #f7f8fa !important;
}
</style>
-3
View File
@@ -116,9 +116,6 @@ class DomainAliasSerializer(serializers.ModelSerializer):
class Meta:
model = admin_models.DomainAlias
fields = ("pk", "name", "target", "enabled", )
expandable_fields = {
"target": DomainSerializer
}
def validate_target(self, value):
"""Check target domain."""
+12
View File
@@ -252,6 +252,18 @@ class AdminGlobalParametersSerializer(serializers.Serializer):
)
return value
def validate_auto_create_domain_and_mailbox(self, value):
"""
Make sure the option does not get deactivated
while imap migration is enabled.
"""
if not value and param_tools.get_global_parameter("enabled_imapmigration",
"imap_migration"):
raise serializers.ValidationError(
_("Please disable imap migration before disabling this option.")
)
return value
def validate(self, data):
"""Check MX options."""
condition = (
File diff suppressed because it is too large Load Diff
@@ -1,68 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Breton (https://www.transifex.com/tonio/teams/13749/br/)\n"
"Language: br\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !"
"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n"
"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > "
"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 "
"&& n % 1000000 == 0) ? 3 : 4);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Domani ebet ken da ziskouez"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Na zilamit ket ar c'havlec'h domanioù"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "An oberiadenn-mañ a zilamo an HOLL roadennoù stag ouzh an domani-mañ."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"An oberiadenn-mañ a zilamo an HOLL roadennoù stag ouzh an domani-mañ, paneve "
"ar c'hontoù."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Kota ebet ken da ziskouez"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Kota ebet ken da ziskouez"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Merour domani ebet termenet"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Identelezh ebet ken da ziskouez"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Na zilamit ket kavlec'h ar voest-posteloù"
File diff suppressed because it is too large Load Diff
@@ -1,65 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Czech (Czech Republic) (https://www.transifex.com/tonio/"
"teams/13749/cs_CZ/)\n"
"Language: cs_CZ\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Žádná další doména k zobrazení"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Nemazat adresář domény"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Tento krok odstraní VŠECHNA data související s touto doménou."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Tento krok odstraní VŠECHNA data související s touto doménou, vyjma účtů."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Žádná další kvóta k zobrazení"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Žádná další kvóta k zobrazení"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Není určen správce domény"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Žádná další identita k zobrazení"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Nemazat adresář schránky"
File diff suppressed because it is too large Load Diff
@@ -1,64 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: German (https://www.transifex.com/tonio/teams/13749/de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Keine weiteren Domains"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Verzeichnis der Domain nicht löschen"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Diese Aktion wird ALLE mit der Domain verbundenen Daten löschen."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Diese Aktion wird ALLE mit der Domain verbundenen Daten, außer Mailkonten, "
"löschen."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Keine weiteren Quotas"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Keine weiteren Quotas"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Domain-Administrator fehlt"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Keine weiteren Identitäten"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Verzeichnis der Mailbox nicht löschen"
@@ -1,59 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# bdaniel93, 2023
# Boris Andratzek <BAndratzek@LBV-net.de>, 2018
# Patrice K <patricekopp2@web.de>, 2019
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2015-06-03 15:50+0000\n"
"Last-Translator: bdaniel93, 2023\n"
"Language-Team: German (Germany) (http://www.transifex.com/tonio/modoboa/language/de_DE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Keine weitere Domäne anzuzeigen"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Domänenverzeichnis nicht löschen"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Dieser Vorgang wird ALLE Daten löschen, die mit dieser Domäne verknüpft sind."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "Dieser Vorgang wird alle Daten löschen, die mit dieser Domäne verknüpft sind, bis auf Konten"
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Kein Kontingent zum anzeigen"
#: static/admin/js/admin.js:180
msgid "No more log to show"
msgstr "Kein Protokoll mehr zum Anzeigen"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Kein Domänenadministrator definiert"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Keine weitere Identität anzuzeigen"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Postfachverzeichnis nicht löschen"
File diff suppressed because it is too large Load Diff
@@ -1,67 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Greek (Greece) (https://www.transifex.com/tonio/teams/13749/"
"el_GR/)\n"
"Language: el_GR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Δεν υπάρχουν άλλα domains για εμφάνιση"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Να μην διαγραφεί ο κατάλογος αρχείων του domain "
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr ""
"Αυτή η λειτουργία θα καταργήσει ΟΛΑ τα δεδομένα που σχετίζονται με αυτό το "
"domain."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Αυτή η λειτουργία θα καταργήσει όλα τα δεδομένα που σχετίζονται με αυτό το "
"domain, εκτός από τους λογαριασμούς χρηστών."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Δεν υπάρχει κανένα quota"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Δεν υπάρχει κανένα quota"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Δεν έχει οριστεί διαχειριστής domain"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Δεν υπάρχουν άλλες ταυτότητες για εμφάνιση"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Να μην διαγραφεί ο κατάλογος αρχείων του γραμματοκιβωτίου "
File diff suppressed because it is too large Load Diff
@@ -1,56 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr ""
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr ""
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr ""
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr ""
#: static/admin/js/admin.js:180
msgid "No more log to show"
msgstr ""
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr ""
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr ""
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr ""
File diff suppressed because it is too large Load Diff
@@ -1,65 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Spanish (https://www.transifex.com/tonio/teams/13749/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? "
"1 : 2;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Sin dominios que mostrar"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "No eleminar el directorio del dominio"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Esta operación eliminará TODOS los datos asociados a este dominio."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Esta operación eliminará todos los datos asociados a este dominio, excepto "
"las cuentas."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Sin cuota para mostrar"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Sin cuota para mostrar"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "No hay un administrador de dominio definido"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Sin identidades que mostrar"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "No eliminar el directorio del mailbox"
File diff suppressed because it is too large Load Diff
@@ -1,55 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-17 16:48+0100\n"
"PO-Revision-Date: 2023-02-17 20:10+0200\n"
"Last-Translator: Ossi Mantylahti <ossiman@gmail.com>\n"
"Language-Team: \n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.2.2\n"
#: admin/static/admin/js/admin.js:129 admin/static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Ei enää verkkotunnusta näytettäväksi"
#: admin/static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Älä poista verkkotunnuksen hakemistoa"
#: admin/static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr ""
"Tämä toiminto poistaa KAIKKI tähän verkkotunnukseen liittyvät tiedot."
#: admin/static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Tämä toiminto poistaa kaikki tähän verkkotunnukseen liittyvät tiedot "
"lukuun ottamatta tilejä."
#: admin/static/admin/js/admin.js:177 admin/static/admin/js/admin.js:433
msgid "No more quota to show"
msgstr "Ei enää kiintiöitä näytettäväksi"
#: admin/static/admin/js/admin.js:306
msgid "No domain administrator defined"
msgstr "Verkkotunnuksen ylläpitäjää ei ole määritetty"
#: admin/static/admin/js/admin.js:362 admin/static/admin/js/admin.js:430
msgid "No more identity to show"
msgstr "Ei enää identiteettiä näytettäväksi"
#: admin/static/admin/js/admin.js:404
msgid "Do not delete mailbox directory"
msgstr "Älä poista postilaatikkohakemistoa"
File diff suppressed because it is too large Load Diff
@@ -1,58 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2015-06-03 15:50+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Plus de domaine à afficher"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Ne pas supprimer le répertoire du domaine"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Cette opération supprimera TOUTES les données associées à ce domaine."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "Cette opération supprimera toutes les données associées à ce domaine à l'exception des comptes."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Plus de quota à afficher"
#: static/admin/js/admin.js:180
msgid "No more log to show"
msgstr "Plus aucun journal à afficher"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Aucun administrateur de domaine défini"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Plus d'identité à afficher"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Ne pas supprimer le répertoire de la boite aux lettres"
File diff suppressed because it is too large Load Diff
@@ -1,65 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Italian (https://www.transifex.com/tonio/teams/13749/it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? "
"1 : 2;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Non ci sono altri domini da mostrare"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Non eliminare la cartella dei domini"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Questa operazione eliminerà TUTTI i dati associati a questo dominio."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Questa operazione eliminerà tutti i dati associati a questo dominio tranne "
"gli account"
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Non ci sono altre quote da mostrare"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Non ci sono altre quote da mostrare"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Non è stato definito un amministratore di dominio"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Non ci sono altre identità da mostrare"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Non eliminare la cartella della casella posta"
File diff suppressed because it is too large Load Diff
@@ -1,65 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Japanese (Japan) (https://www.transifex.com/tonio/teams/13749/"
"ja_JP/)\n"
"Language: ja_JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "表示するドメインはありません。"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "ドメインディレクトリを削除しないでください"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "この操作は、このドメインに関連するすべてのデータを削除します。"
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"この操作は、アカウントを除いたこのドメインに関連するすべてのデータを削除しま"
"す。"
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "表示するクォータはありません"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "表示するクォータはありません"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "ドメイン管理者が指定されていません"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "表示する ID はありません"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "メールボックスディレクトリを削除しないでください"
File diff suppressed because it is too large Load Diff
@@ -1,60 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Harrie v.d. Vegt <hvdvegt@gmail.com>, 2016
# J Rosier <vertalen@tagora.nl>, 2023
# TuxBrother <vrijwilligerswerk@wij.rs>, 2014
# Tuxis Internet Engineering V.O.F. <info@tuxis.nl>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2015-06-03 15:50+0000\n"
"Last-Translator: J Rosier <vertalen@tagora.nl>, 2023\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/tonio/modoboa/language/nl_NL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Geen domeinen meer om weer te geven"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "De map van dit domein niet verwijderen"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Deze actie zal ALLE data verwijderen die bij dit domein hoort."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "Deze actie zal alle data die bij dit domein hoort verwijderen, behalve de accounts."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Geen quotum meer om weer te geven"
#: static/admin/js/admin.js:180
msgid "No more log to show"
msgstr "Geen logbestand meer om weer te geven"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Geen domeinbeheerder toegewezen"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Geen identiteiten meer om weer te geven"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Verwijder de map van deze mailbox niet"
File diff suppressed because it is too large Load Diff
@@ -1,66 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Polish (Poland) (https://www.transifex.com/tonio/teams/13749/"
"pl_PL/)\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Brak domen do pokazania"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Nie usuwaj katalogu domeny"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Ta operacja usunie WSZYSTKIE dane powiązane z tą domeną."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Ta operacja usunie wszystkie dane powiązana z tą domeną za wyjątkiem kont."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Brak limitów do wyświetlenia"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Brak limitów do wyświetlenia"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Nie zdefiniowano administratora domeny"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Brak tożsamości do wyświetlenia"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Nie usuwaj katalogu skrzynki pocztowej"
File diff suppressed because it is too large Load Diff
@@ -1,66 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/tonio/"
"teams/13749/pt_BR/)\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
"1000000 == 0 ? 1 : 2;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Nenhum domínio a mais para mostrar"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Não remova o diretório de domínio"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Esta operação removerá TODOS os dados associados com este domínio."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Esta operação removerá todos os dados associados com este domínio, exceto "
"contas."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Nenhuma quota a mais para mostrar"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Nenhuma quota a mais para mostrar"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Nenhum administrador de domínio definido"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Nenhuma identidade a mais para mostrar"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Não remova o diretório de caixas de mensagens"
File diff suppressed because it is too large Load Diff
@@ -1,66 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Portuguese (Portugal) (https://www.transifex.com/tonio/"
"teams/13749/pt_PT/)\n"
"Language: pt_PT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
"1000000 == 0 ? 1 : 2;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Não existem mais dominios para mostrar"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Não excluir o diretório do domínio"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Esta operação irá remover TODOS os dados associados a este domínio."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Esta operação irá remover TODOS os dados associados a este domínio, excepto "
"as contas."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Não existem mais quotas para mostrar"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Não existem mais quotas para mostrar"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Não está definido nenhum administrador para o domínio"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Não existem mais identidades para mostrar"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Não excluir o diretório da caixa de correio"
File diff suppressed because it is too large Load Diff
@@ -1,67 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Romanian (Romania) (https://www.transifex.com/tonio/"
"teams/13749/ro_RO/)\n"
"Language: ro_RO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Nu mai sunt domenii de afișat"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Nu sterge directorul pentru domeniu"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr ""
"Această operațiune va șterge toată informația asociată cu acest domeniu."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr ""
"Această operațiune va șterge toată informația asociată cu acest domeniu, cu "
"excepția conturilor."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Nu mai există cote de afișat"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Nu mai există cote de afișat"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Nu există configurat un administartor de domeniu"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Nu mai sunt identități de afișat"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Nu sterge directorul mailbox"
File diff suppressed because it is too large Load Diff
@@ -1,59 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# guard43ru <guard43ru@gmail.com>, 2023
# Ravil Kadyrbayev, 2015
# Yuriy Matskanyuk <umackanuk@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2015-06-03 15:50+0000\n"
"Last-Translator: guard43ru <guard43ru@gmail.com>, 2023\n"
"Language-Team: Russian (http://www.transifex.com/tonio/modoboa/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Нет больше доменов для показа"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Не удаляйте каталог домена"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Эта операция удалит ВСЕ данные, связанные с этим доменом."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "Эта операция удалит ВСЕ данные, связанные с этим доменом, за исключением аккаунтов."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Нет больше квоты для показа"
#: static/admin/js/admin.js:180
msgid "No more log to show"
msgstr "Нет больше логов для отображения"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Не указан администратор домена"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Нет личности для показа"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Не удаляйте каталог почтовых ящиков"
File diff suppressed because it is too large Load Diff
@@ -1,58 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Joaquim Homrighausen <joho@boojam.se>, 2023
# Olle Gustafsson <olle@dalnix.se>, 2013,2015
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2015-06-03 15:50+0000\n"
"Last-Translator: Joaquim Homrighausen <joho@boojam.se>, 2023\n"
"Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Inga fler domäner att visa"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Radera inte domän katalog"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Denna åtgärd kommer radera ALL data associerad med den här domänen."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "Den här operationen raderar all data som är associerad med denna domän, förutom konton."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Ingen mer kvota att visa"
#: static/admin/js/admin.js:180
msgid "No more log to show"
msgstr "Inga fler logghändelser finns att visa"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "Ingen domänadministratör definierad"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Inga fler konton att visa"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Radera inte brevlådans katalog"
File diff suppressed because it is too large Load Diff
@@ -1,63 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Turkish (Turkey) (https://www.transifex.com/tonio/teams/13749/"
"tr_TR/)\n"
"Language: tr_TR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "Gösterilecek başka domain yok"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "Domain dizini silmeyin"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "Bu işlem, bu domain ilişkili TÜM verileri kaldıracaktır."
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "Bu işlem hesap dışında bu domain ilişkili tüm verileri kaldıracaktır."
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "Gösterilecek kota yok"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "Gösterilecek kota yok"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "domain yöneticisi tanımlanmadı"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "Gösterilecek daha fazla kimlik yok"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "Posta kutusu dizini silmeyin"
File diff suppressed because it is too large Load Diff
@@ -1,63 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-22 18:52+0100\n"
"PO-Revision-Date: 2023-02-22 16:16+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>, 2023\n"
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/tonio/teams/13749/"
"zh_TW/)\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: static/admin/js/admin.js:129 static/admin/js/admin.js:174
msgid "No more domain to show"
msgstr "無更多網域可展示"
#: static/admin/js/admin.js:149
msgid "Do not delete domain directory"
msgstr "不可以刪除網域目錄"
#: static/admin/js/admin.js:151
msgid "This operation will remove ALL data associated to this domain."
msgstr "這個操作將會刪除所有這個網域有關的資料。"
#: static/admin/js/admin.js:152
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "這個操作將會刪除所有這個網域有關的資料,除了帳號。"
#: static/admin/js/admin.js:177 static/admin/js/admin.js:436
msgid "No more quota to show"
msgstr "沒有配額可能顯示"
#: static/admin/js/admin.js:180
#, fuzzy
#| msgid "No more quota to show"
msgid "No more log to show"
msgstr "沒有配額可能顯示"
#: static/admin/js/admin.js:309
msgid "No domain administrator defined"
msgstr "網域管理員未指定"
#: static/admin/js/admin.js:365 static/admin/js/admin.js:433
msgid "No more identity to show"
msgstr "沒有身份可以顯示"
#: static/admin/js/admin.js:407
msgid "Do not delete mailbox directory"
msgstr "不可能刪除郵件目錄"
@@ -69,6 +69,7 @@ INSTALLED_APPS = (
'django_otp',
'django_otp.plugins.otp_totp',
'django_otp.plugins.otp_static',
'django_rename_app',
{% if devmode %} 'djangobower',{% endif %}
)
@@ -89,6 +90,7 @@ MODOBOA_APPS = (
'modoboa.maillog',
'modoboa.pdfcredentials',
'modoboa.dmarc',
'modoboa.imap_migration',
# Modoboa extensions here.
{% for extension in extensions %} '{{ extension }}',
{% endfor %}
@@ -119,6 +121,7 @@ AUTHENTICATION_BACKENDS = (
#'modoboa.lib.authbackends.LDAPBackend',
#'modoboa.lib.authbackends.SMTPBackend',
'django.contrib.auth.backends.ModelBackend',
'modoboa.imap_migration.auth_backends.IMAPBackend',
)
# SMTP authentication
+3
View File
@@ -109,6 +109,9 @@ SETTINGS_SAMPLE = {
"pdfcredentials-imap_server_port": 667,
"pdfcredentials-imap_connection_security": "starttls",
"dmarc-enable_rlookups": False,
"imap_migration-enabled_imapmigration": True,
"imap_migration-max_sync_accounts": 2,
"imap_migration-create_folders": True,
}
+2 -1
View File
@@ -70,5 +70,6 @@ def load_settings():
param_tools.registry.add2(
"global", "dmarc", _("DMARC"),
GLOBAL_PARAMETERS_STRUCT,
serializers.DmarcGlobalParametersSerializer
serializers.DmarcGlobalParametersSerializer,
True
)
@@ -1,138 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Irriep Nala Novram <allannkorh@yahoo.fr>, 2019
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2020-05-06 12:07+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Breton (http://www.transifex.com/tonio/modoboa/language/br/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: br\n"
"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);\n"
#: forms.py:35
msgid "DNS settings"
msgstr "Arventennoù DNS"
#: forms.py:38
msgid "Enable reverse lookups"
msgstr "Enaouiñ an enklaskoù eilpennet"
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr "Enaouiñ an enklaskoù DNS eilpennet (danevelloù a vo hiroc'h da vezañ diskouezet)"
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Diskouez an danevell DMARC evit {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Hini ebet"
#: models.py:11
msgid "Quarantine"
msgstr "Dispell"
#: models.py:12
msgid "Reject"
msgstr "Nac'hañ"
#: models.py:17
msgid "Neutral"
msgstr "Neptu"
#: models.py:18
msgid "Pass"
msgstr "Tremen"
#: models.py:19
msgid "Fail"
msgstr "Sac'hadenn"
#: models.py:20
msgid "Temporary error"
msgstr "Fazi padennek"
#: models.py:21
msgid "Permanent error"
msgstr "Fazi peurbadus"
#: models.py:25
msgid "Policy"
msgstr "Politikerezh"
#: models.py:29
msgid "Soft failure"
msgstr "Sac'hadenn wan"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "Ostilhoù DMARC"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Un dastumad ostilhoù da aesaat enframmañ DMARC"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Hollad"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Linennet penn-da-benn"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Linennet dre an hanter"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "C'hwitet"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "Danevell DMARC evit"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "tretet"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "linennet penn-da-benn"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "linennet dre an hanter"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "c'hwitet"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Diskouez ar munudoù"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Mammennoù fizius"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Mammennoù dizanv/Gourdrouzioù"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,139 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Jan Laufik, 2016
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-03-03 08:18+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/tonio/"
"modoboa/language/cs_CZ/)\n"
"Language: cs_CZ\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Zobrazit DMARC zprávu pro {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Nic"
#: models.py:11
msgid "Quarantine"
msgstr "Karanténa"
#: models.py:12
msgid "Reject"
msgstr "Odmítnout"
#: models.py:17
msgid "Neutral"
msgstr "Neutrální"
#: models.py:18
msgid "Pass"
msgstr "Úspěch"
#: models.py:19
msgid "Fail"
msgstr "Selhání"
#: models.py:20
msgid "Temporary error"
msgstr "Dočasná chyba"
#: models.py:21
msgid "Permanent error"
msgstr "Permanentní chyba"
#: models.py:25
msgid "Policy"
msgstr "Politika"
#: models.py:29
msgid "Soft failure"
msgstr "Selhání bez odmítnutí"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "DMARC nástroje"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Sada nástrojů pro zjednodušení integrace DMARC"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Celkem"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Plně v souladu"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Částečně v souladu"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Selhalo"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "DMARC zpráva pro"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "zpracované"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "plně v souladu"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "částečně v souladu"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "selhalo"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Zobrazit podrobnosti"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Důvěryhodné zdroje"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Neznáme zdroje / Hrozby"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,139 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# controlc.de, 2015
# Tobias Strobel, 2016
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-03-03 08:18+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "DMARC-Bericht für {} anzeigen"
#: models.py:10 models.py:16
msgid "None"
msgstr "Nichts"
#: models.py:11
msgid "Quarantine"
msgstr "Quarantäne"
#: models.py:12
msgid "Reject"
msgstr "Ablehnung"
#: models.py:17
msgid "Neutral"
msgstr "Neutral"
#: models.py:18
msgid "Pass"
msgstr "Genehmigen"
#: models.py:19
msgid "Fail"
msgstr "Abbruch"
#: models.py:20
msgid "Temporary error"
msgstr "Temporärer Fehler"
#: models.py:21
msgid "Permanent error"
msgstr "Permanenter Fehler"
#: models.py:25
msgid "Policy"
msgstr "Richtlinie"
#: models.py:29
msgid "Soft failure"
msgstr "Schwacher Fehler"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "DMARC-Tools"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Ein Set von Tools um die DMARC-Integration zu vereinfachen"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Total"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Voll zugeordnet"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Teilweise zugeordnet"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Fehlgeschlagen"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "DMARC-Bericht für"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "durchgeführt"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "voll zugeordnet"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "teilweise zugeordnet"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "fehlgeschlagen"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Anzeigedetails"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Vertraute Quellen"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Unbekannte Quellen / Bedrohungen"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,140 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Giannis Kapetanakis <bilias@edu.physics.uoc.gr>, 2016
# Kostas Moumouris <moumouriskostas@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-10-12 09:55+0000\n"
"Last-Translator: Kostas Moumouris <moumouriskostas@gmail.com>\n"
"Language-Team: Greek (Greece) (http://www.transifex.com/tonio/modoboa/"
"language/el_GR/)\n"
"Language: el_GR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:35
msgid "DNS settings"
msgstr "Ρυθμίσεις DNS"
#: forms.py:38
msgid "Enable reverse lookups"
msgstr "Ενεργοποίηση ανάστροφης αναζήτησης reverse lookups"
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr "Ενεργοποίηση reverse DNS lookups (η αναφορές θα καθυστερούν)"
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Εμφάνιση της έκθεσης DMARC του {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Κανένα"
#: models.py:11
msgid "Quarantine"
msgstr "Καραντίνα"
#: models.py:12
msgid "Reject"
msgstr "Απόρριψη"
#: models.py:17
msgid "Neutral"
msgstr "Ουδέτερο"
#: models.py:18
msgid "Pass"
msgstr "Εγκρίθηκε"
#: models.py:19
msgid "Fail"
msgstr "Απορρίφθηκε"
#: models.py:20
msgid "Temporary error"
msgstr "προσωρινό σφάλμα"
#: models.py:21
msgid "Permanent error"
msgstr "Μόνιμο σφάλμα"
#: models.py:25
msgid "Policy"
msgstr "Πολιτική"
#: models.py:29
msgid "Soft failure"
msgstr "Πρόβλημα Soft"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "Εργαλεία DMARC"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Ένα σετ εργαλείων για την απλοποίηση της ενσωμάτωσης του DMARC"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Σύνολο"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Πλήρως ευθυγραμμισμένο"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Μερικός ευθυγραμισμένα"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Απέτυχε"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "Έκθεση DMARC του"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "Επεξεργάστηκε"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "πλήρως ευθυγραμμισμένο"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "Μερικώς ευθυγραμμισμένο"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "απέτυχε"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Προβολή λεπτομερειών"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Αξιόπιστες πηγές"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Άγνωστες πηγές / Απειλές"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,137 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr ""
#: models.py:10 models.py:16
msgid "None"
msgstr ""
#: models.py:11
msgid "Quarantine"
msgstr ""
#: models.py:12
msgid "Reject"
msgstr ""
#: models.py:17
msgid "Neutral"
msgstr ""
#: models.py:18
msgid "Pass"
msgstr ""
#: models.py:19
msgid "Fail"
msgstr ""
#: models.py:20
msgid "Temporary error"
msgstr ""
#: models.py:21
msgid "Permanent error"
msgstr ""
#: models.py:25
msgid "Policy"
msgstr ""
#: models.py:29
msgid "Soft failure"
msgstr ""
#: modo_extension.py:16
msgid "DMARC tools"
msgstr ""
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr ""
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr ""
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr ""
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,138 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Antoine Nguyen <tonio@ngyn.org>, 2017,2020
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2020-05-06 12:07+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: forms.py:35
msgid "DNS settings"
msgstr "Paramètres DNS"
#: forms.py:38
msgid "Enable reverse lookups"
msgstr "Activer les recherches inversées"
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr "Activer les recherches DNS inversées (les rapports seront plus longs à afficher)"
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Afficher le rapport DMARC pour {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Aucun"
#: models.py:11
msgid "Quarantine"
msgstr "Quarantaine"
#: models.py:12
msgid "Reject"
msgstr "Rejeter"
#: models.py:17
msgid "Neutral"
msgstr "Neutre"
#: models.py:18
msgid "Pass"
msgstr "Succès"
#: models.py:19
msgid "Fail"
msgstr "Echec"
#: models.py:20
msgid "Temporary error"
msgstr "Erreur temporaire"
#: models.py:21
msgid "Permanent error"
msgstr "Erreur permanente"
#: models.py:25
msgid "Policy"
msgstr "Politique"
#: models.py:29
msgid "Soft failure"
msgstr "Erreur soft"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "Outils DMARC"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Un jeu d'outils pour faciliter l'intégration de DMARC"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Total"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Alignement complet"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Alignement partiel"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "En échec"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "Rapport DMARC pour"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "traité(s)"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "complètement aligné(s)"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "partiellement aligné(s)"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "en échec"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Afficher les détails"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Sources de confiance"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Sources inconnues / Menaces"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr "Non résolu"
@@ -1,139 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Rocco <mors10@hotmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-03-03 08:18+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/"
"it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Mostra DMARC report per {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Nessuno"
#: models.py:11
msgid "Quarantine"
msgstr "Quarantina"
#: models.py:12
msgid "Reject"
msgstr "Rifiuta"
#: models.py:17
msgid "Neutral"
msgstr "Neutrale"
#: models.py:18
msgid "Pass"
msgstr "Passa"
#: models.py:19
msgid "Fail"
msgstr "Fallito"
#: models.py:20
msgid "Temporary error"
msgstr "Errore temporaneo"
#: models.py:21
msgid "Permanent error"
msgstr "Errore permanente"
#: models.py:25
msgid "Policy"
msgstr "Policy"
#: models.py:29
msgid "Soft failure"
msgstr "Piccolo problema"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "Strumenti DMARC"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Una serie di strumenti per facilitare l'integrazione DMARC"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Totale"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Completamente allineato"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Parzialmente allineato"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Fallito"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "Rapporto DMARC per"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "Processati"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "Completamente allineato"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "Allineato parzialmente"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "Fallito"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Mostra dettagli"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Fonti attendibili"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Fonti sconosciute / Minaccie"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,139 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# cwatanab <chihiro.watanabe@live.jp>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-03-03 08:18+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/"
"language/ja_JP/)\n"
"Language: ja_JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "{} の DMARC レポートを表示"
#: models.py:10 models.py:16
msgid "None"
msgstr "None"
#: models.py:11
msgid "Quarantine"
msgstr "Quarantine"
#: models.py:12
msgid "Reject"
msgstr "Reject"
#: models.py:17
msgid "Neutral"
msgstr "Neutral"
#: models.py:18
msgid "Pass"
msgstr "Pass"
#: models.py:19
msgid "Fail"
msgstr "Fail"
#: models.py:20
msgid "Temporary error"
msgstr "Temporary error"
#: models.py:21
msgid "Permanent error"
msgstr "Permanent error"
#: models.py:25
msgid "Policy"
msgstr "Policy"
#: models.py:29
msgid "Soft failure"
msgstr "Soft failure"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "DMARC ツール"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "DMARC 統合のためのツールセット"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Total"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Fully aligned"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Partially aligned"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Failed"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "DMARC レポート"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "processed"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "fully aligned"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "partially aligned"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "failed"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "詳細を表示"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Trusted sources"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Unknown sources / Threats"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,141 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Harrie v.d. Vegt <hvdvegt@gmail.com>, 2016
# Tuxis Internet Engineering V.O.F. <info@tuxis.nl>, 2016
# Tuxis Internet Engineering V.O.F. <info@tuxis.nl>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-03-03 08:18+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/tonio/modoboa/"
"language/nl_NL/)\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Toon DMARC rapportage voor {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Geen"
#: models.py:11
msgid "Quarantine"
msgstr "Quarantaine"
#: models.py:12
msgid "Reject"
msgstr "Afkeuren"
#: models.py:17
msgid "Neutral"
msgstr "Neutraal"
#: models.py:18
msgid "Pass"
msgstr "Gelukt"
#: models.py:19
msgid "Fail"
msgstr "Mislukt"
#: models.py:20
msgid "Temporary error"
msgstr "Tijdelijke fout"
#: models.py:21
msgid "Permanent error"
msgstr "Permanente fout"
#: models.py:25
msgid "Policy"
msgstr "Beleid"
#: models.py:29
msgid "Soft failure"
msgstr "Toegestane fout"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "DMARC gereedschappen"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Een aantal eenvoudige programmas DMARC"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Totaal"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Volledig alligned"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Gedeeltelijk alligned"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Mislukt"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "DMARC rapportage voor"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "verwerkt"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "volledig alligned"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "gedeeltelijk alligned"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "mislukt"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Toon details"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Vertrouwde bronnen"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Onbekende bronnen / bedreigingen"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,139 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Paulino Michelazzo <paulino@michelazzo.com.br>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-03-03 08:18+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/"
"language/pt_BR/)\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Mostrar relatório DMARC para {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Nenhum"
#: models.py:11
msgid "Quarantine"
msgstr "Quarentena"
#: models.py:12
msgid "Reject"
msgstr "Rejeitado"
#: models.py:17
msgid "Neutral"
msgstr "Neutro"
#: models.py:18
msgid "Pass"
msgstr "Passou"
#: models.py:19
msgid "Fail"
msgstr "Falha"
#: models.py:20
msgid "Temporary error"
msgstr "Erro temporário"
#: models.py:21
msgid "Permanent error"
msgstr "Erro permanente"
#: models.py:25
msgid "Policy"
msgstr "Política"
#: models.py:29
msgid "Soft failure"
msgstr "Falha leve"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "Ferramentas DMARC"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "Um conjunto de ferramentas para fácil integração do DMARC"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Total"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Completamente alinhado"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Parcialmente alinhado"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Falha"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "Relatório DMARC para"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "processado"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "completamente alinhado"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "parcialmente alinhado"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "falho"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Mostrar detalhes"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Fontes confiáveis"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Fontes desconhecidas / Ameaças"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -1,139 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Olle Gustafsson <olle@dalnix.se>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-06 14:05+0200\n"
"PO-Revision-Date: 2017-03-03 08:18+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/"
"sv/)\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:35
msgid "DNS settings"
msgstr ""
#: forms.py:38
msgid "Enable reverse lookups"
msgstr ""
#: forms.py:41
msgid "Enable reverse DNS lookups (reports will be longer to display)"
msgstr ""
#: handlers.py:20
msgid "Show DMARC report for {}"
msgstr "Visa DMARC rapport för {}"
#: models.py:10 models.py:16
msgid "None"
msgstr "Inga"
#: models.py:11
msgid "Quarantine"
msgstr "Karantän"
#: models.py:12
msgid "Reject"
msgstr "Avvisa"
#: models.py:17
msgid "Neutral"
msgstr "Netural"
#: models.py:18
msgid "Pass"
msgstr "Passera"
#: models.py:19
msgid "Fail"
msgstr "Avslå"
#: models.py:20
msgid "Temporary error"
msgstr "Tillfälligt fel"
#: models.py:21
msgid "Permanent error"
msgstr "Permanent fel"
#: models.py:25
msgid "Policy"
msgstr "Policy"
#: models.py:29
msgid "Soft failure"
msgstr "Mjukt misslyckande"
#: modo_extension.py:16
msgid "DMARC tools"
msgstr "DMARC verktyg"
#: modo_extension.py:19
msgid "A set of tools to ease DMARC integration"
msgstr "En uppsättning verktyg för att underlätta DMARC integration"
#: templates/modoboa_dmarc/_result_detail.html:6
msgid "Total"
msgstr "Totalt"
#: templates/modoboa_dmarc/domain_report.html:21
#: templates/modoboa_dmarc/domain_report.html:26
msgid "Fully aligned"
msgstr "Helt i linje"
#: templates/modoboa_dmarc/domain_report.html:22
#: templates/modoboa_dmarc/domain_report.html:27
msgid "Partially aligned"
msgstr "Delvis i linje"
#: templates/modoboa_dmarc/domain_report.html:23
#: templates/modoboa_dmarc/domain_report.html:28
msgid "Failed"
msgstr "Misslyckades"
#: templates/modoboa_dmarc/domain_report.html:50
msgid "DMARC report for"
msgstr "DMARC rapport för"
#: templates/modoboa_dmarc/domain_report.html:74
msgid "processed"
msgstr "bearbetats"
#: templates/modoboa_dmarc/domain_report.html:83
msgid "fully aligned"
msgstr "helt i linje"
#: templates/modoboa_dmarc/domain_report.html:92
msgid "partially aligned"
msgstr "delvis i linje"
#: templates/modoboa_dmarc/domain_report.html:101
msgid "failed"
msgstr "misslyckades"
#: templates/modoboa_dmarc/domain_report.html:111
msgid "Display details"
msgstr "Visa detaljer"
#: templates/modoboa_dmarc/domain_report.html:115
msgid "Trusted sources"
msgstr "Betrodda källor"
#: templates/modoboa_dmarc/domain_report.html:123
msgid "Unknown sources / Threats"
msgstr "Okända källor / Hot"
#: templatetags/dmarc_tags.py:59 views.py:120
msgid "Not resolved"
msgstr ""
@@ -0,0 +1,33 @@
# Generated by Django 3.2.17 on 2023-04-18 12:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dmarc', '0004_auto_20220926_0913'),
]
operations = [
migrations.AlterField(
model_name='record',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='report',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='reporter',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='result',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]

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