diff --git a/lib/admin-apps-form/template.jade b/lib/admin-apps-form/template.jade
index 647b390..0b1cfab 100644
--- a/lib/admin-apps-form/template.jade
+++ b/lib/admin-apps-form/template.jade
@@ -36,6 +36,9 @@ form.panel.panel-default.form-horizontal(on-submit='save')
.col-sm-offset-2.col-sm-10
label(for='description[fr]')=t('french')
textarea.form-control(type='text' id='description[fr]' placeholder=t('app.description.fr.placeholder') value='{{ app.description.fr }}' class='{{ errors.description.fr }}')
+ .col-sm-offset-2.col-sm-10
+ label(for='description[pt]')=t('portuguese')
+ textarea.form-control(type='text' id='description[pt]' placeholder=t('app.description.pt.placeholder') value='{{ app.description.pt }}' class='{{ errors.description.pt }}')
.form-group
label.col-sm-2.control-label(for='video')=t('app.video')
.col-sm-10
diff --git a/lib/admin-apps-form/view.js b/lib/admin-apps-form/view.js
index fd75b03..8e2cbab 100644
--- a/lib/admin-apps-form/view.js
+++ b/lib/admin-apps-form/view.js
@@ -66,6 +66,14 @@ var AdminAppForm = Ractive.extend({
this.set('errors.description.fr', 'error')
ok = false;
}
+
+ if (!app.description['pt']) {
+ this.set('errors.description.pt', 'error')
+ ok = false;
+ } else if (app.description['pt'].length > 300) {
+ this.set('errors.description.pt', 'error')
+ ok = false;
+ }
return ok;
},
@@ -96,6 +104,7 @@ var AdminAppForm = Ractive.extend({
this.observeAppError('description.en');
this.observeAppError('description.es');
this.observeAppError('description.fr');
+ this.observeAppError('description.pt');
this.observeAppError('contact');
this.on('saveEditedLink', function (ev) {
diff --git a/lib/admin-countries-form/template.jade b/lib/admin-countries-form/template.jade
index de57d44..2d547bd 100644
--- a/lib/admin-countries-form/template.jade
+++ b/lib/admin-countries-form/template.jade
@@ -16,6 +16,10 @@ form.panel.panel-default.form-horizontal(on-submit='save')
label.col-sm-2.control-label(for='name[fr]')=t('french')
.col-sm-10
input.form-control(type='text' id='name[fr]' placeholder='Nom' value='{{ country.name.fr }}')
+ .form-group
+ label.col-sm-2.control-label(for='name[pt]')=t('portuguese')
+ .col-sm-10
+ input.form-control(type='text' id='name[pt]' placeholder='Nom' value='{{ country.name.pt }}')
.panel-footer
.col-sm-offset-2
button.btn.btn-success(type='submit')=t('Save')
diff --git a/lib/admin-tags-form/template.jade b/lib/admin-tags-form/template.jade
index b7586b4..c7b1e32 100644
--- a/lib/admin-tags-form/template.jade
+++ b/lib/admin-tags-form/template.jade
@@ -16,6 +16,10 @@ form.panel.panel-default.form-horizontal(on-submit='save')
label.col-sm-2.control-label(for='name[fr]')=t('french')
.col-sm-10
input.form-control(type='text' id='name[fr]' placeholder='Nom' value='{{ tag.name.fr }}')
+ .form-group
+ label.col-sm-2.control-label(for='name[pt]')=t('portuguese')
+ .col-sm-10
+ input.form-control(type='text' id='name[pt]' placeholder='Nom' value='{{ tag.name.pt }}')
.panel-footer
.col-sm-offset-2
button.btn.btn-success(type='submit')=t('Save')
diff --git a/lib/config/env.js b/lib/config/env.js
index b8a4448..6b867dd 100755
--- a/lib/config/env.js
+++ b/lib/config/env.js
@@ -31,7 +31,7 @@ module.exports = {
}
},
secret: env.SECRET,
- languages: env.LANGUAGES || [ "en", "es", "fr" ],
+ languages: env.LANGUAGES || [ "en", "es", "fr", "pt" ],
admins: {
twitter: env.TWITTER_ADMINS ? env.TWITTER_ADMINS.split(',') : undefined,
github: env.GITHUB_ADMINS ? env.GITHUB_ADMINS.split(',') : undefined
diff --git a/lib/language/index.js b/lib/language/index.js
index 10b86f4..7ede70e 100644
--- a/lib/language/index.js
+++ b/lib/language/index.js
@@ -4,7 +4,7 @@
var config = require('lib/config');
var log = require('debug')('civicstack:language');
-var languages = [ 'en', 'es', 'fr' ];
+var languages = [ 'en', 'es', 'fr', 'pt' ];
module.exports = function language(req, res, next) {
var user = req.user;
@@ -51,4 +51,4 @@ module.exports = function language(req, res, next) {
function valid(lang) {
return !!~languages.indexOf(lang);
-}
\ No newline at end of file
+}
diff --git a/lib/models/user.js b/lib/models/user.js
index 3d1fe2c..b0b9bfb 100644
--- a/lib/models/user.js
+++ b/lib/models/user.js
@@ -16,7 +16,7 @@ var UserSchema = new Schema({
firstName: { type: String }
, lastName: { type: String }
, username: { type: String }
- , lang: { type: String, enum: [ 'en', 'es', 'fr' ] }
+ , lang: { type: String, enum: [ 'en', 'es', 'fr', 'pt' ] }
, avatar: { type: String }
, email: { type: String, lowercase: true, trim: true } // main email
, profiles: {
diff --git a/lib/translations/component.json b/lib/translations/component.json
index 07c8187..41891a4 100644
--- a/lib/translations/component.json
+++ b/lib/translations/component.json
@@ -5,7 +5,8 @@
"json": [
"lib/en.json",
"lib/es.json",
- "lib/fr.json"
+ "lib/fr.json",
+ "lib/pt.json"
],
"main": "index.js"
}
diff --git a/lib/translations/index.js b/lib/translations/index.js
index 4250d17..560d92a 100644
--- a/lib/translations/index.js
+++ b/lib/translations/index.js
@@ -5,6 +5,7 @@
var en = require('./lib/en');
var es = require('./lib/es');
var fr = require('./lib/fr');
+var pt = require('./lib/pt');
module.exports.help = function(t) {
// English
@@ -15,4 +16,7 @@ module.exports.help = function(t) {
// French
t.fr = fr;
+
+ // Portuguese
+ t.pt = pt;
}
diff --git a/lib/translations/lib/en.json b/lib/translations/lib/en.json
index 0e7558a..c0acf99 100644
--- a/lib/translations/lib/en.json
+++ b/lib/translations/lib/en.json
@@ -5,6 +5,7 @@
"english": "English",
"spanish": "Spanish",
"french": "French",
+ "portuguese": "Portuguese",
"Name": "Name",
"Save": "Save",
diff --git a/lib/translations/lib/es.json b/lib/translations/lib/es.json
index d22c1e1..18de1df 100644
--- a/lib/translations/lib/es.json
+++ b/lib/translations/lib/es.json
@@ -5,6 +5,7 @@
"english": "Inglés",
"spanish": "Español",
"french": "Francés",
+ "portuguese": "Portugués",
"Name": "Nombre",
"Save": "Guardar",
diff --git a/lib/translations/lib/fr.json b/lib/translations/lib/fr.json
index 2d30334..43165c0 100644
--- a/lib/translations/lib/fr.json
+++ b/lib/translations/lib/fr.json
@@ -5,6 +5,7 @@
"english": "Anglais",
"spanish": "Espagnol",
"french": "Français",
+ "portuguese": "Portugais",
"Name": "Nom",
"Save": "Sauvegarder",
diff --git a/lib/translations/lib/pt.json b/lib/translations/lib/pt.json
new file mode 100644
index 0000000..2c69c4a
--- /dev/null
+++ b/lib/translations/lib/pt.json
@@ -0,0 +1,110 @@
+{
+ "global.app-name": "Civic Stack",
+ "global.description": "Ferramentas livres para mudança social.",
+
+ "english": "Inglês",
+ "spanish": "Espanhol",
+ "french": "Francês",
+ "portuguese": "Português",
+
+ "Name": "Nome",
+ "Save": "Salvar",
+ "Cancel": "Cancelar",
+ "Upload app": "Enviar app",
+ "No apps to show yet": "Nenhum app para mostrar ainda",
+ "and": "e",
+
+ "header.about": "Sobre nós",
+ "header.admin": "Administrador",
+ "header.login": "Entrar",
+ "header.or": "ou",
+ "header.logout": "Sair",
+
+ "admin-sidebar.applications.title": "Aplicações",
+ "admin-sidebar.tags.title": "Etiquetas",
+ "admin-sidebar.countries.title": "Países",
+ "admin-sidebar.technologies.title": "Tecnologias",
+ "admin-sidebar.licenses.title": "Licenças",
+ "admin.list.new": "Novo",
+ "admin.list.search.placeholder": "Pesquisar",
+ "admin.tags.save.success": "Etiqueta foi salva com sucesso",
+ "admin.app.save.success": "App foi salva com sucesso",
+ "admin.countries.save.success": "País foi salvo com sucesso",
+ "admin.technologies.save.success": "Tecnologia foi salva com sucesso",
+ "admin.licenses.save.success": "Licença foi salva com sucesso",
+
+ "confirmation.title": "Excluir",
+ "confirmation.ok": "Ok",
+ "confirmation.cancel": "Cancelar",
+ "admin-licenses-form.confirmation.body": "Você tem certeza de que quer excluir a licença \"{name}\"?",
+ "admin-apps-form.confirmation.body": "Você tem certeza de que quer excluir a aplicação \"{name}\"?",
+ "admin-tags-form.confirmation.body": "Você tem certeza de que quer excluir a etiqueta \"{name}\"?",
+ "admin-countries-form.confirmation.body": "Você tem certeza de que quer excluir o país \"{name}\"?",
+ "admin-technologies-form.confirmation.body": "Você tem certeza de que quer excluir a tecnologia \"{name}\"?",
+
+ "about.what-is-it.title": "O que é Civic Stack?",
+ "about.what-is-it.text": "Civic Stack é o lugar para descobrir e compartilhar ferramentas cívicas de código aberto para que você possa adaptá-las para diferentes cenários.",
+ "about.goal.title": "Qual é o nosso objetivo?",
+ "about.goal.1": "Prover acesso fácil a ferramentas cívicas digitais a organizações, ativistas, governos para que possam inovar em seu trabalho diário.",
+ "about.goal.2": "Promover o trabalho de organizações que desenvolvem tecnologias de código aberto com propósitos cívicos.",
+ "about.goal.3": "Encorajar colaboração e reúso, em vez de \"reinventar a roda\" todas as vezes.",
+ "about.what-information-is-available.title": "Quais informações aparecem na Civic Stack?",
+ "about.what-information-is-available.text": "Na Civic Stack você encontrará informações úteis sobre cada ferramenta: objetivos, escopo, sua origem, seu repositório do GitHub, os desenvolvedores.
Organizações podem entrar e enviar suas próprias ferramentas.
Na Civic Stack, todas as ferramentas que você encontra —e todas as ferramentas que você encontrará— são de código aberto.",
+
+ "panel.heading.error": "Erro",
+ "panel.body.error": "Um erro aconteceu, tente novamente mais tarde",
+ "panel.heading.success": "Sucesso",
+
+ "app-form.header.cover": "Capa",
+ "app-form.header.content": "Conteúdo",
+ "app-form.header.publish": "Publicar",
+ "app-form.cover.logo-title": "Logo",
+ "app-form.cover.logo-instructions": "Somente links para urls online, certifique-se de que é um caminho público.
Tamanho: pelo menos 000 x 000 px.",
+ "app-form.cover.background-instructions": "Por favor escolha uma cor de fundo:",
+ "app-form.name.placeholder": "Nome",
+ "app-form.button.continue": "Continuar",
+ "app-form.button.cancel": "Cancelar",
+ "app-form.button.done": "Pronto",
+ "app-form.button.edit": "Editar",
+ "app-form.new-app": "Nova aplicação",
+ "app-form.modal.title": "Ótimo!",
+ "app-form.modal.body": "Sua aplicação foi enviada com sucesso e aparecerá em breve!",
+
+ "app.logo": "Logo",
+ "app.backgroundColor": "Cor de fundo",
+ "app.name": "Nome da aplicação",
+ "app.organization-name": "Nome da organização",
+ "app.description": "Descrição",
+ "app.description.placeholder": "Descrição (máximo de 300 caracteres)",
+ "app.video": "Vídeo",
+ "app.video.placeholder": "A URL do YouTube para a capa do vídeo",
+ "app.country": "País",
+ "app.website": "Website",
+ "app.twitter": "Twitter",
+ "app.license": "Licença",
+ "app.links": "Links relacionados",
+ "app.contact": "Contato",
+ "app.contact.placeholder": "E-mail do contato",
+ "app.technology": "Tecnologia",
+ "app.github-repository": "Repositório no Github",
+ "app.tags": "Etiquetas",
+ "app.approved": "Aprovada",
+ "app.description.en": "Descrição em inglês",
+ "app.description.en.placeholder": "Descrição em inglês (máximo de 300 caracteres)",
+ "app.description.es.placeholder": "Descrição em espanhol (máximo de 300 caracteres)",
+ "app.description.fr.placeholder": "Descrição em francês (máximo de 300 caracteres)",
+ "app.comments": "Comentários",
+ "app.uploaded-by": "Enviado por",
+ "app.description.exceeded": "A descrição é limitada a 300 caracteres",
+
+ "filters.search": "Pesquisar",
+ "filters.clear": "Limpar tudo",
+ "filters.country": "Filtrar por país",
+ "filters.technology": "Filtrar por tecnologia",
+ "filters.tags": "Filtrar por etiquetas",
+
+ "sort.by.popular": "Populares",
+ "sort.by.newest": "Novas",
+
+ "footer.powered-by": "Impulsionado por"
+}