Commit 44ddf3b7eb2ed342116fea799aaa05d3b923a70e

Authored by ABNER SILVA DE OLIVEIRA
2 parents 525113a3 833e19f2

Merge branch 'ngforward' into cleaning-the-house

@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 "font-awesome": "fontawesome#~4.5.0", 20 "font-awesome": "fontawesome#~4.5.0",
21 "ngstorage": "~0.3.10", 21 "ngstorage": "~0.3.10",
22 "bootswatch": "~3.3.6", 22 "bootswatch": "~3.3.6",
23 - "angular-moment": "~0.10.3", 23 + "angular-moment": "~1.0.0-beta.4",
24 "lodash": "3.10.1", 24 "lodash": "3.10.1",
25 "angular-filter": "~0.5.8", 25 "angular-filter": "~0.5.8",
26 "angular-deckgrid": "~0.5.0", 26 "angular-deckgrid": "~0.5.0",
@@ -32,7 +32,8 @@ @@ -32,7 +32,8 @@
32 "angular-translate-loader-static-files": "^2.10.0", 32 "angular-translate-loader-static-files": "^2.10.0",
33 "angular-translate-handler-log": "^2.10.0", 33 "angular-translate-handler-log": "^2.10.0",
34 "angular-dynamic-locale": "^0.1.30", 34 "angular-dynamic-locale": "^0.1.30",
35 - "angular-i18n": "^1.5.0" 35 + "angular-i18n": "^1.5.0",
  36 + "angular-load": "^0.4.1"
36 }, 37 },
37 "devDependencies": { 38 "devDependencies": {
38 "angular-mocks": "~1.5.0" 39 "angular-mocks": "~1.5.0"
@@ -45,6 +45,9 @@ gulp.task('html', ['inject', 'partials'], function () { @@ -45,6 +45,9 @@ gulp.task('html', ['inject', 'partials'], function () {
45 .pipe($.rev()) 45 .pipe($.rev())
46 .pipe(jsFilter) 46 .pipe(jsFilter)
47 .pipe($.replace('assets/images/', noosferoThemePrefix + 'assets/images/')) 47 .pipe($.replace('assets/images/', noosferoThemePrefix + 'assets/images/'))
  48 + .pipe($.replace('/languages/', noosferoThemePrefix + 'languages/'))
  49 + .pipe($.replace('bower_components/angular-i18n/', noosferoThemePrefix + 'locale/angular-i18n/'))
  50 + .pipe($.replace('bower_components/moment/', noosferoThemePrefix + 'locale/moment/'))
48 .pipe($.sourcemaps.init()) 51 .pipe($.sourcemaps.init())
49 .pipe($.ngAnnotate()) 52 .pipe($.ngAnnotate())
50 .pipe($.uglify({ preserveComments: $.uglifySaveLicense })).on('error', conf.errorHandler('Uglify')) 53 .pipe($.uglify({ preserveComments: $.uglifySaveLicense })).on('error', conf.errorHandler('Uglify'))
@@ -81,6 +84,14 @@ gulp.task('fonts', function () { @@ -81,6 +84,14 @@ gulp.task('fonts', function () {
81 .pipe(gulp.dest(path.join(conf.paths.dist, '/fonts/'))); 84 .pipe(gulp.dest(path.join(conf.paths.dist, '/fonts/')));
82 }); 85 });
83 86
  87 +gulp.task('locale', function () {
  88 + return gulp.src([
  89 + path.join("bower_components/angular-i18n", '*.js'),
  90 + path.join("bower_components/moment/locale", '*.js'),
  91 + ], {base: 'bower_components/'})
  92 + .pipe(gulp.dest(path.join(conf.paths.dist, '/locale/')));
  93 +});
  94 +
84 gulp.task('other', function () { 95 gulp.task('other', function () {
85 var fileFilter = $.filter(function (file) { 96 var fileFilter = $.filter(function (file) {
86 return file.stat.isFile(); 97 return file.stat.isFile();
@@ -98,4 +109,4 @@ gulp.task('clean', function () { @@ -98,4 +109,4 @@ gulp.task('clean', function () {
98 return $.del([path.join(conf.paths.dist, '/'), path.join(conf.paths.tmp, '/')]); 109 return $.del([path.join(conf.paths.dist, '/'), path.join(conf.paths.tmp, '/')]);
99 }); 110 });
100 111
101 -gulp.task('build', ['html', 'fonts', 'other']); 112 +gulp.task('build', ['html', 'fonts', 'other', 'locale']);
src/app/components/auth/login.html
1 <div class="modal-header"> 1 <div class="modal-header">
2 - <h3 class="modal-title">Login</h3> 2 + <h3 class="modal-title">{{"auth.title" | translate}}</h3>
3 </div> 3 </div>
4 <div class="modal-body"> 4 <div class="modal-body">
5 <form> 5 <form>
6 <div class="form-group"> 6 <div class="form-group">
7 - <label for="exampleInputEmail1">Login / Email address</label> 7 + <label for="exampleInputEmail1">{{"auth.form.login" | translate}}</label>
8 <input type="text" class="form-control" id="exampleInputEmail1" placeholder="Login / Email" ng-model="vm.credentials.username"> 8 <input type="text" class="form-control" id="exampleInputEmail1" placeholder="Login / Email" ng-model="vm.credentials.username">
9 </div> 9 </div>
10 <div class="form-group"> 10 <div class="form-group">
11 - <label for="exampleInputPassword1">Password</label> 11 + <label for="exampleInputPassword1">{{"auth.form.password" | translate}}</label>
12 <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" ng-model="vm.credentials.password"> 12 <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" ng-model="vm.credentials.password">
13 </div> 13 </div>
14 - <button type="submit" class="btn btn-default" ng-click="vm.login()">Login</button> 14 + <button type="submit" class="btn btn-default" ng-click="vm.login()">{{"auth.form.login_button" | translate}}</button>
15 </form> 15 </form>
16 </div> 16 </div>
src/app/components/language-selector/language-selector.component.spec.ts
@@ -25,13 +25,24 @@ describe(&quot;Components&quot;, () =&gt; { @@ -25,13 +25,24 @@ describe(&quot;Components&quot;, () =&gt; {
25 }), 25 }),
26 provide('tmhDynamicLocale', { 26 provide('tmhDynamicLocale', {
27 useValue: helpers.mocks.tmhDynamicLocale 27 useValue: helpers.mocks.tmhDynamicLocale
  28 + }),
  29 + provide('amMoment', {
  30 + useValue: helpers.mocks.amMoment
  31 + }),
  32 + provide('angularLoad', {
  33 + useValue: helpers.mocks.angularLoad
28 }) 34 })
29 ].concat(helpers.provideFilters("translateFilter")) 35 ].concat(helpers.provideFilters("translateFilter"))
30 }) 36 })
31 class BlockContainerComponent { } 37 class BlockContainerComponent { }
32 38
33 it("set available languages when change language", () => { 39 it("set available languages when change language", () => {
34 - let component: LanguageSelector = new LanguageSelector(<any>helpers.mocks.$translate, <any>helpers.mocks.tmhDynamicLocale); 40 + let component: LanguageSelector = new LanguageSelector(
  41 + <any>helpers.mocks.$translate,
  42 + <any>helpers.mocks.tmhDynamicLocale,
  43 + <any>helpers.mocks.amMoment,
  44 + <any>helpers.mocks.angularLoad
  45 + );
35 component.availableLanguages = null; 46 component.availableLanguages = null;
36 expect(component.availableLanguages).toBeNull(); 47 expect(component.availableLanguages).toBeNull();
37 component.changeLanguage('en'); 48 component.changeLanguage('en');
src/app/components/language-selector/language-selector.component.ts
@@ -4,12 +4,16 @@ import {Component, Inject} from &quot;ng-forward&quot;; @@ -4,12 +4,16 @@ import {Component, Inject} from &quot;ng-forward&quot;;
4 selector: "language-selector", 4 selector: "language-selector",
5 templateUrl: "app/components/language-selector/language-selector.html" 5 templateUrl: "app/components/language-selector/language-selector.html"
6 }) 6 })
7 -@Inject("$translate", "tmhDynamicLocale") 7 +@Inject("$translate", "tmhDynamicLocale", "amMoment", "angularLoad")
8 export class LanguageSelector { 8 export class LanguageSelector {
9 9
10 availableLanguages: any; 10 availableLanguages: any;
11 11
12 - constructor(private $translate: angular.translate.ITranslateService, private tmhDynamicLocale: any) { 12 + constructor(private $translate: angular.translate.ITranslateService,
  13 + private tmhDynamicLocale: any,
  14 + private amMoment: any,
  15 + private angularLoad: any) {
  16 +
13 this.changeLanguage(tmhDynamicLocale.get() || $translate.use()); 17 this.changeLanguage(tmhDynamicLocale.get() || $translate.use());
14 } 18 }
15 19
@@ -18,6 +22,7 @@ export class LanguageSelector { @@ -18,6 +22,7 @@ export class LanguageSelector {
18 } 22 }
19 23
20 changeLanguage(language: string) { 24 changeLanguage(language: string) {
  25 + this.changeMomentLocale(language);
21 this.tmhDynamicLocale.set(language); 26 this.tmhDynamicLocale.set(language);
22 this.$translate.use(language).then((lang) => { 27 this.$translate.use(language).then((lang) => {
23 this.availableLanguages = { 28 this.availableLanguages = {
@@ -27,4 +32,13 @@ export class LanguageSelector { @@ -27,4 +32,13 @@ export class LanguageSelector {
27 }); 32 });
28 } 33 }
29 34
  35 + private changeMomentLocale(language: string) {
  36 + let localePromise = Promise.resolve();
  37 + if (language != "en") {
  38 + localePromise = this.angularLoad.loadScript(`/bower_components/moment/locale/${language}.js`);
  39 + }
  40 + localePromise.then(() => {
  41 + this.amMoment.changeLocale(language);
  42 + });
  43 + }
30 } 44 }
src/app/components/navbar/navbar.html
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <div class="container-fluid"> 2 <div class="container-fluid">
3 <div class="navbar-header"> 3 <div class="navbar-header">
4 <button type="button" class="navbar-toggle collapsed" ng-click="isCollapsed = !isCollapsed"> 4 <button type="button" class="navbar-toggle collapsed" ng-click="isCollapsed = !isCollapsed">
5 - <span class="sr-only">Toggle navigation</span> 5 + <span class="sr-only">{{"navbar.toggle_menu" | translate}}</span>
6 <span class="icon-bar"></span> 6 <span class="icon-bar"></span>
7 <span class="icon-bar"></span> 7 <span class="icon-bar"></span>
8 <span class="icon-bar"></span> 8 <span class="icon-bar"></span>
src/app/components/navbar/navbar.spec.ts
@@ -77,6 +77,12 @@ describe(&quot;Components&quot;, () =&gt; { @@ -77,6 +77,12 @@ describe(&quot;Components&quot;, () =&gt; {
77 }), 77 }),
78 provide('tmhDynamicLocale', { 78 provide('tmhDynamicLocale', {
79 useValue: helpers.mocks.tmhDynamicLocale 79 useValue: helpers.mocks.tmhDynamicLocale
  80 + }),
  81 + provide('amMoment', {
  82 + useValue: helpers.mocks.amMoment
  83 + }),
  84 + provide('angularLoad', {
  85 + useValue: helpers.mocks.angularLoad
80 }) 86 })
81 ].concat(helpers.provideFilters("translateFilter")), 87 ].concat(helpers.provideFilters("translateFilter")),
82 directives: [Navbar], 88 directives: [Navbar],
src/app/components/noosfero-activities/activity/new_friendship.html
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <timeline-heading> 5 <timeline-heading>
6 <h4 class="timeline-title"> 6 <h4 class="timeline-title">
7 <a ui-sref="main.profile.info({profile: ctrl.activity.user.identifier})"><strong ng-bind="ctrl.activity.user.name"></strong></a> 7 <a ui-sref="main.profile.info({profile: ctrl.activity.user.identifier})"><strong ng-bind="ctrl.activity.user.name"></strong></a>
8 - <span> has made <span ng-bind="ctrl.activity.params.friend_name.length"></span> new friend(s): </span> 8 + <span> {{"activities.new_friendship.description" | translate:{friends: ctrl.activity.params.friend_name.length} }} </span>
9 <span class="comma-separated"> 9 <span class="comma-separated">
10 <a class="separated-item" ui-sref="main.profile.info({profile: ctrl.activity.params.friend_url[$index].profile})" ng-repeat="friend in ctrl.activity.params.friend_name"> 10 <a class="separated-item" ui-sref="main.profile.info({profile: ctrl.activity.params.friend_url[$index].profile})" ng-repeat="friend in ctrl.activity.params.friend_name">
11 <strong ng-bind="friend"></strong> 11 <strong ng-bind="friend"></strong>
src/app/components/noosfero/date-format/date-format.filter.spec.ts
@@ -5,12 +5,13 @@ describe(&quot;Filters&quot;, () =&gt; { @@ -5,12 +5,13 @@ describe(&quot;Filters&quot;, () =&gt; {
5 describe("Date Format Filter", () => { 5 describe("Date Format Filter", () => {
6 6
7 beforeEach(angular.mock.module("templates")); 7 beforeEach(angular.mock.module("templates"));
  8 + beforeEach(angular.mock.module("angularMoment"));
8 9
9 it("convert date from the format returned by noosfero api to an ISO format", done => { 10 it("convert date from the format returned by noosfero api to an ISO format", done => {
10 let date = "2016/03/10 10:46:47"; 11 let date = "2016/03/10 10:46:47";
11 let htmlTemplate = `{{ '${date}' | dateFormat }}`; 12 let htmlTemplate = `{{ '${date}' | dateFormat }}`;
12 quickCreateComponent({ providers: [DateFormat], template: htmlTemplate }).then(fixture => { 13 quickCreateComponent({ providers: [DateFormat], template: htmlTemplate }).then(fixture => {
13 - expect(fixture.debugElement.text()).toEqual('"2016-03-10T13:46:47.000Z"'); 14 + expect(fixture.debugElement.text()).toEqual('2016-03-10T13:46:47.000Z');
14 done(); 15 done();
15 }); 16 });
16 }); 17 });
src/app/components/noosfero/date-format/date-format.filter.ts
1 import {Pipe, Inject} from "ng-forward"; 1 import {Pipe, Inject} from "ng-forward";
2 2
3 @Pipe("dateFormat") 3 @Pipe("dateFormat")
  4 +@Inject("amParseFilter")
4 export class DateFormat { 5 export class DateFormat {
5 6
  7 + constructor(private amParseFilter: any) { }
  8 +
6 transform(date: string, options: any) { 9 transform(date: string, options: any) {
7 - return moment(date, "YYYY/MM/DD HH:mm:ss"); 10 + return this.amParseFilter(date, "YYYY/MM/DD HH:mm:ss").toISOString();
8 } 11 }
9 12
10 } 13 }
src/app/content-viewer/navbar-actions.html
1 <ul class="nav navbar-nav"> 1 <ul class="nav navbar-nav">
2 <li ng-show="vm.profile"> 2 <li ng-show="vm.profile">
3 <a href="#" role="button" ui-sref="main.profile.cms({profile: vm.profile.identifier})"> 3 <a href="#" role="button" ui-sref="main.profile.cms({profile: vm.profile.identifier})">
4 - <i class="fa fa-file fa-fw fa-lg"></i> New Post 4 + <i class="fa fa-file fa-fw fa-lg"></i> {{"navbar.content_viewer_actions.new_post" | translate}}
5 </a> 5 </a>
6 </li> 6 </li>
7 </ul> 7 </ul>
src/app/index.config.ts
@@ -32,7 +32,6 @@ function configTranslation($translateProvider: angular.translate.ITranslateProvi @@ -32,7 +32,6 @@ function configTranslation($translateProvider: angular.translate.ITranslateProvi
32 $translateProvider.useMissingTranslationHandlerLog(); 32 $translateProvider.useMissingTranslationHandlerLog();
33 $translateProvider.preferredLanguage('en'); 33 $translateProvider.preferredLanguage('en');
34 $translateProvider.useSanitizeValueStrategy('escape'); 34 $translateProvider.useSanitizeValueStrategy('escape');
35 - //FIXME fix location pattern  
36 tmhDynamicLocaleProvider.localeLocationPattern('bower_components/angular-i18n/angular-locale_{{locale}}.js'); 35 tmhDynamicLocaleProvider.localeLocationPattern('bower_components/angular-i18n/angular-locale_{{locale}}.js');
37 tmhDynamicLocaleProvider.useCookieStorage(); 36 tmhDynamicLocaleProvider.useCookieStorage();
38 } 37 }
src/app/index.ts
@@ -18,7 +18,7 @@ let noosferoApp: any = bundle(&quot;noosferoApp&quot;, Main, [&quot;ngAnimate&quot;, &quot;ngCookies&quot;, &quot;n @@ -18,7 +18,7 @@ let noosferoApp: any = bundle(&quot;noosferoApp&quot;, Main, [&quot;ngAnimate&quot;, &quot;ngCookies&quot;, &quot;n
18 "ui.router", "ui.bootstrap", "toastr", 18 "ui.router", "ui.bootstrap", "toastr",
19 "angularMoment", "angular.filter", "akoenig.deckgrid", 19 "angularMoment", "angular.filter", "akoenig.deckgrid",
20 "angular-timeline", "duScroll", "oitozero.ngSweetAlert", 20 "angular-timeline", "duScroll", "oitozero.ngSweetAlert",
21 - "pascalprecht.translate", "tmh.dynamicLocale"]).publish(); 21 + "pascalprecht.translate", "tmh.dynamicLocale", "angularLoad"]).publish();
22 22
23 NoosferoApp.angularModule = noosferoApp; 23 NoosferoApp.angularModule = noosferoApp;
24 24
src/languages/en.json
@@ -5,10 +5,17 @@ @@ -5,10 +5,17 @@
5 "navbar.settings": "Settings", 5 "navbar.settings": "Settings",
6 "navbar.logout": "Log Out", 6 "navbar.logout": "Log Out",
7 "navbar.login": "Login", 7 "navbar.login": "Login",
  8 + "navbar.toggle_menu": "Toggle navigation",
8 "language.en": "English", 9 "language.en": "English",
9 "language.pt": "Portuguese", 10 "language.pt": "Portuguese",
10 "language.selector": "Language", 11 "language.selector": "Language",
11 "profile.wall": "Profile Wall", 12 "profile.wall": "Profile Wall",
12 "activities.create_article.description": "has published on", 13 "activities.create_article.description": "has published on",
13 - "activities.add_member_in_community.description": "has joined the community" 14 + "activities.add_member_in_community.description": "has joined the community",
  15 + "activities.new_friendship.description": "has made {{friends}} new friend(s):",
  16 + "auth.title": "Login",
  17 + "auth.form.login": "Login / Email address",
  18 + "auth.form.password": "Password",
  19 + "auth.form.login_button": "Login",
  20 + "navbar.content_viewer_actions.new_post": "New Post"
14 } 21 }
src/languages/pt.json
@@ -5,10 +5,17 @@ @@ -5,10 +5,17 @@
5 "navbar.settings": "Configurações", 5 "navbar.settings": "Configurações",
6 "navbar.logout": "Sair", 6 "navbar.logout": "Sair",
7 "navbar.login": "Login", 7 "navbar.login": "Login",
  8 + "navbar.toggle_menu": "Abrir Menu",
8 "language.en": "Inglês", 9 "language.en": "Inglês",
9 "language.pt": "Português", 10 "language.pt": "Português",
10 "language.selector": "Idioma", 11 "language.selector": "Idioma",
11 "profile.wall": "Mural do Perfil", 12 "profile.wall": "Mural do Perfil",
12 "activities.create_article.description": "publicou em", 13 "activities.create_article.description": "publicou em",
13 - "activities.add_member_in_community.description": "entrou na comunidade" 14 + "activities.add_member_in_community.description": "entrou na comunidade",
  15 + "activities.new_friendship.description": "fez {{friends}} novo(s) amigo(s):",
  16 + "auth.title": "Login",
  17 + "auth.form.login": "Login / Email",
  18 + "auth.form.password": "Senha",
  19 + "auth.form.login_button": "Login",
  20 + "navbar.content_viewer_actions.new_post": "Novo Artigo"
14 } 21 }
src/spec/mocks.ts
@@ -54,5 +54,15 @@ export var mocks = { @@ -54,5 +54,15 @@ export var mocks = {
54 tmhDynamicLocale: { 54 tmhDynamicLocale: {
55 get: () => { }, 55 get: () => { },
56 set: (lang: string) => { } 56 set: (lang: string) => { }
  57 + },
  58 + amMoment: {
  59 + changeLocale: () => { }
  60 + },
  61 + angularLoad: {
  62 + loadScript: (script?: string) => {
  63 + return {
  64 + then: (func?: any) => { if (func) func() }
  65 + }
  66 + }
57 } 67 }
58 }; 68 };