Commit 44ddf3b7eb2ed342116fea799aaa05d3b923a70e

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

Merge branch 'ngforward' into cleaning-the-house

bower.json
... ... @@ -20,7 +20,7 @@
20 20 "font-awesome": "fontawesome#~4.5.0",
21 21 "ngstorage": "~0.3.10",
22 22 "bootswatch": "~3.3.6",
23   - "angular-moment": "~0.10.3",
  23 + "angular-moment": "~1.0.0-beta.4",
24 24 "lodash": "3.10.1",
25 25 "angular-filter": "~0.5.8",
26 26 "angular-deckgrid": "~0.5.0",
... ... @@ -32,7 +32,8 @@
32 32 "angular-translate-loader-static-files": "^2.10.0",
33 33 "angular-translate-handler-log": "^2.10.0",
34 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 38 "devDependencies": {
38 39 "angular-mocks": "~1.5.0"
... ...
gulp/build.js
... ... @@ -45,6 +45,9 @@ gulp.task('html', ['inject', 'partials'], function () {
45 45 .pipe($.rev())
46 46 .pipe(jsFilter)
47 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 51 .pipe($.sourcemaps.init())
49 52 .pipe($.ngAnnotate())
50 53 .pipe($.uglify({ preserveComments: $.uglifySaveLicense })).on('error', conf.errorHandler('Uglify'))
... ... @@ -81,6 +84,14 @@ gulp.task('fonts', function () {
81 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 95 gulp.task('other', function () {
85 96 var fileFilter = $.filter(function (file) {
86 97 return file.stat.isFile();
... ... @@ -98,4 +109,4 @@ gulp.task('clean', function () {
98 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 1 <div class="modal-header">
2   - <h3 class="modal-title">Login</h3>
  2 + <h3 class="modal-title">{{"auth.title" | translate}}</h3>
3 3 </div>
4 4 <div class="modal-body">
5 5 <form>
6 6 <div class="form-group">
7   - <label for="exampleInputEmail1">Login / Email address</label>
  7 + <label for="exampleInputEmail1">{{"auth.form.login" | translate}}</label>
8 8 <input type="text" class="form-control" id="exampleInputEmail1" placeholder="Login / Email" ng-model="vm.credentials.username">
9 9 </div>
10 10 <div class="form-group">
11   - <label for="exampleInputPassword1">Password</label>
  11 + <label for="exampleInputPassword1">{{"auth.form.password" | translate}}</label>
12 12 <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" ng-model="vm.credentials.password">
13 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 15 </form>
16 16 </div>
... ...
src/app/components/language-selector/language-selector.component.spec.ts
... ... @@ -25,13 +25,24 @@ describe(&quot;Components&quot;, () =&gt; {
25 25 }),
26 26 provide('tmhDynamicLocale', {
27 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 35 ].concat(helpers.provideFilters("translateFilter"))
30 36 })
31 37 class BlockContainerComponent { }
32 38  
33 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 46 component.availableLanguages = null;
36 47 expect(component.availableLanguages).toBeNull();
37 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 4 selector: "language-selector",
5 5 templateUrl: "app/components/language-selector/language-selector.html"
6 6 })
7   -@Inject("$translate", "tmhDynamicLocale")
  7 +@Inject("$translate", "tmhDynamicLocale", "amMoment", "angularLoad")
8 8 export class LanguageSelector {
9 9  
10 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 17 this.changeLanguage(tmhDynamicLocale.get() || $translate.use());
14 18 }
15 19  
... ... @@ -18,6 +22,7 @@ export class LanguageSelector {
18 22 }
19 23  
20 24 changeLanguage(language: string) {
  25 + this.changeMomentLocale(language);
21 26 this.tmhDynamicLocale.set(language);
22 27 this.$translate.use(language).then((lang) => {
23 28 this.availableLanguages = {
... ... @@ -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 2 <div class="container-fluid">
3 3 <div class="navbar-header">
4 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 6 <span class="icon-bar"></span>
7 7 <span class="icon-bar"></span>
8 8 <span class="icon-bar"></span>
... ...
src/app/components/navbar/navbar.spec.ts
... ... @@ -77,6 +77,12 @@ describe(&quot;Components&quot;, () =&gt; {
77 77 }),
78 78 provide('tmhDynamicLocale', {
79 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 87 ].concat(helpers.provideFilters("translateFilter")),
82 88 directives: [Navbar],
... ...
src/app/components/noosfero-activities/activity/new_friendship.html
... ... @@ -5,7 +5,7 @@
5 5 <timeline-heading>
6 6 <h4 class="timeline-title">
7 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 9 <span class="comma-separated">
10 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 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 5 describe("Date Format Filter", () => {
6 6  
7 7 beforeEach(angular.mock.module("templates"));
  8 + beforeEach(angular.mock.module("angularMoment"));
8 9  
9 10 it("convert date from the format returned by noosfero api to an ISO format", done => {
10 11 let date = "2016/03/10 10:46:47";
11 12 let htmlTemplate = `{{ '${date}' | dateFormat }}`;
12 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 15 done();
15 16 });
16 17 });
... ...
src/app/components/noosfero/date-format/date-format.filter.ts
1 1 import {Pipe, Inject} from "ng-forward";
2 2  
3 3 @Pipe("dateFormat")
  4 +@Inject("amParseFilter")
4 5 export class DateFormat {
5 6  
  7 + constructor(private amParseFilter: any) { }
  8 +
6 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 1 <ul class="nav navbar-nav">
2 2 <li ng-show="vm.profile">
3 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 5 </a>
6 6 </li>
7 7 </ul>
... ...
src/app/index.config.ts
... ... @@ -32,7 +32,6 @@ function configTranslation($translateProvider: angular.translate.ITranslateProvi
32 32 $translateProvider.useMissingTranslationHandlerLog();
33 33 $translateProvider.preferredLanguage('en');
34 34 $translateProvider.useSanitizeValueStrategy('escape');
35   - //FIXME fix location pattern
36 35 tmhDynamicLocaleProvider.localeLocationPattern('bower_components/angular-i18n/angular-locale_{{locale}}.js');
37 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 18 "ui.router", "ui.bootstrap", "toastr",
19 19 "angularMoment", "angular.filter", "akoenig.deckgrid",
20 20 "angular-timeline", "duScroll", "oitozero.ngSweetAlert",
21   - "pascalprecht.translate", "tmh.dynamicLocale"]).publish();
  21 + "pascalprecht.translate", "tmh.dynamicLocale", "angularLoad"]).publish();
22 22  
23 23 NoosferoApp.angularModule = noosferoApp;
24 24  
... ...
src/languages/en.json
... ... @@ -5,10 +5,17 @@
5 5 "navbar.settings": "Settings",
6 6 "navbar.logout": "Log Out",
7 7 "navbar.login": "Login",
  8 + "navbar.toggle_menu": "Toggle navigation",
8 9 "language.en": "English",
9 10 "language.pt": "Portuguese",
10 11 "language.selector": "Language",
11 12 "profile.wall": "Profile Wall",
12 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 5 "navbar.settings": "Configurações",
6 6 "navbar.logout": "Sair",
7 7 "navbar.login": "Login",
  8 + "navbar.toggle_menu": "Abrir Menu",
8 9 "language.en": "Inglês",
9 10 "language.pt": "Português",
10 11 "language.selector": "Idioma",
11 12 "profile.wall": "Mural do Perfil",
12 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 54 tmhDynamicLocale: {
55 55 get: () => { },
56 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 };
... ...