Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Projets publics
Ravada-Mirror
Commits
66b5253b
Commit
66b5253b
authored
Dec 14, 2020
by
Francesc Guasch
Browse files
Merge branch 'develop' of
https://github.com/UPC/ravada
into develop
parents
13713d2e
3e152317
Changes
65
Hide whitespace changes
Inline
Side-by-side
lib/Ravada.pm
View file @
66b5253b
...
...
@@ -98,6 +98,9 @@ $DIR_SQL = "/usr/share/doc/ravada/sql/mysql" if ! -e $DIR_SQL;
our
$USER_DAEMON
;
our
$USER_DAEMON_NAME
=
'
daemon
';
our
$FIRST_TIME_RUN
=
1
;
$FIRST_TIME_RUN
=
0
if
$
0
=~
/\.t$/
;
has
'
connector
'
=>
(
is
=>
'
rw
'
);
...
...
@@ -146,6 +149,7 @@ sub _install($self) {
$self
->
_update_data
();
$self
->
_init_user_daemon
();
$self
->
_sql_insert_defaults
();
print
"
\n
"
if
$FIRST_TIME_RUN
;
}
sub
_init_user_daemon
{
...
...
@@ -574,7 +578,7 @@ sub _update_isos {
sub
_scheduled_fedora_releases
($self,$data) {
return
if
!
exists
$VALID_VM
{
KVM
}
||!
$VALID_VM
{
KVM
};
return
if
!
exists
$VALID_VM
{
KVM
}
||!
$VALID_VM
{
KVM
}
||
$>
;
my
$vm
=
$self
->
search_vm
('
KVM
')
or
return
;
# TODO move ISO downloads off KVM
my
@now
=
localtime
(
time
);
...
...
@@ -869,7 +873,8 @@ sub _update_table($self, $table, $field, $data, $verbose=0) {
warn
("
INFO:
$table
:
$row
->{
$field
} already added.
\n
")
if
$verbose
;
next
;
}
warn
("
INFO: updating
$table
:
$row
->{
$field
}
\n
")
if
$
0
!~
/\.t$/
;
warn
("
INFO: updating
$table
:
$row
->{
$field
}
\n
")
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
my
$sql
=
"
INSERT INTO
$table
"
...
...
@@ -983,7 +988,10 @@ sub _add_indexes_generic($self) {
$type
.=
"
INDEX
"
if
$type
=~
/^unique/i
;
my
$sql
=
"
CREATE
$type
$if_not_exists
$name
on
$table
(
$fields
)
";
warn
"
INFO: Adding index to
$table
:
$name
"
if
$
0
!~
/\.t$/
;
warn
"
INFO: Adding index to
$table
:
$name
"
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
print
"
+
"
if
$FIRST_TIME_RUN
;
my
$sth
=
$CONNECTOR
->
dbh
->
prepare
(
$sql
);
$sth
->
execute
();
}
...
...
@@ -1207,7 +1215,8 @@ sub _upgrade_table {
warn
"
INFO: changing
$field
\n
"
.
"
$row
->{COLUMN_SIZE} to
"
.
(
$new_size
or
'')
.
"
\n
"
.
"
$row
->{TYPE_NAME} ->
$new_type
\n
"
.
"
in
$table
\n
$definition
\n
"
if
$
0
!~
/\.t$/
;
.
"
in
$table
\n
$definition
\n
"
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
print
"
-
"
if
$FIRST_TIME_RUN
;
$dbh
->
do
("
alter table
$table
change
$field
$field
$definition
");
return
;
}
...
...
@@ -1219,11 +1228,14 @@ sub _upgrade_table {
$definition
=~
s/DEFAULT.*ON UPDATE(.*)//i
;
$sqlite_trigger
=
$
1
;
}
warn
"
INFO: adding
$field
$definition
to
$table
\n
"
if
$
0
!~
/\.t$/
;
warn
"
INFO: adding
$field
$definition
to
$table
\n
"
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
$dbh
->
do
("
alter table
$table
add
$field
$definition
");
if
(
$sqlite_trigger
&&
!
$self
->
_exists_trigger
(
$dbh
,
"
Update
$field
")
)
{
$self
->
_sqlite_trigger
(
$dbh
,
$table
,
$field
,
$sqlite_trigger
);
}
print
"
-
"
if
$FIRST_TIME_RUN
;
return
1
;
}
...
...
@@ -1262,7 +1274,9 @@ sub _remove_field {
$sth
->
finish
;
return
if
!
$row
;
warn
"
INFO: removing
$field
to
$table
\n
"
if
$
0
!~
/\.t$/
;
warn
"
INFO: removing
$field
to
$table
\n
"
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
$dbh
->
do
("
alter table
$table
drop column
$field
");
return
1
;
...
...
@@ -1277,7 +1291,10 @@ sub _create_table {
$sth
->
finish
;
return
if
keys
%$info
;
warn
"
INFO: creating table
$table
\n
"
if
$
0
!~
/\.t$/
;
warn
"
INFO: creating table
$table
\n
"
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
print
"
.
"
if
$FIRST_TIME_RUN
;
my
$file_sql
=
"
$DIR_SQL
/
$table
.sql
";
open
my
$in
,'
<
',
$file_sql
or
die
"
$!
$file_sql
";
...
...
@@ -1295,7 +1312,9 @@ sub _insert_data {
my
$file_sql
=
"
$DIR_SQL
/../data/insert_
$table
.sql
";
return
if
!
-
e
$file_sql
;
warn
"
INFO: inserting data for
$table
\n
";
warn
"
INFO: inserting data for
$table
\n
"
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
open
my
$in
,'
<
',
$file_sql
or
die
"
$!
$file_sql
";
my
$sql
=
'';
while
(
my
$line
=
<
$in
>
)
{
...
...
@@ -1326,6 +1345,7 @@ sub _create_tables {
}
sub
_sql_create_tables
($self) {
my
$created
=
0
;
my
$driver
=
lc
(
$CONNECTOR
->
dbh
->
{
Driver
}{
Name
});
my
%tables
=
(
settings
=>
{
...
...
@@ -1339,9 +1359,14 @@ sub _sql_create_tables($self) {
my
$sth
=
$CONNECTOR
->
dbh
->
table_info
('
%
',
undef
,
$table
,'
TABLE
');
my
$info
=
$sth
->
fetchrow_hashref
();
$sth
->
finish
;
next
if
keys
%$info
;
if
(
keys
%$info
)
{
$FIRST_TIME_RUN
=
0
;
next
;
}
warn
"
INFO: creating table
$table
\n
"
if
$
0
!~
/\.t$/
;
print
"
Installing
"
if
!
$created
&&
$FIRST_TIME_RUN
;
warn
"
INFO: creating table
$table
\n
"
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
my
$sql_fields
;
for
my
$field
(
sort
keys
%
{
$tables
{
$table
}}
)
{
...
...
@@ -1352,8 +1377,9 @@ sub _sql_create_tables($self) {
my
$sql
=
"
CREATE TABLE
$table
(
$sql_fields
)
";
$CONNECTOR
->
dbh
->
do
(
$sql
);
$created
++
;
}
return
$created
;
}
sub
_sql_insert_defaults
($self){
...
...
@@ -1450,7 +1476,10 @@ sub _sql_insert_defaults($self){
$sth
->
execute
(
$entry
->
{
$field
{
$table
}});
my
(
$found
)
=
$sth
->
fetchrow
;
next
if
$found
;
warn
"
INFO adding default
$table
"
.
Dumper
(
$entry
)
if
$
0
!~
/t$/
;
warn
"
INFO: adding default
$table
"
.
Dumper
(
$entry
)
if
!
$FIRST_TIME_RUN
&&
$
0
!~
/\.t$/
;
$self
->
_sql_insert_values
(
$table
,
$entry
);
}
}
...
...
@@ -3768,6 +3797,12 @@ sub _cmd_list_network_interfaces($self, $request) {
$request
->
output
(
encode_json
(
\
@ifs
));
}
sub
_cmd_list_storage_pools
($self, $request) {
my
$id_vm
=
$request
->
args
('
id_vm
');
my
$vm
=
Ravada::
VM
->
open
(
$id_vm
);
$request
->
output
(
encode_json
([
$vm
->
list_storage_pools
]));
}
sub
_cmd_list_isos
($self, $request){
my
$vm_type
=
$request
->
args
('
vm_type
');
...
...
@@ -4217,6 +4252,8 @@ sub _req_method {
,
compact
=>
\
&_cmd_compact
,
purge
=>
\
&_cmd_purge
,
list_storage_pools
=>
\
&_cmd_list_storage_pools
# Domain ports
,
expose
=>
\
&_cmd_expose
,
remove_expose
=>
\
&_cmd_remove_expose
...
...
lib/Ravada/Auth/LDAP.pm
View file @
66b5253b
...
...
@@ -440,14 +440,14 @@ sub _login_bind {
for
my
$user
(
@user
)
{
my
$dn
=
$user
->
dn
;
$found
++
;
my
$
mesg
=
$LDAP_ADMIN
->
bind
(
$dn
,
password
=>
$password
);
if
(
!
$mesg
->
code
()
)
{
my
$
ldap
=
_connect_ldap
(
$dn
,
$password
);
if
(
$ldap
)
{
$self
->
{
_auth
}
=
'
bind
';
$self
->
{
_ldap_entry
}
=
$user
;
return
1
;
}
warn
"
ERROR:
"
.
$mesg
->
code
.
"
:
"
.
$mesg
->
error
.
"
:
Bad credentials for
$dn
"
if
$
Ravada::
DEBUG
&&
$
mesg
->
code
;
warn
"
ERROR: Bad credentials for
$dn
"
if
$
Ravada::
DEBUG
&&
$
@
;
}
return
0
;
}
...
...
lib/Ravada/Front.pm
View file @
66b5253b
...
...
@@ -570,6 +570,48 @@ sub _list_bases_vm($self, $id_node) {
return
\
@bases
;
}
sub
_list_bases_vm_all
($self, $id_node) {
my
$sth
=
$CONNECTOR
->
dbh
->
prepare
(
"
SELECT d.id, d.name FROM domains d, vms v
"
.
"
WHERE is_base=? AND vm=v.vm_type
"
.
"
AND d.vm =v.vm_type
"
.
"
AND v.id=?
"
.
"
ORDER BY d.name
"
);
$sth
->
execute
(
1
,
$id_node
);
my
$sth_bv
=
$CONNECTOR
->
dbh
->
prepare
(
"
SELECT bv.enabled FROM bases_vm bv, domains d
"
.
"
WHERE bv.id_domain=? AND bv.id_vm=?
"
.
"
AND d.id = bv.id_domain
"
);
my
(
$id_domain
,
$name_domain
);
$sth
->
bind_columns
(
\
(
$id_domain
,
$name_domain
));
my
$sth_clones
=
$CONNECTOR
->
dbh
->
prepare
(
"
SELECT count(*) FROM domain_instances
"
.
"
WHERE id_vm=? AND id_domain IN (SELECT id FROM domains WHERE id_base=?)
"
);
my
@bases
;
while
(
$sth
->
fetch
)
{
$sth_bv
->
execute
(
$id_domain
,
$id_node
);
my
(
$enabled
)
=
$sth_bv
->
fetchrow
;
$sth_clones
->
execute
(
$id_node
,
$id_domain
);
my
(
$n_clones
)
=
$sth_clones
->
fetchrow
();
push
@bases
,{
id
=>
$id_domain
,
name
=>
$name_domain
,
clones
=>
$n_clones
,
enabled
=>
(
$enabled
or
0
)
};
}
return
\
@bases
;
}
sub
_list_machines_vm
($self, $id_node) {
my
$sth
=
$CONNECTOR
->
dbh
->
prepare
(
"
SELECT d.id, name FROM domains d
"
...
...
@@ -585,6 +627,7 @@ sub _list_machines_vm($self, $id_node) {
return
\
@bases
;
}
=head2 list_iso_images
Returns a reference to a list of the ISO images known by the system
...
...
@@ -627,7 +670,8 @@ sub iso_file ($self, $vm_type) {
$self
->
wait_request
(
$req
);
return
[]
if
$req
->
status
ne
'
done
';
my
$isos
=
decode_json
(
$req
->
output
());
my
$isos
=
[]
;
$isos
=
decode_json
(
$req
->
output
())
if
$req
->
output
;
$self
->
_cache_store
("
list_isos
",
$isos
);
...
...
@@ -677,6 +721,41 @@ sub list_users($self,$name=undef) {
return
\
@users
;
}
sub
list_bases_network
($self, $id_network) {
my
$sth
=
$CONNECTOR
->
dbh
->
prepare
("
SELECT * FROM networks where name = 'default'
");
$sth
->
execute
;
my
$default
=
$sth
->
fetchrow_hashref
();
$sth
->
finish
;
my
$sth_nd
=
$CONNECTOR
->
dbh
->
prepare
("
SELECT id,allowed,anonymous FROM domains_network
"
.
"
WHERE id_domain=? AND id_network=?
"
);
$sth
=
$CONNECTOR
->
dbh
->
prepare
("
SELECT * FROM domains where is_base=1
"
.
"
ORDER BY name
");
$sth
->
execute
();
my
@bases
;
while
(
my
$row
=
$sth
->
fetchrow_hashref
)
{
$row
->
{
anonymous
}
=
(
$default
->
{
anonymous
}
or
0
);
$sth_nd
->
execute
(
$row
->
{
id
},
$id_network
);
my
(
$id
,
$allowed
,
$anonymous
)
=
$sth_nd
->
fetchrow
;
$row
->
{
anonymous
}
=
$anonymous
if
defined
$anonymous
;
if
(
defined
$allowed
)
{
$row
->
{
allowed
}
=
$allowed
;
}
else
{
$row
->
{
allowed
}
=
1
;
}
lock_hash
(
%$row
);
push
@bases
,(
$row
);
}
return
\
@bases
;
}
=head2 create_domain
Request the creation of a new domain or virtual machine
...
...
lib/Ravada/I18N/pt.po
View file @
66b5253b
...
...
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: 0.1.0-alpha\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-03 10:12+0300\n"
"PO-Revision-Date: 2020-12-0
6 19:2
9+0000\n"
"PO-Revision-Date: 2020-12-0
9 22:0
9+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/ravada/"
"translation/pt/>\n"
...
...
@@ -31,7 +31,7 @@ msgid "Machines List"
msgstr "Lista de Máquinas"
msgid "Users"
msgstr "U
suário
s"
msgstr "U
tilizadore
s"
msgid "Choose a Machine to Start"
msgstr "Escolha uma Máquina para Começar"
...
...
@@ -58,7 +58,7 @@ msgid "Clone/s"
msgstr "Clone/s"
msgid "Users List"
msgstr "Lista de
Usuário
s"
msgstr "Lista de
utilizadore
s"
msgid "Name"
msgstr "Nome"
...
...
@@ -91,7 +91,7 @@ msgid "New Machine"
msgstr "Nova Máquina"
msgid "I want to change my password"
msgstr "
Eu q
uero mudar a minha
senha
"
msgstr "
Q
uero mudar a minha
palavra-passe
"
msgid "I want to change my language"
msgstr "Eu quero alterar o meu idioma"
...
...
@@ -109,10 +109,10 @@ msgid "Catalan"
msgstr "Catalão"
msgid "New Password:"
msgstr "Nova
Senha
:"
msgstr "Nova
palavra-passe
:"
msgid "Confirm Password:"
msgstr "Confirmar
Senha
:"
msgstr "Confirmar
palavra-passe
:"
msgid "Submit"
msgstr "Enviar"
...
...
@@ -121,7 +121,7 @@ msgid "Your language has been changed successfully"
msgstr "Seu idioma foi alterado com sucesso"
msgid "Your password has been changed successfully"
msgstr "
Sua senha
foi alterada com sucesso"
msgstr "
A sua palavra-passe
foi alterada com sucesso"
msgid "Password too small"
msgstr "Senha muito pequena"
...
...
@@ -154,7 +154,7 @@ msgid "ShutDown"
msgstr "Desligar"
msgid "Screenshot"
msgstr "Captura de
Tela
"
msgstr "Captura de
ecrã
"
msgid "Paused"
msgstr "Pausada"
...
...
@@ -199,7 +199,7 @@ msgid "machines"
msgstr "máquinas"
msgid "users"
msgstr "u
suário
s"
msgstr "u
tilizadore
s"
msgid "messages"
msgstr "mensagens"
...
...
@@ -324,7 +324,7 @@ msgid "can change the settings of any virtual machines "
msgstr "pode alterar as configurações de quaisquer máquinas virtuais "
msgid "cloned from one base owned by the user."
msgstr "clonada de uma das bases que o u
suário
possui."
msgstr "clonada de uma das bases que o u
tilizador
possui."
msgid "can clone public virtual machines."
msgstr "pode clinar máquinas virtuais públicas."
...
...
@@ -339,40 +339,42 @@ msgid "can create virtual machines."
msgstr "pode criar máquinas virtuais."
msgid "can grant permissions to other users"
msgstr "pode conceder permissões para outros u
suários.
"
msgstr "pode conceder permissões para outros u
tilizadores
"
msgid "can hibernate any virtual machine."
msgstr "pode hibernar qualquer máquina virtual."
msgid "can hibernate clones from virtual machines owned by the user."
msgstr "pode hibernar clones de máquinas virtuais que o u
suário
possua."
msgstr "pode hibernar clones de máquinas virtuais que o u
tilizador
possua."
msgid "can hibernate any clone."
msgstr "pode hibernar qualquer clone."
msgid "can remove any virtual machines owned by the user."
msgstr "pode remover quaisquer máquinas virtuais que o u
suário
possua."
msgstr "pode remover quaisquer máquinas virtuais que o u
tilizador
possua."
msgid "can remove any virtual machine."
msgstr "pode remover qualquer máquina virtual."
msgid "can remove clones from virtual machines owned by the user."
msgstr "pode remover clones de máquinas virtuais que o u
suário
possua."
msgstr "pode remover clones de máquinas virtuais que o u
tilizador
possua."
msgid "can remove any clone."
msgstr "pode remover qualquer clone."
msgid "can take a screenshot of any virtual machine owned by the user."
msgstr "pode tirar uma captura de tela de qualquer máquina virtual que o usuário possua."
msgstr ""
"pode tirar uma captura de ecrã de qualquer máquina virtual que o utilizador "
"possua."
msgid "can take a screenshot of any virtual machine."
msgstr "pode tirar uma captura de
tela
de qualquer máquina virtual."
msgstr "pode tirar uma captura de
ecrã
de qualquer máquina virtual."
msgid "can shutdown any virtual machine."
msgstr "pode desligar qualquer máquina virtual."
msgid "can shutdown clones from virtual machines owned by the user."
msgstr "pode desligar clones de máquinas virtuais que o u
suário
possua."
msgstr "pode desligar clones de máquinas virtuais que o u
tilizador
possua."
msgid "Submit Query"
msgstr "Submeter Consulta"
...
...
@@ -442,3 +444,546 @@ msgid ""
msgstr ""
"pode alterar as configurações de quaisquer máquinas virtuais "
"clonadas de uma base possuída pelo usuário."
msgid "Drivers"
msgstr "Drivers"
msgid "Yes, shutwdown all the clones"
msgstr "Sim, desligar todos os clones"
msgid "Keep in mind that there may be users using a clone"
msgstr "Lembre-se que pode haver utilizadores que usam um clone"
msgid "Shutdown all clones"
msgstr "Desligar todos os clones"
msgid "These actions affect all the clones on the machine"
msgstr "Estas ações afetam todos os clones da máquina"
msgid "Add description"
msgstr "Adicionar descrição"
msgid "Enable last for not allowed restrictions."
msgstr "Ativar por último para restrições não permitidas."
msgid "entries."
msgstr "entradas."
msgid "has at least"
msgstr "tem pelo menos"
msgid "No entries found"
msgstr "Nenhuma entrada encontrada"
msgid "Verifying"
msgstr "A verificar"
msgid "save"
msgstr "gravar"
msgid "verify"
msgstr "verificar"
msgid "If none of the previous match, access is denied."
msgstr "Se nenhum dos anteriores corresponde, o acesso é negado."
msgid "If none of the previous match, access is allowed."
msgstr "Se nenhum dos anteriores corresponde, o acesso é permitido."
msgid "Default"
msgstr "Predefinição"
msgid "Last"
msgstr "Último"
msgid "Allowed"
msgstr "Permitido"
msgid "Value"
msgstr "Valor"
msgid "Attribute"
msgstr "Atributo"
msgid "not found in LDAP server"
msgstr "não encontrado no servidor LDAP"
msgid "User name"
msgstr "Nome de utilizador"
msgid "Type a typical LDAP user name to fetch the attribute list"
msgstr ""
"Digite um nome de utilizador LDAP típico para ir buscar a lista de atributos"
msgid "Italian"
msgstr "Italiano"
msgid "Vietnamese"
msgstr "Vietnamita"
msgid "Session timeout"
msgstr "Tempo limite da sessão"
msgid "Empty password"
msgstr "Palavra-passe vazia"
msgid "Empty login name"
msgstr "Nome de login vazio"
msgid "Access denied"
msgstr "Acesso negado"
msgid "Start all clones"
msgstr "Iniciar todos os clones"
msgid "Update password"
msgstr "Atualizar a palavra-passe"
msgid "Change password"
msgstr "Alterar a palavra-passe"
msgid "Setting your default language"
msgstr "Definir o seu idioma predefinido"
msgid "A node with that name already exists."
msgstr "Já existe um nó com esse nome."
msgid "Address"
msgstr "Endereço"
msgid "New Node"
msgstr "Novo nó"
msgid "licensed."
msgstr "licenciado."
msgid "Thanks to:"
msgstr "Obrigado a:"
msgid "This VM is running and can't be renamed."
msgstr "Esta VM está a funcionar e não pode ser renomeada."
msgid "The changes will apply on next restart"
msgstr "As alterações serão aplicadas no próximo reinício"
msgid "Add"
msgstr "Adicionar"
msgid "You need a screenshot in order to copy it to the base machine."
msgstr "Precisa de uma captura do ecrã para copiá-la para a máquina base."
msgid "Copying the screenshot, please wait a moment..."
msgstr "A copiar a imagem do ecrã, por favor, espere um momento…"
msgid "You need to run the machine in order to take a screenshot."
msgstr "Precisa executar a máquina para tirar uma foto do ecrã."
msgid "Saving the screenshot, please wait a moment..."
msgstr "A gravar a captura de ecrã, por favor, espere um momento…"
msgid "Set base picture"
msgstr "Definir imagem de base"
msgid "Take screenshot"
msgstr "Capturar o ecrã"
msgid "The machine must be started to take the screenshot."
msgstr "A máquina deve estar ligada para fazer a captura de ecrã."
msgid "Remove"
msgstr "Remover"
msgid "The machine is down."
msgstr "A máquina está desligada."
msgid "Start again"
msgstr "Começar de novo"
msgid "view"
msgstr "visão"
msgid "The password for this virtual machine connection is :"
msgstr "A palavra-passe para esta conexão de máquina virtual é :"
msgid "Read more."
msgstr "Leia mais."
msgid "Portuguese"
msgstr "Português"
msgid "copied to clipboard"
msgstr "copiado para a área de transferência"
msgid "in your downloads folder."
msgstr "na sua pasta de descarregas."
msgid "If you can not see the machine screen in a few seconds check for a file called"
msgstr ""
"Se não conseguir ver o ecrã da máquina em alguns segundos, verifique se há "
"um ficheiro chamado"
msgid "Press SHIFT + F12 to exit"
msgstr "Pressione SHIFT + F12 para sair"
msgid "Change the owner of the machine"
msgstr "Mudar o proprietário da máquina"
msgid "Owner"
msgstr "Proprietário"
msgid "Volatile Clones"
msgstr "Clones voláteis"
msgid "This information will be available to the users"
msgstr "Esta informação estará disponível para os utilizadores"
msgid "Confirm Password can only contain words and numbers"
msgstr "A confirmação da palavra-passe só pode conter palavras e números"
msgid "Confirm Password must be at least 5 characters"
msgstr "A confirmação da palavra-passe deve ter pelo menos 5 caracteres"
msgid "Confirm Password can not exceed 20 characters"
msgstr "A confirmação da palavra-passe não pode exceder 20 caracteres"
msgid "Confirm Password is required"
msgstr "É necessário confirmar a palavra-passe"
msgid "Password can only contain words and numbers"