Commit 44ddf3b7eb2ed342116fea799aaa05d3b923a70e
Exists in
master
and in
31 other branches
Merge branch 'ngforward' into cleaning-the-house
Showing
16 changed files
with
89 additions
and
19 deletions
Show diff stats
bower.json
@@ -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" |
gulp/build.js
@@ -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("Components", () => { | @@ -25,13 +25,24 @@ describe("Components", () => { | ||
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 "ng-forward"; | @@ -4,12 +4,16 @@ import {Component, Inject} from "ng-forward"; | ||
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("Components", () => { | @@ -77,6 +77,12 @@ describe("Components", () => { | ||
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("Filters", () => { | @@ -5,12 +5,13 @@ describe("Filters", () => { | ||
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("noosferoApp", Main, ["ngAnimate", "ngCookies", "n | @@ -18,7 +18,7 @@ let noosferoApp: any = bundle("noosferoApp", Main, ["ngAnimate", "ngCookies", "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 | }; |