Translate views

This commit is contained in:
Frédéric Grither 2020-09-16 15:23:25 +02:00 committed by Pierre-Olivier Mercier
parent 3235641dbe
commit 443a2f6b02
29 changed files with 359 additions and 202 deletions

View File

@ -45,7 +45,7 @@
<template v-slot:append>
<b-input-group-append v-show="value.length">
<b-button type="submit" variant="outline-primary">
{{ $t('domains.add-new') }}
{{ $t('common.add-new-thing', { thing: $t('domains.kind') }) }}
</b-button>
</b-input-group-append>
</template>

View File

@ -39,7 +39,7 @@
<div v-if="state < 0">
<p>
{{ $t('domains.select-provider') }}
{{ $t('source.select-provider') }}
</p>
<h-new-source-selector v-model="sourceSpecsSelected" />
</div>

View File

@ -47,7 +47,7 @@
<b-button v-if="editKeys[key]" type="button" size="sm" variant="primary" @click="rename(key)">
<b-icon icon="check" />
<span v-if="key">{{ $t('common.rename') }}</span>
<span v-else>{{ $t('domains.create-new-key', { id: 'specs.id' }) }}</span>
<span v-else>{{ $t('domains.create-new-key', { id: specs.id }) }}</span>
</b-button>
</template>
</b-input-group>
@ -89,7 +89,7 @@
<hr>
</div>
<b-button @click="createKey()">
{{ $t('common.add-new-thing', { thing: 'specs.id' }) }}
{{ $t('common.add-new-thing', { thing: specs.id }) }}
</b-button>
</div>
</template>

View File

@ -56,13 +56,13 @@
@saveService="$emit('saveService', function () { serviceEdit=false; if ($event) { $event() } })"
/>
<b-button v-else :disable="value['']" @click="createObject(spec)">
{{ $t('common.create-thing', { thing: 'spec.id' }) }}
{{ $t('common.create-thing', { thing: spec.id }) }}
</b-button>
</b-tab>
</b-tabs>
<div v-else-if="!value">
<b-button @click="createObject(spec)">
{{ $t('common.create-thing', { thing: 'spec.id' }) }}
{{ $t('common.create-thing', { thing: spec.id }) }}
</b-button>
</div>
<div v-else>

View File

@ -39,8 +39,8 @@
</h4>
<b-table hover striped :fields="fieldsNames" :items="tmp_values" sort-icon-left>
<template v-slot:head(_actions)>
<b-button size="sm" title="Add item" variant="outline-secondary" class="mx-1" @click="addRow()">
<b-icon icon="plus" /> Add
<b-button size="sm" :title="$t('common.add-new-thing', {thing: 'item'})" variant="outline-secondary" class="mx-1" @click="addRow()">
<b-icon icon="plus" /> {{ $t('common.add') }}
</b-button>
</template>
<template v-slot:cell()="row">

View File

@ -45,7 +45,7 @@
id="src-name"
edit
:index="0"
label="Name your source"
:label="$t('domains.name-your-source')"
:description="$t('domains.give-explicit-name')"
:placeholder="sourceName + ' account 1'"
required

View File

@ -48,7 +48,7 @@
</span>
<b-button type="button" variant="primary" size="sm" class="ml-2" @click="$emit('addNewService', dn)">
<b-icon icon="plus" />
{{ $t('domains.add-service') }}
{{ $t('service.add') }}
</b-button>
<b-button type="button" variant="outline-info" size="sm" class="ml-2" @click="$emit('showServiceWindow', zoneServices[0])">
<b-icon icon="pencil" />
@ -67,10 +67,10 @@
<a :href="'#' + dn" class="float-right" style="text-indent:0;z-index:2;position:relative">
<b-icon icon="link45deg" />
</a>
<span class="text-monospace" @click="toogleShowResources()" :title="dn | fqdn(origin)">{{ dn | fqdn(origin) }}</span>
<span class="text-monospace" :title="dn | fqdn(origin)" @click="toogleShowResources()">{{ dn | fqdn(origin) }}</span>
</span>
<b-badge v-if="aliases.length > 0" v-b-popover.hover.focus="{ customClass: 'text-monospace', html: true, content: aliasPopoverCnt(dn) }" class="ml-2" style="text-indent:0;">
+ {{ pluralizeAlias(aliases.length) }}
+ {{ $tc('domains.n-aliases', aliases.length) }}
</b-badge>
<b-button type="button" variant="primary" size="sm" class="ml-2" @click="$emit('addNewService', dn)">
<b-icon icon="plus" />
@ -174,14 +174,6 @@ export default {
}
)
})
},
pluralizeAlias (count) {
if (count === 1) {
return '1 alias'
} else {
return count + ' aliases'
}
}
}
}

View File

@ -44,7 +44,7 @@
{{ $t('common.cancel') }}
</b-button>
<b-button v-if="modal.step === 2" form="addSvcForm" type="submit" variant="primary">
{{ $t('domains.add-service') }}
{{ $t('service.add') }}
</b-button>
<b-button v-else form="addSvcForm" type="submit" variant="primary">
{{ $t('common.continue') }}

View File

@ -1,30 +1,73 @@
{
"account":{
"ask-have": "Don't already have an account on our beautiful platform?",
"delete": {
"delete": "Delete my account",
"deleted": "Account Deleted",
"confirm": "If you want to delete your account and all data associated with it, press the button below:",
"confirm-twice": "By confirming the deletion, you will permanently and irrevocably delete your account from our database and will loose your access to our easy management interface for your domains.",
"confirm-password": "To ensure this is really you, please enter your password:",
"consequence": "Your domains owned on others platforms will not be affected by the deletion, they'll continue to respond with the current dataset.",
"remain-data": "For technical reason, your account will be deleted right after your validation, but some data from your account will persist until the next database clean up.",
"success": "Your account have been successfully deleted. We hope to see you back soon."
},
"join": "Join now!",
"ready-login": "Ready to login!",
"signup": {
"already": "Already member?",
"join-call": "Join our nice platform in less than 2 minutes!",
"address-why": "You'll use your address to {identify} yourself on the platform, and it could be used to contact you for {security-operations}.",
"identify": "identify",
"security-operations": "security related operations",
"receive-update": "Keep me informed of future big improvements",
"signup": "Sign up!",
"success": "Registration successfully performed!"
},
"see-again": "Happy to see you again!"
},
"common": {
"add": "Add",
"add-new-thing": "Add new {thing}",
"appname": "happyDNS",
"cancel": "Cancel",
"cancel-edit": "@:common.cancel edit",
"continue": "Continue",
"create-thing": "Create {thing}",
"delete": "Delete",
"description": "spec.description",
"domain": "Domain or subdomain",
"edit": "Edit",
"no": "No",
"field": "Field",
"go": "Go!",
"name": "Name",
"password": "Password",
"rename": "Rename",
"yes": "Yes"
"resolver": "Resolver",
"run": "Run the request!",
"spinning": "Spinning",
"type": "spec.type",
"welcome": "Welcome to {0}!"
},
"domains": {
"kind": "domain",
"actions": {
"reimport": "Re-import",
"view": "View",
"propagate": "Propagate",
"rollback": "Rollback"
},
"alert": {
"remove": "This action will permanently remove the domain {domain} from your managed domains. All history and abstracted zones will be discarded. This action will not delete or unregister your domain from your provider, nor alterate what is currently served. It will only affect what you see in happyDNS. Are you sure you want to continue?",
"unable-retrieve": {
"description": "Unfortunately, we were unable to retrieve information for the domain {domain}:",
"title": "Unable to retrieve domain information"
}
},
"add-a-subdomain": "Add a subdomain",
"add-a-service": "Add a service",
"add-alias": "Add alias",
"add-an-alias": "Add an alias",
"add-new": "Add new domain",
"add-service": "Add service",
"add-now": "Add it now!",
"added-success": "Great! {domain} has been added. You can manage it right now.",
"apply": {
"additions": "no additions | {count} addition | {count} additions",
"button": "Apply modifications",
@ -35,17 +78,32 @@
},
"nochange": "There is no changes to apply! Current zone is in sync with the server."
},
"attached-new": "New domain attached to happyDNS!",
"create-new-key": "Create new {id} key",
"delete-source": "Delete this source",
"discard": "Discard",
"drop-alias": "Drop alias",
"edit-target": "@:common.edit target",
"find-source": "Can't find the source here?",
"give-explicit-name": "Give an explicit name in order to easily find this service.",
"history": "History",
"list": "List importable domains",
"n-aliases": "{n} alias | {n} aliases",
"name-your-source": "Name your source",
"please-fill-fields": "Please fill the following fields:",
"removal": "Confirm Domain Removal",
"source": "Domains living on {0}",
"save-modifications": "Save those modifications",
"select-provider": "First, you need to select the provider hosting your domain:",
"stop": "Stop managing this domain",
"view": {
"title": "View zone",
"description": "Review the modifications that will be applied to {0}"
"abstract": "Abstract zone",
"cancel-title": "Keep my domain in happyDNS",
"description": "Review the modifications that will be applied to {0}",
"live": "Live records",
"monitoring": "Monitoring",
"summary": "Summary",
"source": "Domain source",
"title": "View zone"
},
"views": {
"grid": {
@ -53,22 +111,50 @@
},
"list": {
"title": "List view (fastest)"
}
},
"wait": {
"exporting": "Please wait while we export your zone&nbsp;&hellip;",
"formating": "Please wait while we format your zone&nbsp;&hellip;",
"importing": "Please wait while we are importing your domain&nbsp;&hellip;"
},
"source-parameters": "Source parameters"
}
},
"email":{
"address": "Email address",
"instruction":{
"check-inbox": "Please check your inbox in order to validate your e-mail address.",
"new-confirmation": "If you need a new confirmation e-mail, just enter your address in the form below.",
"validate-address": "In order to validate your e-mail address, please check your inbox, and follow the link contained in the message.",
"validated": "Your new e-mail address is now validated!"
},
"send-again": "Re-send the confirmation e-mail",
"send-recover": "Send me an e-mail to recover my account",
"sent": "Confirmation e-mail sent!",
"sent-recovery": "Password recovery email send!",
"recover": "In order to recover your account, we'll send you an e-mail containing a link that will allow you to redefine your password"
},
"errors": {
"occurs": "An error occurs when {when}!",
"404": {
"title": "Page not found",
"content": "The page you are look for was not found."
},
"account-delete": "An error occurs when trying to delete your account",
"address": "Email address is required",
"address-valid": "A valid email address is required",
"domain-access": "An error occurs when trying to access domain's list.",
"domain-attach": "An error occurs when attaching the domain to happyDNS",
"domain-have": "It appears you don't have any domain name registered on this provider.",
"domain-list": "This provider doesn't permit to list existing domains. Use the form below to add one.",
"error": "Error",
"login": "Login error",
"logout": "Logout error",
"occurs": "An error occurs when {when}!",
"password": "Password is required",
"password-change": "Unable to change your password account",
"password-match": "Password and its confirmation doesn't match.",
"password-weak": "Password needs to be stronger: at least 8 digits with numbers, low case and high case characters.",
"recovery": "Password recovery problem",
"resolve": "An error occurs when trying to resolve the domain.",
"registration": "Registration problem",
"rr-add": "An error occurs when trying to add RR to the zone:",
"rr-delete": "An error occurs when trying to delete RR in the zone:",
"source-delete": "Something went wrong during source deletion",
"session": {
"title": "Authentication timeout",
"content": "Invalid session, your have been logged out: {err}. Please login again."
@ -78,17 +164,79 @@
"my-domains": "My domains",
"my-sources": "My sources",
"dns-client": "DNS client",
"dns-resolver": "DNS resolver",
"my-account": "My account",
"logout": "Logout",
"signup": "Sign up",
"signin": "Sign in"
},
"onboarding": {
"add-one": "add a new one",
"choose-configured": "choose between already configured providers or {0}:",
"suggest-source": "choose your provider:",
"use": "Use {happyDNS} as a remplacement interface to your usual domain name provider. It'll still rely on your provider's infrastructure, you'll just take benefit from our simple interface. As a first step, {first-step}",
"no-sale": {
"title": "I don't own any domain",
"description": "{0} does not sell domain yet. To start using our interface, you need to buy a domain from one of our supported provider",
"buy-advice": "We'll provide some guidance in a near future on how to easily buy a domain name. So stay tune and get in touch with us if you'll help us to build a comprehensive guide."
},
"own": "I already own a domain",
"questions": {
"hosting": {
"q": "I don't want to rely on my domain name hosting provider anymore. Can I host my domain name on your infrastructure",
"a": "We'll provide such feature in a near future, as it's on our manifest. We choose to focus first on spreading the word that domain names are accessibles to everyone through this sweet interface, before targeting privacy, censorship, …"
},
"secondary": {
"q": "I've my own infrastructure, can I use {0} as secondary authoritative server?",
"a": "We'll provide such feature in a near future, as soon as our name server infrastructure is on."
}
}
},
"password":{
"change": "Change my password",
"changed": "Password Successfully Changed",
"confirm-new": "Confirm your new password",
"confirmation": "Password confirmation",
"enter": "Enter your current password",
"enter-new": "Enter your new password",
"fill": "In order to recover your account, please fill the following form, with a fresh password.",
"forgotten": "Forgotten password?",
"new": "New password",
"redefine": "Redefine my password",
"redefined": "Password redefined successfully!",
"success": "You can now login with your new password.",
"success-change": "Your account's password has been changed with success."
},
"service": {
"add": "Add service",
"already": "Already managed",
"delete": "@:common.delete service",
"update": "Update service"
},
"source": {
"kind": "source",
"select-provider": "First, you need to select the provider hosting your domain:",
"select-source": "Select the source where lives your domain {0}",
"source-name": "Source's name",
"source-type": "Source type",
"title": "Your sources"
},
"upgrade": {
"title": "An update is available!",
"content": "A new version of happyDNS is already available. To enable it, please click here to refresh the page."
},
"wait": {
"asking-domains": "Asking provider for the existing domains...",
"exporting": "Please wait while we export your zone…",
"formating": "Please wait while we format your zone…",
"importing": "Please wait while we are importing your domain…",
"loading": "Loading the domain…",
"loading-account": "Loading your account …",
"loading-record": "Loading records…",
"retrieving": "Retrieving source information...",
"retrieving-setting": "Retrieving the source settings' form...",
"updating": "Updating your domain name source",
"validating": "Validating domain …",
"wait": "Please wait"
}
}

View File

@ -34,8 +34,8 @@
<template>
<div>
<div v-if="importInProgress" class="mt-4 text-center">
<b-spinner label="Spinning" />
<p>{{ $t('domains.wait.importing') }}</p>
<b-spinner :label="$t('common.spinning')" />
<p>{{ $t('wait.importing') }}</p>
</div>
<div v-else-if="selectedHistory">
<b-row class="mt-2">
@ -76,7 +76,7 @@
<b-modal id="modal-viewZone" :title="$t('domains.view.title')" size="lg" scrollable ok-only :ok-disabled="zoneContent === null">
<div v-if="zoneContent === null" class="my-2 text-center">
<b-spinner label="Spinning" />
<p>{{ $t('domains.wait.formating') }}</p>
<p>{{ $t('wait.formating') }}</p>
</div>
<pre v-else style="overflow: initial">{{ zoneContent }}</pre>
</b-modal>
@ -106,7 +106,7 @@
</template>
<div v-if="zoneDiffAdd === null && zoneDiffDel === null" class="my-2 text-center">
<b-spinner label="Spinning" />
<p>{{ $t('domains.wait.exporting') }}</p>
<p>{{ $t('wait.exporting') }}</p>
</div>
<div v-for="(line, n) in zoneDiffAdd" :key="'a' + n" class="text-monospace text-success" style="white-space: nowrap">
+{{ line }}

View File

@ -37,11 +37,13 @@
<button type="button" class="btn font-weight-bolder" @click="$router.go(-1)">
<b-icon icon="chevron-left" />
</button>
Select the source where lives your domain <span class="text-monospace">{{ $route.params.domain }}</span>
<i18n path="source.select-source" tag="span">
<span class="text-monospace">{{ $route.params.domain }}</span>
</i18n>
</h1>
<div v-if="validatingNewDomain" class="d-flex justify-content-center align-items-center">
<b-spinner variant="primary" label="Spinning" class="mr-3" /> Validating domain &hellip;
<b-spinner variant="primary" label="Spinning" class="mr-3" /> {{ $t('wait.validating') }};
</div>
<b-row v-else>
@ -49,7 +51,7 @@
<source-list ref="sourceList" emit-new-if-empty @newSource="newSource" @sourceSelected="selectExistingSource($event, $route.params.domain, true)" />
<p class="text-center mt-3">
Can't find the source here? <a href="#" @click.prevent="newSource">Add it now!</a>
{{ $t('domains.find-source') }} <a href="#" @click.prevent="newSource">{{ $t('domains.add-now') }}</a>
</p>
</b-col>
</b-row>

View File

@ -34,21 +34,21 @@
<template>
<div>
<div v-if="isLoading" class="mt-5 d-flex justify-content-center align-items-center">
<b-spinner variant="primary" label="Spinning" class="mr-3" /> Retrieving source information...
<b-spinner variant="primary" label="Spinning" class="mr-3" /> {{ $t('wait.retrieving') }}
</div>
<div v-else>
<h2 class="mt-3 mb-3">
<span class="text-monospace">{{ domain.domain }}</span>
<small class="text-muted">
Source parameters
{{ $t('domains.views.source-parameters') }}
</small>
</h2>
<p>
<span class="text-primary">Name</span><br>
<span class="text-primary">{{ $t('common.name') }}</span><br>
<strong>{{ source._comment }}</strong>
</p>
<p>
<span class="text-primary">Source type</span><br>
<span class="text-primary">{{ $t('source.source-type') }}</span><br>
<strong :title="source._srctype">{{ specs[source._srctype].name }}</strong><br>
<span class="text-muted">{{ specs[source._srctype].description }}</span>
</p>

View File

@ -34,11 +34,11 @@
<template>
<b-container fluid>
<b-alert variant="danger" :show="error.length != 0">
<strong>Error:</strong> {{ error }}
<strong>{{ $t('errors.error') }}</strong> {{ error }}
</b-alert>
<div v-if="!domain && error.length == 0" class="text-center">
<b-spinner label="Spinning" />
<p>Loading the domain&nbsp;&hellip;</p>
<p>{{ $t('wait.loading') }}</p>
</div>
<b-row style="min-height: inherit">
<b-col sm="4" md="3" class="bg-light pb-5">
@ -47,24 +47,24 @@
</router-link>
<b-nav pills vertical variant="secondary">
<b-nav-item :to="'/domains/' + domain.domain" :active="$route.name == 'domain-home'">
Summary
{{ $t('domains.view.summary') }}
</b-nav-item>
<b-nav-item :to="'/domains/' + domain.domain + '/abstract'" :active="$route.name == 'domain-abstract'">
Abstract zone
{{ $t('domains.view.abstract') }}
</b-nav-item>
<b-nav-item :to="'/zones/' + domain.domain + '/records'" :active="$route.name == 'zone-records'">
Live records
{{ $t('domains.view.live') }}
</b-nav-item>
<b-nav-item :to="'/domain/' + domain.domain + '/monitoring'" :active="$route.name == 'domain-monitoring'">
Monitoring
{{ $t('domains.view.monitoring') }}
</b-nav-item>
<b-nav-item :to="'/domains/' + domain.domain + '/source'" :active="$route.name == 'domain-source'">
Domain source
{{ $t('domains.view.source') }}
</b-nav-item>
<hr>
<b-nav-form>
<b-button type="button" variant="outline-danger" @click="detachDomain()">
<b-icon icon="trash-fill" /> Stop managing this domain
<b-icon icon="trash-fill" /> {{ $t('domains.stop') }}
</b-button>
</b-nav-form>
</b-nav>
@ -95,13 +95,13 @@ export default {
methods: {
detachDomain () {
this.$bvModal.msgBoxConfirm('This action will permanently remove the domain ' + this.domain.domain + ' from your managed domains. All history and abstracted zones will be discarded. This action will not delete or unregister your domain from your provider, nor alterate what is currently served. It will only affect what you see in happyDNS. Are you sure you want to continue?', {
title: 'Confirm Domain Removal',
this.$bvModal.msgBoxConfirm(this.$t('domains.alert.remove', { domain: this.domain.domain }), {
title: this.$t('domains.removal'),
size: 'lg',
okVariant: 'danger',
okTitle: 'Discard',
okTitle: this.$t('domains.discard'),
cancelVariant: 'outline-secondary',
cancelTitle: 'Keep my domain in happyDNS'
cancelTitle: this.$t('domains.view.cancel-title')
})
.then(value => {
if (value) {
@ -121,14 +121,12 @@ export default {
.then(
response => (this.domain = response.data),
error => {
this.$root.$bvToast.toast(
'Unfortunately, we were unable to retrieve information for the domain ' + this.$route.params.domain + ': ' + error.response.data.errmsg, {
title: 'Unable to retrieve domain information',
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'
}
)
this.$root.$bvToast.toast(this.$t('domains.alert.unable-retrieve.description', { domain: this.$route.params.domain }) + ' ' + error.response.data.errmsg, {
title: this.$t('domains.alert.unable-retrieve.title'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'
})
this.$router.push('/domains/')
})
}

View File

@ -38,18 +38,18 @@
</b-alert>
<div v-if="isLoading" class="text-center">
<b-spinner variant="primary" label="Spinning" class="mr-3" /> Please wait
<b-spinner variant="primary" :label="$t('common.spinning')" class="mr-3" /> {{ $t('wait.wait') }}
</div>
<b-form v-else ref="form" class="mt-2" @submit.stop.prevent="goResend">
<p>
In order to validate your e-mail address, please check your inbox, and follow the link contained in the message.
{{ $t('email.instruction.validate-address') }}
</p>
<p>
If you need a new confirmation e-mail, just enter your address in the form below.
{{ $t('email.instruction.new-confirmation') }}
</p>
<b-form-row>
<label for="email-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">Email address</label>
<label for="email-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">{{ $t('email.address') }}</label>
<b-col md="6">
<b-form-input
id="email-input"
@ -66,7 +66,7 @@
</b-form-row>
<b-form-row class="mt-3">
<b-button class="offset-sm-4 col-sm-4" type="submit" variant="primary">
Re-send the confirmation e-mail
{{ $t('email.send-again') }}
</b-button>
</b-form-row>
</b-form>
@ -102,8 +102,8 @@ export default {
(response) => {
this.error = ''
this.$root.$bvToast.toast(
'Ready to login!', {
title: 'Your new e-mail address is now validated!',
this.$t('account.ready-login'), {
title: this.$t('email.instruction.validated'),
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
@ -134,8 +134,8 @@ export default {
.then(
(response) => {
this.$root.$bvToast.toast(
'Please check your inbox in order to valiate your e-mail address.', {
title: 'Confirmation e-mail sent!',
this.$t('email.instruction.check-inbox'), {
title: this.$t('email.sent'),
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
@ -146,7 +146,7 @@ export default {
(error) => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'Registration problem',
title: this.$t('errors.registration'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'

View File

@ -38,15 +38,15 @@
</b-alert>
<div v-if="isLoading" class="text-center">
<b-spinner variant="primary" label="Spinning" class="mr-3" /> Please wait
<b-spinner variant="primary" :label="$t('common.spinning')" class="mr-3" /> {{ $t('wait.wait') }}
</div>
<b-form v-else-if="user === ''" ref="formMail" @submit.stop.prevent="goSendLink">
<p>
In order to recover your account, we'll send you an e-mail containing a link that will allow you to redefine your password.
{{ $t('email.recover') }}.
</p>
<b-form-row>
<label for="email-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">Email address</label>
<label for="email-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">{{ $t('email.address') }}</label>
<b-col md="6">
<b-form-input
id="email-input"
@ -63,17 +63,17 @@
</b-form-row>
<b-form-row class="mt-3">
<b-button class="offset-sm-4 col-sm-4" type="submit" variant="primary">
Send me an e-mail to recover my account
{{ $t('email.send-recover') }}
</b-button>
</b-form-row>
</b-form>
<b-form v-else ref="formRecover" @submit.stop.prevent="goRecover">
<p>
In order to recover your account, please fill the following form, with a fresh password.
{{ $t('password.fill') }}
</p>
<b-form-row>
<label for="password-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">New password</label>
<label for="password-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">{{ $t('password.new') }}</label>
<b-col md="6">
<b-form-input
id="password-input"
@ -88,7 +88,7 @@
</b-col>
</b-form-row>
<b-form-row class="mt-2">
<label for="passwordconfirm-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">Password confirmation</label>
<label for="passwordconfirm-input" class="col-md-4 col-form-label text-truncate text-md-right font-weight-bold">{{ $t('password.confirmation') }}</label>
<b-col md="6">
<b-form-input
id="passwordconfirm-input"
@ -103,7 +103,7 @@
</b-form-row>
<b-form-row class="mt-3">
<b-button class="offset-sm-4 col-sm-4" type="submit" variant="primary">
Redefine my password
{{ $t('password.redefine') }}
</b-button>
</b-form-row>
</b-form>
@ -173,8 +173,8 @@ export default {
.then(
(response) => {
this.$root.$bvToast.toast(
'Please check your inbox in order to recover your account.', {
title: 'Password recovery email send!',
this.$t('email.instruction.check-inbox'), {
title: this.$t('email.sent-recovery'),
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
@ -185,7 +185,7 @@ export default {
(error) => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'Password recovery problem',
title: this.$t('errors.recovery'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'
@ -207,8 +207,8 @@ export default {
.then(
(response) => {
this.$root.$bvToast.toast(
'You can now login with your new password.', {
title: 'Password redefined successfully!',
this.$t('password.success'), {
title: this.$t('password.redefined'),
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
@ -219,7 +219,7 @@ export default {
(error) => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'Password recovery problem',
title: this.$t('errors.recovery'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'

View File

@ -33,9 +33,9 @@
<template>
<b-container class="pt-4 pb-5">
<h1 class="text-center mb-4">
Welcome to <h-logo height="40" />!
</h1>
<i18n path="common.welcome" tag="h1" class="text-center mb-4">
<h-logo height="40" />
</i18n>
<b-row>
<b-col offset-md="2" md="8">
<zone-list ref="zlist" @noDomain="firstTimeAct" />

View File

@ -33,6 +33,6 @@
<template>
<b-container class="pt-4 pb-5 text-center">
<b-spinner variant="primary" label="Spinning" class="mr-3" /> Loading your account &hellip;
<b-spinner variant="primary" :label="$t('common.spinning')" class="mr-3" /> {{ $t('wait.loading-account') }}
</b-container>
</template>

View File

@ -36,9 +36,9 @@
<b-row>
<b-col sm="4" class="d-none d-sm-flex align-items-center">
<div>
Don't already have an account on our beautiful platform?
{{ $t('account.ask-have') }}
<router-link to="/join" variant="outline-primary" class="font-weight-bold">
Join now!
{{ $t('account.join') }}
</router-link>
</div>
</b-col>
@ -46,15 +46,15 @@
<b-card header-tag="div">
<template v-slot:header>
<h6 class="mb-0 font-weight-bold">
Happy to see you again!
{{ $t('account.see-again') }}
</h6>
</template>
<form ref="form" @submit.stop.prevent="testlogin">
<b-form-group
:state="loginForm.emailState"
label="Email address"
:label="$t('email.address')"
label-for="email-input"
invalid-feedback="Email address is required"
:invalid-feedback="$t('errors.address')"
>
<b-form-input
id="email-input"
@ -70,9 +70,9 @@
</b-form-group>
<b-form-group
:state="loginForm.passwordState"
label="Password"
:label="$t('common.password')"
label-for="password-input"
invalid-feedback="Password is required"
:invalid-feedback="$t('errors.password')"
>
<b-form-input
id="password-input"
@ -87,10 +87,10 @@
</b-form-group>
<div class="d-flex justify-content-around">
<b-button type="submit" variant="primary">
Go!
{{ $t('common.go') }}
</b-button>
<b-button to="/forgotten-password" variant="outline-dark">
Forgotten password?
{{ $t('password.forgotten') }}
</b-button>
</div>
</form>

View File

@ -34,13 +34,13 @@
<template>
<b-container class="my-4">
<h2 id="password-change">
Change my password
{{ $t('password.change') }}
</h2>
<b-row>
<b-card class="offset-md-2 col-8">
<b-form @submit.stop.prevent="sendChPassword">
<b-form-group
label="Enter your current password"
:label="$t('password.enter')"
label-for="currentPassword-input"
>
<b-form-input
@ -54,9 +54,9 @@
</b-form-group>
<b-form-group
:state="passwordState"
label="Enter your new password"
:label="$t('password.enter-new')"
label-for="password-input"
invalid-feedback="Password has to be strong enough: at least 8 characters with numbers, low case characters and high case characters."
:invalid-feedback="$t('errors.password-weak')"
>
<b-form-input
id="password-input"
@ -71,9 +71,9 @@
</b-form-group>
<b-form-group
:state="passwordConfirmState"
label="Confirm your new password"
:label="$t('password.confirm-new')"
label-for="passwordconfirm-input"
invalid-feedback="Password and its confirmation doesn't match."
:invalid-feedback="$t('errors.password-match')"
>
<b-form-input
id="passwordconfirm-input"
@ -87,7 +87,7 @@
</b-form-group>
<div class="d-flex justify-content-around">
<b-button type="submit" variant="primary">
Change password
{{ $t('password.change') }}
</b-button>
</div>
</b-form>
@ -95,29 +95,29 @@
</b-row>
<hr>
<h2 id="delete-account">
Delete my account
{{ $t('account.delete.delete') }}
</h2>
<b-row>
<b-card class="offset-md-2 col-8">
<p>
If you want to delete your account and all data associated with it, press the button below:
{{ $t('account.delete.confirm') }}
</p>
<b-button type="button" variant="danger" @click="askAccountDeletion">
Delete my account
{{ $t('account.delete.delete') }}
</b-button>
<p class="mt-2 text-muted" style="line-height: 1.1">
<small>
Your domains owned on others platforms will not be affected by the deletion, they'll continue to respond with the current dataset.
{{ $t('account.delete.consequence') }}
</small>
</p>
</b-card>
</b-row>
<b-modal id="delete-account-modal" title="Delete Your Account" ok-variant="danger" ok-title="Delete my account" cancel-variant="primary" @ok="deleteMyAccount">
<b-modal id="delete-account-modal" :title="$t('account.delete.delete')" ok-variant="danger" :ok-title="$t('account.delete.delete')" cancel-variant="primary" @ok="deleteMyAccount">
<p>
By confirming the deletion, you'll permanently and irrevocably delete your account from our database and will loose easy access to our easy management interface for your domains.
{{ $t('account.delete.confirm-twice') }}
</p>
<b-form-group
label="To ensure this is really you, please enter your password:"
:label="$t('account.delete.confirm-password')"
label-for="currentPassword-forDeletion"
>
<b-form-input
@ -133,7 +133,7 @@
</b-form-group>
<p class="text-muted" style="line-height: 1.1">
<small>
For technical reason, your account will be deleted right after your validation, but some data from your account will persist until the next database clean up.
{{ $t('account.delete.remain-data') }}
</small>
</p>
</b-modal>
@ -185,8 +185,8 @@ export default {
.then(
response => {
this.$root.$bvToast.toast(
'Your account have been successfully deleted. We hope to see you back soon.', {
title: 'Account Deleted',
this.$t('account.delete.success'), {
title: this.$t('account.delete.deleted'),
variant: 'primary',
toaster: 'b-toaster-content-right'
}
@ -196,7 +196,7 @@ export default {
error => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'An error occurs when trying to delete your account',
title: this.$t('errors.account-delete'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'
@ -210,20 +210,18 @@ export default {
.post('/api/users/' + encodeURIComponent(this.loggedUser.id.toString(16)) + '/new_password', this.signupForm)
.then(
response => {
this.$root.$bvToast.toast(
'Your account\'s password has been changed with success.', {
title: 'Password Successfully Changed',
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
}
)
this.$root.$bvToast.toast(this.$t('password.success-change'), {
title: this.$t('password.changed'),
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
})
this.$router.push('/')
},
error => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'Unable to change your password account',
title: this.$t('errors.password-change'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'

View File

@ -33,28 +33,38 @@
<template>
<b-container class="pb-4">
<h1 class="text-center my-4">
Welcome to <h-logo height="40" />!
</h1>
<i18n path="common.welcome" tag="h1" class="text-center mb-4">
<h-logo height="40" />
</i18n>
<b-card-group class="my-4" deck>
<b-card>
<h3 class="text-secondary text-center mt-1 mb-4">
I don't own any domain
{{ $t('onboarding.no-sale.title') }}
</h3>
<p class="text-justify text-indent mt-4 mb-3">
<h-logo height="19" /> does not sell domain yet. To start using our interface, you need to buy a domain from one of our supported provider.
</p>
<i18n path="onboarding.no-sale.description" tag="p" class="text-justify text-indent mt-4 mb-3">
<h-logo height="19" />
</i18n>
<p class="text-justify text-indent mt-3 mb-4">
We'll provide some guidance in a near future on how to easily buy a domain name. So stay tune and get in touch with us if you'll help us to build a comprehensive guide.
{{ $t('onboarding.no-sale.buy-advice') }}
</p>
</b-card>
<b-card>
<h3 class="text-primary text-center mt-1 mb-4">
I already own domain(s)
{{ $t('onboarding.own') }}
</h3>
<p class="text-justify text-indent my-4">
Use <h-logo height="19" /> as a remplacement interface to your usual domain name provider. It'll still rely on your provider's infrastructure, you'll just take benefit from our simple interface. As a first step, <span v-if="noSource">choose your provider:</span><span v-else>choose between already configured providers or <router-link to="/sources/new">add a new one</router-link>:</span>
<i18n path="onboarding.use" tag="span">
<template v-slot:happyDNS>
<h-logo height="19" />
</template>
<template v-slot:first-step>
<span v-if="noSource">{{ $t('onboarding.suggest-source') }}</span><i18n path="onboarding.choose-configured" tag="span">
<router-link to="/sources/new">
{{ $t('onboarding.add-one') }}
</router-link>
</i18n>
</template>
</i18n>
</p>
<source-list v-if="!noSource" emit-new-if-empty no-label @newSource="noSource = true" @sourceSelected="selectExistingSource" />
<h-new-source-selector v-if="noSource" @sourceSelected="selectNewSource" />
@ -62,16 +72,19 @@
</b-card-group>
<b-card id="aa-hosting" class="my-3">
<span class="text-secondary font-weight-bold">I don't want to rely on my domain name hosting provider anymore. Can I host my domain name on your infrastructure?</span><br>
<span class="text-secondary font-weight-bold">{{ $t('onboarding.questions.hosting.q') }}</span><br>
<div class="mx-3">
We'll provide such feature in a near future, as it's on our manifest. We choose to focus first on spreading the word that domain names are accessibles to everyone through this sweet interface, before targeting privacy, censorship, &hellip;
{{ $t('onboarding.questions.hosting.a') }}
</div>
</b-card>
<b-card id="sec-hosting" class="my-3">
<span class="text-secondary font-weight-bold">I've my own infrastructure, can I use <h-logo height="18" /> as secondary authoritative server?</span><br>
<i18n path="onboarding.questions.secondary.q" tag="span" class="text-secondary font-weight-bold">
<h-logo height="18" />
</i18n>
<br>
<div class="mx-3">
We'll provide such feature in a near future, as soon as our name server infrastructure is on.
{{ $t('onboarding.questions.secondary.a') }}
</div>
</b-card>
</b-container>

View File

@ -44,18 +44,25 @@
<b-card header-tag="div">
<template v-slot:header>
<h6 class="mb-0 font-weight-bold">
Join our nice platform in less than 2 minutes!
{{ $t('account.signup.join-call') }}
</h6>
</template>
<form ref="form" class="container mt-2" @submit.stop.prevent="goSignUp">
<b-form-group
:state="emailState"
label="Email address"
:label="$t('email.address')"
label-for="email-input"
invalid-feedback="A valid e-mail address is required."
:invalid-feedback="$t('errors.address-valid')"
>
<template v-slot:description>
You'll use your address to <strong>identify</strong> yourself on the platform, and it could be used to contact you for <strong>security related operations</strong>.
<i18n path="account.signup.address-why">
<template v-slot:identify>
<strong>{{ $t('account.signup.identify') }}</strong>
</template>
<template v-slot:security-operations>
<strong>{{ $t('account.signup.security-operations') }}</strong>
</template>
</i18n>
</template>
<b-form-input
id="email-input"
@ -72,9 +79,9 @@
</b-form-group>
<b-form-group
:state="passwordState"
label="Password"
:label="$t('common.password')"
label-for="password-input"
invalid-feedback="Password has to be strong enough: at least 8 characters with numbers, low case characters and high case characters."
:invalid-feedback="$t('errors.password-weak')"
>
<b-form-input
id="password-input"
@ -89,9 +96,9 @@
</b-form-group>
<b-form-group
:state="passwordConfirmState"
label="Password confirmation"
:label="$t('password.confirmation')"
label-for="passwordconfirm-input"
invalid-feedback="Password and its confirmation doesn't match."
:invalid-feedback="$t('errors.password-match')"
>
<b-form-input
id="passwordconfirm-input"
@ -107,15 +114,15 @@
<b-form-checkbox
v-model="signupForm.wantReceiveUpdate"
>
Keep me informed of future big improvements
{{ $t('account.signup.receive-update') }}
</b-form-checkbox>
</b-form-group>
<div class="d-flex justify-content-around">
<b-button type="submit" variant="primary">
Sign up!
{{ $t('account.signup.signup') }}
</b-button>
<b-button to="/login" variant="outline-dark">
Already member?
{{ $t('account.signup.already') }}
</b-button>
</div>
</form>
@ -166,20 +173,18 @@ export default {
})
.then(
(response) => {
this.$root.$bvToast.toast(
'Please check your inbox in order to valiate your e-mail address.', {
title: 'Registration successfully performed!',
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
}
)
this.$root.$bvToast.toast(this.$t('email.instruction.check-inbox'), {
title: this.$t('account.signup.success'),
autoHideDelay: 5000,
variant: 'success',
toaster: 'b-toaster-content-right'
})
this.$router.push('/login')
},
(error) => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'Registration problem',
title: this.$t('errors.registration'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'

View File

@ -33,12 +33,12 @@
<template>
<b-container class="mt-4 mb-5">
<h3 class="text-center mb-4">
Domains living on <em v-if="mySource">{{ mySource._comment }}</em>
</h3>
<i18n path="source.source" tag="h3" class="text-center mb-4">
<em v-if="mySource">{{ mySource._comment }}</em>
</i18n>
<b-list-group>
<b-list-group-item v-if="isLoading" class="text-center">
<b-spinner variant="secondary" label="Spinning" /> Asking provider for the existing domains...
<b-spinner variant="secondary" :label="$t('common.spinning')" /> {{ $t('wait.asking-domains') }}
</b-list-group-item>
<b-list-group-item v-for="(domain, index) in domainsList" :key="index" class="d-flex justify-content-between align-items-center" :to="haveDomain(domain) ? '/domains/' + encodeURIComponent(domain) : ''">
<div>
@ -46,18 +46,18 @@
</div>
<div>
<b-badge v-if="haveDomain(domain)" class="ml-1" variant="success">
<b-icon icon="check" /> Already managed
<b-icon icon="check" /> {{ $t('service.already') }}
</b-badge>
<b-button v-else type="button" class="ml-1" variant="primary" size="sm" @click="importDomain(domain)">
Add now
{{ $t('domains.add-now') }}
</b-button>
</div>
</b-list-group-item>
<b-list-group-item v-if="!noDomainsList && !isLoading && domainsList.length === 0" class="text-center">
It appears you don't have any domain name registered on this provider.
{{ $t('errors.domain-have') }}
</b-list-group-item>
<b-list-group-item v-else-if="noDomainsList && !isLoading && domainsList.length === 0" class="text-center">
This provider doesn't permit to list existing domains. Use the form below to add one.
{{ $t('errors.domain-list') }}
</b-list-group-item>
</b-list-group>
<h-list-group-input v-if="noDomainsList" v-model="newDomain" autofocus class="mt-2" placeholder="my.new.domain." :state="newDomainState" input-class="text-monospace" @submit="submitNewDomain" @update="validateNewDomain" />
@ -152,8 +152,8 @@ export default {
.then(
(response) => {
this.$bvToast.toast(
'Great! ' + response.data.domain + ' has been added. You can manage it right now.', {
title: 'New domain attached to happyDNS!',
this.$t('domains.added-success'), { domain: response.data.domain }, {
title: this.$t('domains.attached-new'),
autoHideDelay: 5000,
variant: 'success',
href: '/domains/' + response.data.domain,
@ -165,7 +165,7 @@ export default {
(error) => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'An error occurs when attaching the domain to happyDNS',
title: this.$t('errors.domain-attach'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'
@ -188,7 +188,7 @@ export default {
error => {
this.$root.$bvToast.toast(
error.response.data.errmsg, {
title: 'An error occurs when trying to access domain\'s list.',
title: this.$t('errors.domain-access'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'

View File

@ -35,10 +35,10 @@
<b-container class="pt-4 pb-5">
<b-button type="button" variant="primary" class="float-right" @click="newSource">
<b-icon icon="plus" />
Add new source
{{ $t('common.add-new-thing', { thing: $t('source.kind') }) }}
</b-button>
<h1 class="text-center mb-4">
Your sources
{{ $t('source.title') }}
</h1>
<b-row>
<b-col offset-md="2" md="8">

View File

@ -34,7 +34,7 @@
<template>
<b-container style="min-height: inherit" fluid>
<div v-if="isLoading" class="mt-5 d-flex justify-content-center align-items-center">
<b-spinner variant="primary" label="Spinning" class="mr-3" /> Retrieving the source settings' form...
<b-spinner variant="primary" :label="$t('common.spinning')" class="mr-3" /> {{ $t('wait.retrieving-setting') }}
</div>
<b-row v-else style="min-height: inherit">
<b-col lg="4" md="5" class="bg-light">

View File

@ -37,7 +37,8 @@
<button type="button" class="btn font-weight-bolder" @click="$router.go(-1)">
<b-icon icon="chevron-left" />
</button>
Select the source where lives your domain
<i18n path="source.select-source">
</i18n>
</h1>
<hr style="margin-bottom:0">
<router-view />

View File

@ -35,7 +35,7 @@
<b-form v-if="!isLoading" class="mt-2 mb-5" @submit.stop.prevent="nextState">
<b-button v-if="!edit" class="float-right" type="button" size="sm" variant="outline-primary" @click="editSource">
<b-icon icon="pencil" />
Edit
{{ $t('common.edit') }}
</b-button>
<h-resource-value-simple-input
@ -44,7 +44,7 @@
v-model="mySource._comment"
always-show
:index="0"
label="Source's name"
:label="$t('source.source-name')"
:description="edit?'Give an explicit name in order to easily find this service.':''"
:placeholder="sources[sourceSpecsSelected].name + ' 1'"
required

View File

@ -37,7 +37,7 @@
<button type="button" class="btn font-weight-bolder" @click="$router.go(-1)">
<b-icon icon="chevron-left" />
</button>
Updating your domain name source <em v-if="mySource">{{ mySource._comment }}</em>
{{ $t('wait.updating') }} <em v-if="mySource">{{ mySource._comment }}</em>
</h1>
<hr style="margin-bottom:0">
@ -57,11 +57,11 @@
<div class="text-center mb-2">
<b-button v-if="source_specs && source_specs.capabilities && source_specs.capabilities.indexOf('ListDomains') > -1" type="button" variant="secondary" class="mb-1" @click="showListImportableDomain()">
<b-icon icon="list-task" />
List importable domains
{{ $t('domains.list') }}
</b-button>
<b-button type="button" variant="danger" class="mb-1" @click="deleteSource()">
<b-icon icon="trash-fill" />
Delete this source
{{ $t('domains.delete-source') }}
</b-button>
</div>
</b-col>
@ -128,7 +128,7 @@ export default {
error => {
this.$root.$bvToast.toast(
error.response.data.errmsg, {
title: 'Something went wrong during source deletion',
title: this.$t('errors.source-delete'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'

View File

@ -34,16 +34,16 @@
<template>
<b-container class="mt-3" :fluid="responses.length?true:false">
<h1 class="text-center mb-3">
DNS resolver
{{ $t('menu.dns-resolver') }}
</h1>
<b-row>
<b-col :offset-md="responses.length?0:2" :md="responses.length?4:8" :class="responses.length?'bg-light':'' + 'pb-5 pt-4'">
<form class="pt-3 pb-5" @submit.stop.prevent="submitRequest">
<b-form-group
id="input-resolver"
label="Resolver"
:label="$t('common.resolver')"
label-for="resolver"
description="Give an explicit name in order to easily find this service."
:description="$t('domains.give-explicit-name')"
>
<b-form-select
id="resolver"
@ -55,9 +55,9 @@
<b-form-group
id="input-domain"
label="Domain or subdomain"
:label="$t('common.domain')"
label-for="domain"
description="spec.description"
:description="$t('common.description')"
>
<b-form-input
id="domain"
@ -69,9 +69,9 @@
<b-form-group
id="input-type"
label="Field"
:label="$t('common.field')"
label-for="type"
description="spec.type"
:description="$t('common.type')"
>
<b-form-select
id="type"
@ -83,8 +83,8 @@
<div class="ml-3 mr-3">
<b-button class="float-right" type="submit" variant="primary" :disabled="request_pending">
<b-spinner v-if="request_pending" label="Spinning" small />
Run the request!
<b-spinner v-if="request_pending" :label="$t('common.spinning')" small />
{{ $t('common.run') }}
</b-button>
</div>
</form>
@ -156,7 +156,7 @@ export default {
(error) => {
this.$bvToast.toast(
error.response.data.errmsg, {
title: 'An error occurs when trying to resolve the domain.',
title: this.$t('errors.resolve'),
autoHideDelay: 5000,
variant: 'danger',
toaster: 'b-toaster-content-right'

View File

@ -113,8 +113,8 @@
</table>
</div>
<div v-if="!rrs.length && error.length == 0" class="text-center mt-5">
<b-spinner label="Spinning" />
<p>Loading records&nbsp;&hellip;</p>
<b-spinner :label="$t('common.spinning')" />
<p>{{ $t('wait.loading-record') }}</p>
</div>
</div>
</template>
@ -187,7 +187,7 @@ export default {
.then(response => (this.rrs = response.data))
},
(error) => {
alert('An error occurs when trying to add RR to the zone: ' + error.response.data.errmsg)
alert(this.$t('errors.rr-add') + ' ' + error.response.data.errmsg)
}
)
},
@ -206,7 +206,7 @@ export default {
.then(response => (this.rrs = response.data))
},
(error) => {
alert('An error occurs when trying to delete RR in the zone: ' + error.response.data.errmsg)
alert(this.$t('errors.rr-delete') + ' ' + error.response.data.errmsg)
}
)
}