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" +}