diff --git a/app/coffee/app.coffee b/app/coffee/app.coffee
index 6858425d..a0140849 100644
--- a/app/coffee/app.coffee
+++ b/app/coffee/app.coffee
@@ -36,7 +36,7 @@ taiga.generateUniqueSessionIdentifier = ->
taiga.sessionId = taiga.generateUniqueSessionIdentifier()
-configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider, tgLoaderProvider, $compileProvider) ->
+configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider, tgLoaderProvider, $compileProvider, $translateProvider) ->
$routeProvider.when("/",
{templateUrl: "project/projects.html", resolve: {loader: tgLoaderProvider.add()}})
@@ -236,23 +236,33 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEven
$compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false)
-init = ($log, $i18n, $config, $rootscope, $auth, $events, $analytics) ->
- $i18n.initialize($config.get("defaultLanguage"))
+ $translateProvider.useStaticFilesLoader({
+ prefix: '/locales/locale-',
+ suffix: '.json'
+ })
+
+ $translateProvider.preferredLanguage('en')
+
+init = ($log, $config, $rootscope, $auth, $events, $analytics, $translate) ->
$log.debug("Initialize application")
$rootscope.contribPlugins = @.taigaContribPlugins
if $auth.isAuthenticated()
$events.setupConnection()
+ user = $auth.getUser()
+
+ $translate.use(user.lang) if user.lang
+
$analytics.initialize()
+
modules = [
# Main Global Modules
"taigaBase",
"taigaCommon",
"taigaResources",
- "taigaLocales",
"taigaAuth",
"taigaEvents",
@@ -281,6 +291,7 @@ modules = [
# Vendor modules
"ngRoute",
"ngAnimate",
+ "pascalprecht.translate"
].concat(_.map(@.taigaContribPlugins, (plugin) -> plugin.module))
# Main module definition
@@ -294,16 +305,17 @@ module.config([
"$tgEventsProvider",
"tgLoaderProvider",
"$compileProvider",
+ "$translateProvider",
configure
])
module.run([
"$log",
- "$tgI18n",
"$tgConfig",
"$rootScope",
"$tgAuth",
"$tgEvents",
"$tgAnalytics",
+ "$translate"
init
])
diff --git a/app/coffee/modules/admin/lightboxes.coffee b/app/coffee/modules/admin/lightboxes.coffee
index a900273c..a12e4b52 100644
--- a/app/coffee/modules/admin/lightboxes.coffee
+++ b/app/coffee/modules/admin/lightboxes.coffee
@@ -30,10 +30,10 @@ MAX_MEMBERSHIP_FIELDSETS = 4
## Create Members Lightbox Directive
#############################################################################
-CreateMembersDirective = ($rs, $rootScope, $confirm, $loading ,lightboxService) ->
+CreateMembersDirective = ($rs, $rootScope, $confirm, $loading ,lightboxService, $compile) ->
extraTextTemplate = """
@@ -42,7 +42,7 @@ CreateMembersDirective = ($rs, $rootScope, $confirm, $loading ,lightboxService)
template = _.template("""
- """) # i18n
+ """)
link = ($scope, $el, $attrs) ->
createFieldSet = (required = true)->
ctx = {roleList: $scope.roles, required: required}
- return template(ctx)
+ return $compile(template(ctx))($scope)
resetForm = ->
$el.find("form textarea").remove("")
$el.find("form .add-member-wrapper").remove()
invitations = $el.find(".add-member-forms")
- invitations.html(extraTextTemplate)
+ invitations.html($compile(extraTextTemplate)($scope))
fieldSet = createFieldSet()
invitations.prepend(fieldSet)
@@ -155,5 +155,5 @@ CreateMembersDirective = ($rs, $rootScope, $confirm, $loading ,lightboxService)
return {link: link}
-module.directive("tgLbCreateMembers", ["$tgResources", "$rootScope", "$tgConfirm", "$tgLoading", "lightboxService",
+module.directive("tgLbCreateMembers", ["$tgResources", "$rootScope", "$tgConfirm", "$tgLoading", "lightboxService", "$compile",
CreateMembersDirective])
diff --git a/app/coffee/modules/admin/memberships.coffee b/app/coffee/modules/admin/memberships.coffee
index 574e38de..424f5b83 100644
--- a/app/coffee/modules/admin/memberships.coffee
+++ b/app/coffee/modules/admin/memberships.coffee
@@ -50,7 +50,6 @@ class MembershipsController extends mixOf(taiga.Controller, taiga.PageMixin, tai
@location, @navUrls, @analytics, @appTitle) ->
bindMethods(@)
- @scope.sectionName = "Manage Members" #i18n
@scope.project = {}
@scope.filters = {}
@@ -338,32 +337,31 @@ module.directive("tgMembershipsRowRoleSelector", ["$log", "$tgRepo", "$tgConfirm
## Member Actions Directive
#############################################################################
-MembershipsRowActionsDirective = ($log, $repo, $rs, $confirm) ->
- activedTemplate = _.template("""
-
- Active
+MembershipsRowActionsDirective = ($log, $repo, $rs, $confirm, $compile, $translate) ->
+ activedTemplate = """
+
- """) # TODO: i18n
+ """
- pendingTemplate = _.template("""
+ pendingTemplate = """
- Pending
+ {{'ADMIN.MEMBERSHIP.STATUS_PENDING' | translate}}
-
+
- """) # TODO: i18n
+ """
link = ($scope, $el, $attrs) ->
render = (member) ->
if member.user
- html = activedTemplate()
+ html = $compile(activedTemplate)($scope)
else
- html = pendingTemplate()
+ html = $compile(pendingTemplate)($scope)
$el.html(html)
@@ -377,29 +375,34 @@ MembershipsRowActionsDirective = ($log, $repo, $rs, $confirm) ->
$el.on "click", ".pending", (event) ->
event.preventDefault()
onSuccess = ->
- # TODO: i18n
- $confirm.notify("success", "We've sent the invitationi again to '#{$scope.member.email}'.")
+ text = $translate.instant("ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION", {email: $scope.member.email})
+ $confirm.notify("success", text)
onError = ->
- $confirm.notify("error", "We haven't sent the invitation.") # TODO: i18n
+ text = $translate.instant("ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION")
+ $confirm.notify("error", text)
$rs.memberships.resendInvitation($scope.member.id).then(onSuccess, onError)
$el.on "click", ".delete", (event) ->
event.preventDefault()
- title = "Delete member" # TODO: i18n
- message = if member.user then member.full_name else "the invitation to #{member.email}" # TODO: i18n
+ title = $translate.instant("ADMIN.MEMBERSHIP.DELETE_MEMBER")
+ defaultMsg = $translate.instant("ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE")
+ message = if member.user then member.full_name else defaultMsg
$confirm.askOnDelete(title, message).then (finish) ->
onSuccess = ->
finish()
$ctrl.loadMembers()
- $confirm.notify("success", null, "We've deleted #{message}.") # TODO: i18n
+
+ text = $translate.instant("ADMIN.MEMBERSHIP.SUCCESS_DELETE")
+ $confirm.notify("success", null, text)
onError = ->
finish(false)
- # TODO: i18in
- $confirm.notify("error", null, "We have not been able to delete #{message}.")
+
+ text = $translate.instant("ADMIN.MEMBERSHIP.ERROR_DELETE", {message: message})
+ $confirm.notify("error", null, text)
$repo.remove(member).then(onSuccess, onError)
@@ -409,5 +412,4 @@ MembershipsRowActionsDirective = ($log, $repo, $rs, $confirm) ->
return {link: link}
-module.directive("tgMembershipsRowActions", ["$log", "$tgRepo", "$tgResources", "$tgConfirm",
- MembershipsRowActionsDirective])
+module.directive("tgMembershipsRowActions", ["$log", "$tgRepo", "$tgResources", "$tgConfirm", "$compile", "$translate", MembershipsRowActionsDirective])
diff --git a/app/coffee/modules/admin/project-profile.coffee b/app/coffee/modules/admin/project-profile.coffee
index 8e109cd6..d94df7b1 100644
--- a/app/coffee/modules/admin/project-profile.coffee
+++ b/app/coffee/modules/admin/project-profile.coffee
@@ -47,21 +47,26 @@ class ProjectProfileController extends mixOf(taiga.Controller, taiga.PageMixin)
"$q",
"$tgLocation",
"$tgNavUrls",
- "$appTitle"
+ "$appTitle",
+ "$translate"
]
- constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @appTitle) ->
+ constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @appTitle, @translate) ->
@scope.project = {}
promise = @.loadInitialData()
promise.then =>
- @appTitle.set("Project profile - " + @scope.sectionName + " - " + @scope.project.name)
+ sectionName = @translate.instant( @scope.sectionName)
+ appTitle = @translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE", {sectionName: sectionName, projectName: @scope.project.name})
+ @appTitle.set(appTitle)
promise.then null, @.onInitialDataError.bind(@)
@scope.$on "project:loaded", =>
- @appTitle.set("Project profile - " + @scope.sectionName + " - " + @scope.project.name)
+ sectionName = @translate.instant( @scope.sectionName)
+ appTitle = @translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE", {sectionName: sectionName, projectName: @scope.project.name})
+ @appTitle.set(appTitle)
loadProject: ->
return @rs.projects.get(@scope.projectId).then (project) =>
@@ -217,7 +222,7 @@ module.directive("tgProjectModules", ["$tgRepo", "$tgConfirm", "$tgLoading", Pro
## Project Export Directive
#############################################################################
-ProjectExportDirective = ($window, $rs, $confirm) ->
+ProjectExportDirective = ($window, $rs, $confirm, $translate) ->
link = ($scope, $el, $attrs) ->
buttonsEl = $el.find(".admin-project-export-buttons")
showButtons = -> buttonsEl.removeClass("hidden")
@@ -232,16 +237,22 @@ ProjectExportDirective = ($window, $rs, $confirm) ->
hideSpinner = -> spinnerEl.addClass("hidden")
resultTitleEl = $el.find(".result-title")
- setLoadingTitle = -> resultTitleEl.html("We are generating your dump file") # TODO: i18n
- setAsyncTitle = -> resultTitleEl.html("We are generating your dump file") # TODO: i18n
- setSyncTitle = -> resultTitleEl.html("Your dump file is ready!") # TODO: i18n
+
+
+ loading_title = $translate.instant("ADMIN.PROJECT_EXPORT.LOADING_TITLE")
+ loading_msg = $translate.instant("ADMIN.PROJECT_EXPORT.LOADING_MESSAGE")
+ dump_ready_text = -> resultTitleEl.html("ADMIN.PROJECT_EXPORT.DUMP_READY")
+ asyn_message = -> resultTitleEl.html("ADMIN.PROJECT_EXPORT.ASYN_MESSAGE")
+ syn_message = -> resultTitleEl.html("ADMIN.PROJECT_EXPORT.SYNC_MESSAGE", {url: url})
+
+ setLoadingTitle = -> resultTitleEl.html(loading_text)
+ setAsyncTitle = -> resultTitleEl.html(loading_text)
+ setSyncTitle = -> resultTitleEl.html(dump_ready_text)
resultMessageEl = $el.find(".result-message ")
- setLoadingMessage = -> resultMessageEl.html("Please don't close this page.") # TODO: i18n
- setAsyncMessage = -> resultMessageEl.html("We will send you an email when ready.") # TODO: i18n
- setSyncMessage = (url) -> resultMessageEl.html("If the download doesn't start automatically click
-
here.") # TODO: i18n
+ setLoadingMessage = -> resultMessageEl.html(loading_msg)
+ setAsyncMessage = -> resultMessageEl.html(asyn_message)
+ setSyncMessage = (url) -> resultMessageEl.html(syn_message)
showLoadingMode = ->
showSpinner()
@@ -279,15 +290,12 @@ ProjectExportDirective = ($window, $rs, $confirm) ->
onError = (result) =>
showErrorMode()
- errorMsg = "Our oompa loompas have some problems generasting your dump.
- Please try again. " # TODO: i18n
+ errorMsg = $translate.instant("ADMIN.PROJECT_PROFILE.ERROR")
if result.status == 429 # TOO MANY REQUESTS
- errorMsg = "Sorry, our oompa loompas are very busy right now.
- Please try again in a few minutes. " # TODO: i18n
+ errorMsg = $translate.instant("ADMIN.PROJECT_PROFILE.ERROR_BUSY")
else if result.data?._error_message
- errorMsg = "Our oompa loompas have some problems generasting your dump:
- #{result.data._error_message}" # TODO: i18n
+ errorMsg = $translate.instant("ADMIN.PROJECT_PROFILE.ERROR_BUSY", {message: result.data._error_message})
$confirm.notify("error", errorMsg)
@@ -296,7 +304,7 @@ ProjectExportDirective = ($window, $rs, $confirm) ->
return {link:link}
-module.directive("tgProjectExport", ["$window", "$tgResources", "$tgConfirm", ProjectExportDirective])
+module.directive("tgProjectExport", ["$window", "$tgResources", "$tgConfirm", "$translate", ProjectExportDirective])
#############################################################################
@@ -310,9 +318,10 @@ class CsvExporterController extends taiga.Controller
"$tgUrls",
"$tgConfirm",
"$tgResources",
+ "$translate"
]
- constructor: (@scope, @rootscope, @urls, @confirm, @rs) ->
+ constructor: (@scope, @rootscope, @urls, @confirm, @rs, @translate) ->
@rootscope.$on("project:loaded", @.setCsvUuid)
@scope.$watch "csvUuid", (value) =>
if value
@@ -337,10 +346,10 @@ class CsvExporterController extends taiga.Controller
return promise
regenerateUuid: ->
- #TODO: i18n
if @scope.csvUuid
- title = "Change URL"
- subtitle = "You going to change the CSV data access url. The previous url will be disabled. Are you sure?"
+ title = @translate.instant("ADMIN.REPORTS.REGENERATE_TITLE")
+ subtitle = @translate.instant("ADMIN.REPORTS.REGENERATE_SUBTITLE")
+
@confirm.ask(title, subtitle).then @._generateUuid
else
@._generateUuid(_.identity)
@@ -361,3 +370,48 @@ class CsvExporterIssuesController extends CsvExporterController
module.controller("CsvExporterUserstoriesController", CsvExporterUserstoriesController)
module.controller("CsvExporterTasksController", CsvExporterTasksController)
module.controller("CsvExporterIssuesController", CsvExporterIssuesController)
+
+
+
+#############################################################################
+## CSV Directive
+#############################################################################
+
+CsvUsDirective = () ->
+ link = ($scope) ->
+ $scope.csvType = "US"
+
+ return {
+ controller: "CsvExporterUserstoriesController",
+ templateUrl: "admin/project-csv.html",
+ link: link,
+ scope: true
+ }
+
+module.directive("tgCsvUs", [CsvUsDirective])
+
+CsvTaskDirective = () ->
+ link = ($scope) ->
+ $scope.csvType = "Task"
+
+ return {
+ controller: "CsvExporterTasksController",
+ templateUrl: "admin/project-csv.html",
+ link: link,
+ scope: true
+ }
+
+module.directive("tgCsvTask", [CsvTaskDirective])
+
+CsvIssueDirective = () ->
+ link = ($scope) ->
+ $scope.csvType = "Issues"
+
+ return {
+ controller: "CsvExporterIssuesController",
+ templateUrl: "admin/project-csv.html",
+ link: link,
+ scope: true
+ }
+
+module.directive("tgCsvIssue", [CsvIssueDirective])
diff --git a/app/coffee/modules/admin/project-values.coffee b/app/coffee/modules/admin/project-values.coffee
index 35390de9..400cac3f 100644
--- a/app/coffee/modules/admin/project-values.coffee
+++ b/app/coffee/modules/admin/project-values.coffee
@@ -46,16 +46,24 @@ class ProjectValuesSectionController extends mixOf(taiga.Controller, taiga.PageM
"$q",
"$tgLocation",
"$tgNavUrls",
- "$appTitle"
+ "$appTitle",
+ "$translate"
]
- constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @appTitle) ->
+ constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @appTitle, @translate) ->
@scope.project = {}
promise = @.loadInitialData()
promise.then () =>
- @appTitle.set("Project values - " + @scope.sectionName + " - " + @scope.project.name)
+ sectionName = @translate.instant(@scope.sectionName)
+
+ title = @translate.instant("ADMIN.PROJECT_VALUES.APP_TITLE", {
+ "sectionName": sectionName,
+ "projectName": @scope.project.name
+ })
+
+ @appTitle.set(title)
promise.then null, @.onInitialDataError.bind(@)
@@ -275,14 +283,12 @@ ProjectValuesDirective = ($log, $repo, $confirm, $location, animationFrame) ->
if value.id != option.id
choices[option.id] = option.name
- #TODO: i18n
- title = "Delete value"
subtitle = value.name
- replacement = "All items with this value will be changed to"
- if _.keys(choices).length == 0
- return $confirm.error("You can't delete all values.")
- return $confirm.askChoice(title, subtitle, choices, replacement).then (response) ->
+ if _.keys(choices).length == 0
+ return $confirm.error("ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL")
+
+ $confirm.askChoice("PROJECT.TITLE_ACTION_DELETE_VALUE", subtitle, choices, "ADMIN.PROJECT_VALUES.REPLACEMENT").then (response) ->
onSucces = ->
$ctrl.loadValues().finally ->
response.finish()
@@ -299,8 +305,7 @@ ProjectValuesDirective = ($log, $repo, $confirm, $location, animationFrame) ->
return {link:link}
-module.directive("tgProjectValues", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", "animationFrame",
- ProjectValuesDirective])
+module.directive("tgProjectValues", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", "animationFrame", ProjectValuesDirective])
#############################################################################
@@ -601,11 +606,9 @@ ProjectCustomAttributesDirective = ($log, $confirm, animationFrame) ->
deleteCustomAttribute = (formEl) ->
attr = formEl.scope().attr
-
- title = "Delete custom attribute" # i18n
- subtitle = "Remeber that all values in this custom field will be deleted. Are you sure you want to continue?"
message = attr.name
- $confirm.ask(title, subtitle, message).then (finish) ->
+
+ $confirm.ask("COMMON.CUSTOM_ATTRIBUTES.DELETE", "COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE", message).then (finish) ->
onSucces = ->
$ctrl.loadCustomAttributes().finally ->
finish()
diff --git a/app/coffee/modules/admin/roles.coffee b/app/coffee/modules/admin/roles.coffee
index ff47fca8..53bf9ca7 100644
--- a/app/coffee/modules/admin/roles.coffee
+++ b/app/coffee/modules/admin/roles.coffee
@@ -44,20 +44,22 @@ class RolesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fil
"$q",
"$tgLocation",
"$tgNavUrls",
- "$appTitle"
+ "$appTitle",
+ "$translate"
]
- constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @appTitle) ->
+ constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @appTitle, @translate) ->
bindMethods(@)
- @scope.sectionName = "Permissions" #i18n
+ @scope.sectionName = "ADMIN.MENU.PERMISSIONS"
@scope.project = {}
@scope.anyComputableRole = true
promise = @.loadInitialData()
promise.then () =>
- @appTitle.set("Roles - " + @scope.project.name)
+ title = @translate.instant("ADMIN.ROLES.SECTION_NAME", {projectName: @scope.project.name})
+ @appTitle.set(title)
promise.then null, @.onInitialDataError.bind(@)
@@ -65,7 +67,7 @@ class RolesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fil
return @rs.projects.get(@scope.projectId).then (project) =>
if not project.i_am_owner
@location.path(@navUrls.resolve("permission-denied"))
-
+
@scope.project = project
@scope.$emit('project:loaded', project)
@@ -112,11 +114,7 @@ class RolesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fil
@scope.$broadcast("role:changed", @scope.role)
delete: ->
- # TODO: i18n
- title = "Delete Role" # TODO: i18n
subtitle = @scope.role.name
- replacement = "All the users with this role will be moved to" # TODO: i18n
- warning = "Be careful, all role estimations will be removed" # TODO: i18n
choices = {}
for role in @scope.roles
@@ -124,9 +122,9 @@ class RolesController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fil
choices[role.id] = role.name
if _.keys(choices).length == 0
- return @confirm.error("You can't delete all values.") # TODO: i18n
+ return @confirm.error(@translate.instant("ADMIN.ROLES.ERROR_DELETE_ALL"))
- return @confirm.askChoice(title, subtitle, choices, replacement, warning).then (response) =>
+ return @confirm.askChoice(@translate.instant("ADMIN.ROLES.TITLE_DELETE_ROLE"), subtitle, choices, @translate.instant("ADMIN.ROLES.REPLACEMENT_ROLE"), @translate.instant("ADMIN.ROLES.WARNING_DELETE_ROLE")).then (response) =>
promise = @repo.remove(@scope.role, {moveTo: response.selected})
promise.then =>
@.loadProject()
diff --git a/app/coffee/modules/admin/third-parties.coffee b/app/coffee/modules/admin/third-parties.coffee
index ceeaaf2f..8e56cec4 100644
--- a/app/coffee/modules/admin/third-parties.coffee
+++ b/app/coffee/modules/admin/third-parties.coffee
@@ -40,19 +40,21 @@ class WebhooksController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.
"$routeParams",
"$tgLocation",
"$tgNavUrls",
- "$appTitle"
+ "$appTitle",
+ "$translate"
]
- constructor: (@scope, @repo, @rs, @params, @location, @navUrls, @appTitle) ->
+ constructor: (@scope, @repo, @rs, @params, @location, @navUrls, @appTitle, @translate) ->
bindMethods(@)
- @scope.sectionName = "Webhooks" #i18n
+ @scope.sectionName = "ADMIN.WEBHOOKS.SECTION_NAME"
@scope.project = {}
promise = @.loadInitialData()
promise.then () =>
- @appTitle.set("Webhooks - " + @scope.project.name)
+ text = @translate.instant("ADMIN.WEBHOOKS.APP_TITLE", {"projectName": @scope.project.name})
+ @appTitle.set(text)
promise.then null, @.onInitialDataError.bind(@)
@@ -85,17 +87,19 @@ module.controller("WebhooksController", WebhooksController)
## Webhook Directive
#############################################################################
-WebhookDirective = ($rs, $repo, $confirm, $loading) ->
+WebhookDirective = ($rs, $repo, $confirm, $loading, $translate) ->
link = ($scope, $el, $attrs) ->
webhook = $scope.$eval($attrs.tgWebhook)
updateLogs = () ->
+ prettyDate = $translate.instant("ADMIN.WEBHOOKS.DATE")
+
$rs.webhooklogs.list(webhook.id).then (webhooklogs) =>
for log in webhooklogs
log.validStatus = 200 <= log.status < 300
log.prettySentHeaders = _.map(_.pairs(log.request_headers), ([header, value]) -> "#{header}: #{value}").join("\n")
log.prettySentData = JSON.stringify(log.request_data)
- log.prettyDate = moment(log.created).format("DD MMM YYYY [at] hh:mm:ss") # TODO: i18n
+ log.prettyDate = moment(log.created).format(prettyDate)
webhook.logs_counter = webhooklogs.length
webhook.logs = webhooklogs
@@ -105,9 +109,11 @@ WebhookDirective = ($rs, $repo, $confirm, $loading) ->
textElement = $el.find(".toggle-history")
historyElement = textElement.parents(".single-webhook-wrapper").find(".webhooks-history")
if historyElement.hasClass("open")
- textElement.text("(Hide history)") # TODO: i18n
+ text = $translate.instant("ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY")
+ textElement.text(text)
else
- textElement.text("(Show history)") # TODO: i18n
+ text = $translate.instant("ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY")
+ textElement.text(text)
showVisualizationMode = () ->
$el.find(".edition-mode").addClass("hidden")
@@ -161,8 +167,8 @@ WebhookDirective = ($rs, $repo, $confirm, $loading) ->
cancel(target)
$el.on "click", ".delete-webhook", () ->
- title = "Delete webhook" #TODO: i18n
- message = "Webhook '#{webhook.name}'" #TODO: i18n
+ title = $translate.instant("ADMIN.WEBHOOKS.DELETE")
+ message = $translate.instant("ADMIN.WEBHOOKS.WEBHOOK_NAME", {name: webhook.name})
$confirm.askOnDelete(title, message).then (finish) =>
onSucces = ->
@@ -203,7 +209,7 @@ WebhookDirective = ($rs, $repo, $confirm, $loading) ->
return {link:link}
-module.directive("tgWebhook", ["$tgResources", "$tgRepo", "$tgConfirm", "$tgLoading", WebhookDirective])
+module.directive("tgWebhook", ["$tgResources", "$tgRepo", "$tgConfirm", "$tgLoading", "$translate", WebhookDirective])
#############################################################################
@@ -279,19 +285,21 @@ class GithubController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
"$tgRepo",
"$tgResources",
"$routeParams",
- "$appTitle"
+ "$appTitle",
+ "$translate"
]
- constructor: (@scope, @repo, @rs, @params, @appTitle) ->
+ constructor: (@scope, @repo, @rs, @params, @appTitle, @translate) ->
bindMethods(@)
- @scope.sectionName = "Github" #i18n
+ @scope.sectionName = @translate.instant("ADMIN.GITHUB.SECTION_NAME")
@scope.project = {}
promise = @.loadInitialData()
promise.then () =>
- @appTitle.set("Github - " + @scope.project.name)
+ title = @translate.instant("ADMIN.GITHUB.APP_TITLE", {projectName: @scope.project.name})
+ @appTitle.set(title)
promise.then null, @.onInitialDataError.bind(@)
@@ -327,18 +335,20 @@ class GitlabController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi
"$tgRepo",
"$tgResources",
"$routeParams",
- "$appTitle"
+ "$appTitle",
+ "$translate"
]
- constructor: (@scope, @repo, @rs, @params, @appTitle) ->
+ constructor: (@scope, @repo, @rs, @params, @appTitle, @translate) ->
bindMethods(@)
- @scope.sectionName = "Gitlab" #i18n
+ @scope.sectionName = @translate.instant("ADMIN.GITLAB.SECTION_NAME")
@scope.project = {}
promise = @.loadInitialData()
promise.then () =>
- @appTitle.set("Gitlab - " + @scope.project.name)
+ title = @translate.instant("ADMIN.GITLAB.APP_TITLE", {projectName: @scope.project.name})
+ @appTitle.set(title)
promise.then null, @.onInitialDataError.bind(@)
@@ -377,18 +387,20 @@ class BitbucketController extends mixOf(taiga.Controller, taiga.PageMixin, taiga
"$tgRepo",
"$tgResources",
"$routeParams",
- "$appTitle"
+ "$appTitle",
+ "$translate"
]
- constructor: (@scope, @repo, @rs, @params, @appTitle) ->
+ constructor: (@scope, @repo, @rs, @params, @appTitle, @translate) ->
bindMethods(@)
- @scope.sectionName = "Bitbucket" #i18n
+ @scope.sectionName = @translate.instant("ADMIN.BITBUCKET.SECTION_NAME")
@scope.project = {}
promise = @.loadInitialData()
promise.then () =>
- @appTitle.set("Bitbucket - " + @scope.project.name)
+ title = @translate.instant("ADMIN.BITBUCKET.APP_TITLE", {projectName: @scope.project.name})
+ @appTitle.set(title)
promise.then null, @.onInitialDataError.bind(@)
diff --git a/app/coffee/modules/auth.coffee b/app/coffee/modules/auth.coffee
index 856488ef..70d4c4ab 100644
--- a/app/coffee/modules/auth.coffee
+++ b/app/coffee/modules/auth.coffee
@@ -53,7 +53,6 @@ class AuthService extends taiga.Service
setUser: (user) ->
@rootscope.auth = user
- @rootscope.$broadcast("i18n:change", user.default_language)
@storage.set("userInfo", user.getAttrs())
@rootscope.user = user
@@ -171,7 +170,7 @@ PublicRegisterMessageDirective = ($config, $navUrls, templates) ->
module.directive("tgPublicRegisterMessage", ["$tgConfig", "$tgNavUrls", "$tgTemplate", PublicRegisterMessageDirective])
-LoginDirective = ($auth, $confirm, $location, $config, $routeParams, $navUrls, $events) ->
+LoginDirective = ($auth, $confirm, $location, $config, $routeParams, $navUrls, $events, $translate) ->
link = ($scope, $el, $attrs) ->
onSuccess = (response) ->
if $routeParams['next'] and $routeParams['next'] != $navUrls.resolve("login")
@@ -183,8 +182,8 @@ LoginDirective = ($auth, $confirm, $location, $config, $routeParams, $navUrls, $
$location.path(nextUrl)
onError = (response) ->
- $confirm.notify("light-error", "According to our Oompa Loompas, your username/email
- or password are incorrect.") #TODO: i18n
+ $confirm.notify("light-error", $translate.instant("LOGIN_FORM.ERROR_AUTH_INCORRECT"))
+
submit = debounce 2000, (event) =>
event.preventDefault()
@@ -207,13 +206,13 @@ LoginDirective = ($auth, $confirm, $location, $config, $routeParams, $navUrls, $
return {link:link}
module.directive("tgLogin", ["$tgAuth", "$tgConfirm", "$tgLocation", "$tgConfig", "$routeParams",
- "$tgNavUrls", "$tgEvents", LoginDirective])
+ "$tgNavUrls", "$tgEvents", "$translate", LoginDirective])
#############################################################################
## Register Directive
#############################################################################
-RegisterDirective = ($auth, $confirm, $location, $navUrls, $config, $analytics) ->
+RegisterDirective = ($auth, $confirm, $location, $navUrls, $config, $analytics, $translate) ->
link = ($scope, $el, $attrs) ->
if not $config.get("publicRegisterEnabled")
$location.path($navUrls.resolve("not-found"))
@@ -224,12 +223,15 @@ RegisterDirective = ($auth, $confirm, $location, $navUrls, $config, $analytics)
onSuccessSubmit = (response) ->
$analytics.trackEvent("auth", "register", "user registration", 1)
- $confirm.notify("success", "Our Oompa Loompas are happy, welcome to Taiga.") #TODO: i18n
+
+ $confirm.notify("success", $translate.instant("LOGIN_FORM.SUCCESS"))
+
$location.path($navUrls.resolve("home"))
onErrorSubmit = (response) ->
if response.data._error_message?
- $confirm.notify("light-error", "According to our Oompa Loompas there was an error. #{response.data._error_message}") #TODO: i18n
+ text = $translate.instant("LOGIN_FORM.ERROR_GENERIC") + " " + response.data._error_message
+ $confirm.notify("light-error", text + " " + response.data._error_message)
form.setErrors(response.data)
@@ -247,27 +249,27 @@ RegisterDirective = ($auth, $confirm, $location, $navUrls, $config, $analytics)
return {link:link}
module.directive("tgRegister", ["$tgAuth", "$tgConfirm", "$tgLocation", "$tgNavUrls", "$tgConfig",
- "$tgAnalytics", RegisterDirective])
+ "$tgAnalytics", "$translate", RegisterDirective])
#############################################################################
## Forgot Password Directive
#############################################################################
-ForgotPasswordDirective = ($auth, $confirm, $location, $navUrls) ->
+ForgotPasswordDirective = ($auth, $confirm, $location, $navUrls, $translate) ->
link = ($scope, $el, $attrs) ->
$scope.data = {}
form = $el.find("form").checksley()
onSuccessSubmit = (response) ->
$location.path($navUrls.resolve("login"))
- $confirm.success("Check your inbox!
- We have sent a mail to
- #{response.data.email}
- with the instructions to set a new password") #TODO: i18n
+
+ text = $translate.instant("FORGOT_PASSWORD_FORM.SUCCESS", {email: response.data.email})
+ $confirm.success(text)
onErrorSubmit = (response) ->
- $confirm.notify("light-error", "According to our Oompa Loompas,
- your are not registered yet.") #TODO: i18n
+ text = $translate.instant("FORGOT_PASSWORD_FORM.ERROR")
+
+ $confirm.notify("light-error", text)
submit = debounce 2000, (event) =>
event.preventDefault()
@@ -282,14 +284,14 @@ ForgotPasswordDirective = ($auth, $confirm, $location, $navUrls) ->
return {link:link}
-module.directive("tgForgotPassword", ["$tgAuth", "$tgConfirm", "$tgLocation", "$tgNavUrls",
+module.directive("tgForgotPassword", ["$tgAuth", "$tgConfirm", "$tgLocation", "$tgNavUrls", "$translate",
ForgotPasswordDirective])
#############################################################################
## Change Password from Recovery Directive
#############################################################################
-ChangePasswordFromRecoveryDirective = ($auth, $confirm, $location, $params, $navUrls) ->
+ChangePasswordFromRecoveryDirective = ($auth, $confirm, $location, $params, $navUrls, $translate) ->
link = ($scope, $el, $attrs) ->
$scope.data = {}
@@ -303,12 +305,15 @@ ChangePasswordFromRecoveryDirective = ($auth, $confirm, $location, $params, $nav
onSuccessSubmit = (response) ->
$location.path($navUrls.resolve("login"))
- $confirm.success("Our Oompa Loompas saved your new password.
- Try to sign in with it.") #TODO: i18n
+
+ text = $translate.instant("CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS")
+
+ $confirm.success(text)
onErrorSubmit = (response) ->
- $confirm.notify("light-error", "One of our Oompa Loompas say
- '#{response.data._error_message}'.") #TODO: i18n
+ text = $translate.instant("COMMON.GENERIC_ERROR", {error: response.data._error_message})
+
+ $confirm.notify("light-error", text)
submit = debounce 2000, (event) =>
event.preventDefault()
@@ -324,13 +329,13 @@ ChangePasswordFromRecoveryDirective = ($auth, $confirm, $location, $params, $nav
return {link:link}
module.directive("tgChangePasswordFromRecovery", ["$tgAuth", "$tgConfirm", "$tgLocation", "$routeParams",
- "$tgNavUrls", ChangePasswordFromRecoveryDirective])
+ "$tgNavUrls", "$translate", ChangePasswordFromRecoveryDirective])
#############################################################################
## Invitation
#############################################################################
-InvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics) ->
+InvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics, $translate) ->
link = ($scope, $el, $attrs) ->
token = $params.token
@@ -340,8 +345,9 @@ InvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics
promise.then null, (response) ->
$location.path($navUrls.resolve("login"))
- $confirm.success("Ooops, we have a problem
- Our Oompa Loompas can't find your invitation.") #TODO: i18n
+
+ text = $translate.instant("INVITATION_LOGIN_FORM.NOT_FOUND")
+ $confirm.success(text)
# Login form
$scope.dataLogin = {token: token}
@@ -350,12 +356,14 @@ InvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics
onSuccessSubmitLogin = (response) ->
$analytics.trackEvent("auth", "invitationAccept", "invitation accept with existing user", 1)
$location.path($navUrls.resolve("project", {project: $scope.invitation.project_slug}))
- $confirm.notify("success", "You've successfully joined this project",
- "Welcome to #{_.escape($scope.invitation.project_name)}")
+ text = $translate.instant("INVITATION_LOGIN_FORM.SUCCESS", {"project_name": $scope.invitation.project_name})
+
+ $confirm.notify("success", text)
onErrorSubmitLogin = (response) ->
- $confirm.notify("light-error", "According to our Oompa Loompas, your are not registered yet or
- typed an invalid password.") #TODO: i18n
+ text = $translate.instant("INVITATION_LOGIN_FORM.ERROR")
+
+ $confirm.notify("light-error", text)
submitLogin = debounce 2000, (event) =>
event.preventDefault()
@@ -380,8 +388,9 @@ InvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics
"Welcome to #{_.escape($scope.invitation.project_name)}")
onErrorSubmitRegister = (response) ->
- $confirm.notify("light-error", "According to our Oompa Loompas, that
- username or email is already in use.") #TODO: i18n
+ text = $translate.instant("LOGIN_FORM.ERROR_AUTH_INCORRECT")
+
+ $confirm.notify("light-error", text)
submitRegister = debounce 2000, (event) =>
event.preventDefault()
@@ -398,13 +407,13 @@ InvitationDirective = ($auth, $confirm, $location, $params, $navUrls, $analytics
return {link:link}
module.directive("tgInvitation", ["$tgAuth", "$tgConfirm", "$tgLocation", "$routeParams",
- "$tgNavUrls", "$tgAnalytics", InvitationDirective])
+ "$tgNavUrls", "$tgAnalytics", "$translate", InvitationDirective])
#############################################################################
## Change Email
#############################################################################
-ChangeEmailDirective = ($repo, $model, $auth, $confirm, $location, $params, $navUrls) ->
+ChangeEmailDirective = ($repo, $model, $auth, $confirm, $location, $params, $navUrls, $translate) ->
link = ($scope, $el, $attrs) ->
$scope.data = {}
$scope.data.email_token = $params.email_token
@@ -414,11 +423,14 @@ ChangeEmailDirective = ($repo, $model, $auth, $confirm, $location, $params, $nav
$repo.queryOne("users", $auth.getUser().id).then (data) =>
$auth.setUser(data)
$location.path($navUrls.resolve("home"))
- $confirm.success("Our Oompa Loompas updated your email") #TODO: i18n
+
+ text = $translate.instant("CHANGE_EMAIL_FORM.SUCCESS")
+ $confirm.success(text)
onErrorSubmit = (response) ->
- $confirm.notify("error", "One of our Oompa Loompas says
- '#{response.data._error_message}'.") #TODO: i18n
+ text = $translate.instant("COMMON.GENERIC_ERROR", {error: response.data._error_message})
+
+ $confirm.notify("light-error", text)
submit = ->
if not form.validate()
@@ -438,7 +450,7 @@ ChangeEmailDirective = ($repo, $model, $auth, $confirm, $location, $params, $nav
return {link:link}
module.directive("tgChangeEmail", ["$tgRepo", "$tgModel", "$tgAuth", "$tgConfirm", "$tgLocation", "$routeParams",
- "$tgNavUrls", ChangeEmailDirective])
+ "$tgNavUrls", "$translate", ChangeEmailDirective])
#############################################################################
## Cancel account
@@ -453,11 +465,15 @@ CancelAccountDirective = ($repo, $model, $auth, $confirm, $location, $params, $n
onSuccessSubmit = (response) ->
$auth.logout()
$location.path($navUrls.resolve("home"))
- $confirm.success("Our Oompa Loompas removed your account") #TODO: i18n
+
+ text = $translate.instant("CANCEL_ACCOUNT.SUCCESS")
+
+ $confirm.success(text)
onErrorSubmit = (response) ->
- $confirm.notify("error", "One of our Oompa Loompas says
- '#{response.data._error_message}'.") #TODO: i18n
+ text = $translate.instant("COMMON.GENERIC_ERROR", {error: response.data._error_message})
+
+ $confirm.notify("error", text)
submit = debounce 2000, (event) =>
event.preventDefault()
diff --git a/app/coffee/modules/backlog/lightboxes.coffee b/app/coffee/modules/backlog/lightboxes.coffee
index d77ac2ee..d5b60f48 100644
--- a/app/coffee/modules/backlog/lightboxes.coffee
+++ b/app/coffee/modules/backlog/lightboxes.coffee
@@ -29,7 +29,7 @@ module = angular.module("taigaBacklog")
## Creare/Edit Sprint Lightbox Directive
#############################################################################
-CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading) ->
+CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, $translate) ->
link = ($scope, $el, attrs) ->
hasErrors = false
createSprint = true
@@ -86,8 +86,7 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading)
$confirm.notify("light-error", data.__all__[0])
remove = ->
- #TODO: i18n
- title = "Delete sprint"
+ title = $translate.instant("LIGHTBOX.DELETE_SPRINT.TITLE")
message = $scope.sprint.name
$confirm.askOnDelete(title, message).then (finish) =>
@@ -129,11 +128,17 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading)
lastSprintNameDom = $el.find(".last-sprint-name")
if lastSprint?.name?
- lastSprintNameDom.html(" last sprint is #{lastSprint.name} ;-) ")
+ text = $translate.instant("LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME", {"lastSprint": lastSprint.name})
+ lastSprintNameDom.html(text)
$el.find(".delete-sprint").addClass("hidden")
- $el.find(".title").text("New sprint") #TODO i18n
- $el.find(".button-green").text("Create") #TODO i18n
+
+ text = $translate.instant("LIGHTBOX.ADD_EDIT_SPRINT.TITLE")
+ $el.find(".title").text(text)
+
+ text = $translate.instant("COMMON.CREATE")
+ $el.find(".button-green").text(text)
+
lightboxService.open($el)
$el.find(".sprint-name").focus()
$el.find(".last-sprint-name").removeClass("disappear")
@@ -146,8 +151,13 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading)
$scope.sprint.estimated_finish = moment($scope.sprint.estimated_finish).format("DD MMM YYYY")
$el.find(".delete-sprint").removeClass("hidden")
- $el.find(".title").text("Edit sprint") #TODO i18n
- $el.find(".button-green").text("Save") #TODO i18n
+
+ editSprint = $translate.instant("BACKLOG.EDIT_SPRINT")
+ $el.find(".title").text(editSprint)
+
+ save = $translate.instant("COMMON.SAVE")
+ $el.find(".button-green").text(save)
+
lightboxService.open($el)
$el.find(".sprint-name").focus().select()
$el.find(".last-sprint-name").addClass("disappear")
@@ -178,6 +188,7 @@ module.directive("tgLbCreateEditSprint", [
"$tgResources",
"$rootScope",
"lightboxService"
- "$tgLoading"
+ "$tgLoading",
+ "$translate",
CreateEditSprint
])
diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee
index ff354ea2..2dcf2362 100644
--- a/app/coffee/modules/backlog/main.coffee
+++ b/app/coffee/modules/backlog/main.coffee
@@ -49,11 +49,12 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
"$tgNavUrls",
"$tgEvents",
"$tgAnalytics",
- "tgLoader"
+ "tgLoader",
+ "$translate"
]
constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q,
- @location, @appTitle, @navUrls, @events, @analytics, tgLoader) ->
+ @location, @appTitle, @navUrls, @events, @analytics, tgLoader, @translate) ->
bindMethods(@)
@scope.sectionName = "Backlog"
@@ -509,8 +510,8 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
@rootscope.$broadcast("usform:edit", us)
deleteUserStory: (us) ->
- #TODO: i18n
- title = "Delete User Story"
+ title = @translate.instant("US.TITLE_DELETE_ACTION")
+
message = us.subject
@confirm.askOnDelete(title, message).then (finish) =>
@@ -541,12 +542,11 @@ module.controller("BacklogController", BacklogController)
## Backlog Directive
#############################################################################
-BacklogDirective = ($repo, $rootscope) ->
+BacklogDirective = ($repo, $rootscope, $translate) ->
## Doom line Link
doomLineTemplate = _.template("""
- Project Scope [Doomline]
+ <%- text %>
""")
- # TODO: i18n
linkDoomLine = ($scope, $el, $attrs, $ctrl) ->
reloadDoomLine = ->
@@ -573,7 +573,8 @@ BacklogDirective = ($repo, $rootscope) ->
$el.find(".doom-line").remove()
addDoomLineDom = (element) ->
- $(element).before(doomLineTemplate({}))
+ text = $translate.instant("BACKLOG.DOOMLINE")
+ $(element).before(doomLineTemplate({"text": text}))
getUsItems = ->
rowElements = $el.find('.backlog-table-body .us-item-row')
@@ -643,10 +644,14 @@ BacklogDirective = ($repo, $rootscope) ->
if $ctrl.showTags
elm.addClass("active")
- elm.find(".text").text("Hide Tags") # TODO: i18n
+
+ text = $translate.instant("BACKLOG.TAGS.HIDE")
+ elm.find(".text").text(text)
else
elm.removeClass("active")
- elm.find(".text").text("Show Tags") # TODO: i18n
+
+ text = $translate.instant("BACKLOG.TAGS.SHOW")
+ elm.find(".text").text(text)
showHideFilter = ($scope, $el, $ctrl) ->
sidebar = $el.find("sidebar.filters-bar")
@@ -660,7 +665,10 @@ BacklogDirective = ($repo, $rootscope) ->
sidebar.toggleClass("active")
target.toggleClass("active")
- toggleText(target.find(".text"), ["Remove Filters", "Show Filters"]) # TODO: i18n
+ removeText = $translate.instant("BACKLOG.FILTERS.REMOVE")
+ showText = $translate.instant("BACKLOG.FILTERS.SHOW")
+
+ toggleText(target.find(".text"), [removeText, showText])
if !sidebar.hasClass("active")
$ctrl.resetFilters()
@@ -701,14 +709,13 @@ BacklogDirective = ($repo, $rootscope) ->
return {link: link}
-module.directive("tgBacklog", ["$tgRepo", "$rootScope", BacklogDirective])
+module.directive("tgBacklog", ["$tgRepo", "$rootScope", "$translate", BacklogDirective])
#############################################################################
## User story points directive
#############################################################################
-UsRolePointsSelectorDirective = ($rootscope, $template) ->
- #TODO: i18n
+UsRolePointsSelectorDirective = ($rootscope, $template, $compile, $translate) ->
selectionTemplate = $template.get("backlog/us-role-points-popover.html", true)
link = ($scope, $el, $attrs) ->
@@ -718,7 +725,7 @@ UsRolePointsSelectorDirective = ($rootscope, $template) ->
numberOfRoles = _.size(roles)
if numberOfRoles > 1
- $el.append(selectionTemplate({"roles":roles}))
+ $el.append($compile(selectionTemplate({"roles": roles}))($scope))
else
$el.find(".icon-arrow-bottom").remove()
$el.find(".header-points").addClass("not-clickable")
@@ -729,7 +736,9 @@ UsRolePointsSelectorDirective = ($rootscope, $template) ->
$scope.$on "uspoints:clear-selection", (ctx, roleId) ->
$el.find(".popover").popover().close()
- $el.find(".header-points").text("Points") #TODO: i18n
+
+ text = $translate.instant("COMMON.FIELDS.POINTS")
+ $el.find(".header-points").text(text)
# Dom Event Handlers
$el.on "click", (event) ->
@@ -757,7 +766,7 @@ UsRolePointsSelectorDirective = ($rootscope, $template) ->
return {link: link}
-module.directive("tgUsRolePointsSelector", ["$rootScope", "$tgTemplate", UsRolePointsSelectorDirective])
+module.directive("tgUsRolePointsSelector", ["$rootScope", "$tgTemplate", "$compile", UsRolePointsSelectorDirective])
UsPointsDirective = ($tgEstimationsService, $repo, $tgTemplate) ->
@@ -866,7 +875,7 @@ module.directive("tgBacklogUsPoints", ["$tgEstimationsService", "$tgRepo", "$tgT
## Burndown graph directive
#############################################################################
-tgBacklogGraphDirective = ->
+tgBacklogGraphDirective = ($translate) ->
redrawChart = (element, dataToDraw) ->
width = element.width()
element.height(width/6)
@@ -946,18 +955,17 @@ tgBacklogGraphDirective = ->
tooltip: true
tooltipOpts: {
content: (label, xval, yval, flotItem) ->
- #TODO: i18n
if flotItem.seriesIndex == 1
- return "Optimal pending points for sprint #{xval} should be #{yval}"
+ return $translate.instant("BACKLOG.OPTIMA", {xval: xval, yval: yval})
else if flotItem.seriesIndex == 2
- return "Real pending points for sprint #{xval} is #{yval}"
+ return $translate.instant("BACKLOG.REAL", {xval: xval, yval: yval})
else if flotItem.seriesIndex == 3
- return "Incremented points by team requirements for sprint #{xval} is #{Math.abs(yval)}"
+ return $translate.instant("BACKLOG.INCREMENT_TEAM", {xval: xval, yval: Math.abs(yval)})
else
- return "Incremented points by client requirements for sprint #{xval} is #{Math.abs(yval)}"
+ return $translate.instant("BACKLOG.INCREMENT_CLIENT", {xval: xval, yval: Math.abs(yval)})
}
}
@@ -980,7 +988,7 @@ tgBacklogGraphDirective = ->
return {link: link}
-module.directive("tgGmBacklogGraph", tgBacklogGraphDirective)
+module.directive("tgGmBacklogGraph", ["$translate", tgBacklogGraphDirective])
#############################################################################
diff --git a/app/coffee/modules/backlog/sortable.coffee b/app/coffee/modules/backlog/sortable.coffee
index 96d74f0f..6484c044 100644
--- a/app/coffee/modules/backlog/sortable.coffee
+++ b/app/coffee/modules/backlog/sortable.coffee
@@ -39,7 +39,7 @@ deleteElement = (el) ->
el.off()
el.remove()
-BacklogSortableDirective = ($repo, $rs, $rootscope, $tgConfirm) ->
+BacklogSortableDirective = ($repo, $rs, $rootscope, $tgConfirm, $translate) ->
# Notes about jquery bug:
# http://stackoverflow.com/questions/5791886/jquery-draggable-shows-
# helper-in-wrong-place-when-scrolled-down-page
@@ -54,7 +54,8 @@ BacklogSortableDirective = ($repo, $rs, $rootscope, $tgConfirm) ->
return
filterError = ->
- $tgConfirm.notify("error", "You can't drop on backlog when filters are open") #TODO: i18n
+ text = $translate.instant("BACKLOG.SORTABLE_FILTER_ERROR")
+ $tgConfirm.notify(text)
$el.sortable({
items: ".us-item-row",
@@ -211,6 +212,7 @@ module.directive("tgBacklogSortable", [
"$tgResources",
"$rootScope",
"$tgConfirm",
+ "$translate",
BacklogSortableDirective
])
diff --git a/app/coffee/modules/backlog/sprints.coffee b/app/coffee/modules/backlog/sprints.coffee
index 98419c65..572f40ab 100644
--- a/app/coffee/modules/backlog/sprints.coffee
+++ b/app/coffee/modules/backlog/sprints.coffee
@@ -85,8 +85,8 @@ module.directive("tgBacklogSprint", ["$tgRepo", "$rootScope", BacklogSprintDirec
## Sprint Header Directive
#############################################################################
-BacklogSprintHeaderDirective = ($navUrls, $template) ->
- template = $template.get("backlog/sprint-header.html", true)
+BacklogSprintHeaderDirective = ($navUrls, $template, $compile) ->
+ template = $template.get("backlog/sprint-header.html")
link = ($scope, $el, $attrs, $model) ->
isEditable = ->
@@ -112,8 +112,13 @@ BacklogSprintHeaderDirective = ($navUrls, $template) ->
isVisible: isVisible()
isEditable: isEditable()
}
- $el.html(template(ctx))
+ templateScope = $scope.$new()
+
+ _.assign(templateScope, ctx)
+
+ compiledTemplate = $compile(template)(templateScope)
+ $el.html(compiledTemplate)
$scope.$watch $attrs.ngModel, (sprint) ->
render(sprint)
@@ -130,13 +135,13 @@ BacklogSprintHeaderDirective = ($navUrls, $template) ->
require: "ngModel"
}
-module.directive("tgBacklogSprintHeader", ["$tgNavUrls", "$tgTemplate", BacklogSprintHeaderDirective])
+module.directive("tgBacklogSprintHeader", ["$tgNavUrls", "$tgTemplate", "$compile", BacklogSprintHeaderDirective])
#############################################################################
## Toggle Closed Sprints Directive
#############################################################################
-ToggleExcludeClosedSprintsVisualization = ($rootscope, $loading) ->
+ToggleExcludeClosedSprintsVisualization = ($rootscope, $loading, $translate) ->
excludeClosedSprints = true
link = ($scope, $el, $attrs) ->
@@ -162,14 +167,15 @@ ToggleExcludeClosedSprintsVisualization = ($rootscope, $loading) ->
$scope.$on "closed-sprints:reloaded", (ctx, sprints) =>
$loading.finish(loadingElm)
- #TODO: i18n
if sprints.length > 0
- text = "Hide closed sprints"
+ key = "BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS"
else
- text = "Show closed sprints"
+ key = "BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS"
+
+ text = $translate.instant(key)
$el.find(".text").text(text)
return {link: link}
-module.directive("tgBacklogToggleClosedSprintsVisualization", ["$rootScope", "$tgLoading", ToggleExcludeClosedSprintsVisualization])
+module.directive("tgBacklogToggleClosedSprintsVisualization", ["$rootScope", "$tgLoading", "$translate", ToggleExcludeClosedSprintsVisualization])
diff --git a/app/coffee/modules/base.coffee b/app/coffee/modules/base.coffee
index 8c762e77..8bdf9917 100644
--- a/app/coffee/modules/base.coffee
+++ b/app/coffee/modules/base.coffee
@@ -23,7 +23,7 @@ taiga = @.taiga
groupBy = @.taiga.groupBy
bindOnce = @.taiga.bindOnce
-module = angular.module("taigaBase", ["taigaLocales"])
+module = angular.module("taigaBase", [])
#############################################################################
## Main Directive
diff --git a/app/coffee/modules/base/i18n.coffee b/app/coffee/modules/base/i18n.coffee
deleted file mode 100644
index 6097cf6b..00000000
--- a/app/coffee/modules/base/i18n.coffee
+++ /dev/null
@@ -1,74 +0,0 @@
-###
-# Copyright (C) 2014 Andrey Antukh
-# Copyright (C) 2014 Jesús Espino Garcia
-# Copyright (C) 2014 David Barragán Merino
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-# File: modules/base/i18n.coffee
-###
-
-taiga = @.taiga
-bindOnce = @.taiga.bindOnce
-
-defaults = {
- ns: "app"
- fallbackLng: "en"
- async: false
- lng: "en"
-}
-
-class I18nService extends taiga.Service
- constructor: (@rootscope, localesEn) ->
- @.options = _.clone(defaults, true)
- @.options.resStore = {
- en: { app: localesEn }
- }
-
- setLanguage: (language) ->
- i18n.setLng(language)
- @rootscope.currentLang = language
- @rootscope.$broadcast("i18n:changeLang", language)
-
- initialize: ->
- i18n.init(@.options)
- @rootscope.t = i18n.t
-
- t: (path, opts) ->
- return i18n.t(path, opts)
-
-
-I18nDirective = ($rootscope, $i18n) ->
- link = ($scope, $el, $attrs) ->
- values = $attrs.tr.split(",")
- options = $attrs.trOpts or '{}'
- opts = $scope.$eval(options)
-
- for v in values
- if v.indexOf(":") == -1
- $el.html(_.escape($i18n.t(v, opts)))
- else
- [ns, v] = v.split(":")
- $el.attr(ns, _.escape($i18n.t(v, opts)))
-
- return {
- link: link
- restrict: "A"
- scope: false
- }
-
-
-module = angular.module("taigaBase")
-module.service("$tgI18n", ["$rootScope", "localesEn", I18nService])
-module.directive("tr", ["$rootScope", "$tgI18n", I18nDirective])
diff --git a/app/coffee/modules/common/attachments.coffee b/app/coffee/modules/common/attachments.coffee
index 1327dd98..cd575c55 100644
--- a/app/coffee/modules/common/attachments.coffee
+++ b/app/coffee/modules/common/attachments.coffee
@@ -220,8 +220,8 @@ AttachmentsDirective = ($config, $confirm, $templates) ->
templateFn = ($el, $attrs) ->
maxFileSize = $config.get("maxUploadFileSize", null)
maxFileSize = sizeFormat(maxFileSize) if maxFileSize
- maxFileSizeMsg = if maxFileSize then "Maximum upload size is #{maxFileSize}" else "" # TODO: i18n
-
+ maxFileSizeMsg = if maxFileSize then $translation.instant("ATTACHMENT.MAX_UPLOAD_SIZE") else ""
+ maxFileSize = 4000
ctx = {
type: $attrs.type
maxFileSize: maxFileSize
@@ -242,7 +242,7 @@ AttachmentsDirective = ($config, $confirm, $templates) ->
module.directive("tgAttachments", ["$tgConfig", "$tgConfirm", "$tgTemplate", AttachmentsDirective])
-AttachmentDirective = ($template) ->
+AttachmentDirective = ($template, $compile) ->
template = $template.get("attachment/attachment.html", true)
templateEdit = $template.get("attachment/attachment-edit.html", true)
@@ -254,7 +254,7 @@ AttachmentDirective = ($template) ->
ctx = {
id: attachment.id
name: attachment.name
- created_date: moment(attachment.created_date).format("DD MMM YYYY [at] hh:mm") #TODO: i18n
+ created_date: moment(attachment.created_date).format("ATTACHMENT.DATE")
url: attachment.url
size: sizeFormat(attachment.size)
description: attachment.description
@@ -263,9 +263,9 @@ AttachmentDirective = ($template) ->
}
if edit
- html = templateEdit(ctx)
+ html = $compile(templateEdit(ctx))($scope)
else
- html = template(ctx)
+ html = $compile(template(ctx))($scope)
$el.html(html)
@@ -322,4 +322,4 @@ AttachmentDirective = ($template) ->
restrict: "AE"
}
-module.directive("tgAttachment", ["$tgTemplate", AttachmentDirective])
+module.directive("tgAttachment", ["$tgTemplate", "$compile", AttachmentDirective])
diff --git a/app/coffee/modules/common/components.coffee b/app/coffee/modules/common/components.coffee
index dd902037..73bb915f 100644
--- a/app/coffee/modules/common/components.coffee
+++ b/app/coffee/modules/common/components.coffee
@@ -107,7 +107,7 @@ module.directive("tgSprintProgressbar", SprintProgressBarDirective)
## Created-by display directive
#############################################################################
-CreatedByDisplayDirective = ($template)->
+CreatedByDisplayDirective = ($template, $compile)->
# Display the owner information (full name and photo) and the date of
# creation of an object (like USs, tasks and issues).
#
@@ -119,7 +119,7 @@ CreatedByDisplayDirective = ($template)->
# 'owner'(ng-model)
# - scope.usersById object is required.
- template = $template.get("common/components/created-by.html", true) # TODO: i18n
+ template = $template.get("common/components/created-by.html", true)
link = ($scope, $el, $attrs) ->
render = (model) ->
@@ -127,10 +127,14 @@ CreatedByDisplayDirective = ($template)->
full_name_display: "external user"
photo: "/images/unnamed.png"
}
+
html = template({
owner: owner
date: moment(model.created_date).format("DD MMM YYYY HH:mm")
})
+
+ html = $compile(html)($scope)
+
$el.html(html)
bindOnce $scope, $attrs.ngModel, (model) ->
@@ -145,18 +149,16 @@ CreatedByDisplayDirective = ($template)->
require: "ngModel"
}
-module.directive("tgCreatedByDisplay", ["$tgTemplate", CreatedByDisplayDirective])
+module.directive("tgCreatedByDisplay", ["$tgTemplate", "$compile", CreatedByDisplayDirective])
#############################################################################
## Watchers directive
#############################################################################
-WatchersDirective = ($rootscope, $confirm, $repo, $qqueue, $template) ->
+WatchersDirective = ($rootscope, $confirm, $repo, $qqueue, $template, $compile) ->
# You have to include a div with the tg-lb-watchers directive in the page
# where use this directive
- #
- # TODO: i18n
template = $template.get("common/components/watchers.html", true)
link = ($scope, $el, $attrs, $model) ->
@@ -200,7 +202,7 @@ WatchersDirective = ($rootscope, $confirm, $repo, $qqueue, $template) ->
isEditable: isEditable()
}
- html = template(ctx)
+ html = $compile(template(ctx))($scope)
$el.html(html)
if isEditable() and watchers.length == 0
@@ -247,18 +249,17 @@ WatchersDirective = ($rootscope, $confirm, $repo, $qqueue, $template) ->
return {link:link, require:"ngModel"}
-module.directive("tgWatchers", ["$rootScope", "$tgConfirm", "$tgRepo", "$tgQqueue", "$tgTemplate", WatchersDirective])
+module.directive("tgWatchers", ["$rootScope", "$tgConfirm", "$tgRepo", "$tgQqueue", "$tgTemplate", "$compile",
+ WatchersDirective])
#############################################################################
## Assigned to directive
#############################################################################
-AssignedToDirective = ($rootscope, $confirm, $repo, $loading, $qqueue, $template) ->
+AssignedToDirective = ($rootscope, $confirm, $repo, $loading, $qqueue, $template, $translate, $compile) ->
# You have to include a div with the tg-lb-assignedto directive in the page
# where use this directive
- #
- # TODO: i18n
template = $template.get("common/components/assigned-to.html", true)
link = ($scope, $el, $attrs, $model) ->
@@ -291,7 +292,7 @@ AssignedToDirective = ($rootscope, $confirm, $repo, $loading, $qqueue, $template
assignedTo: assignedTo
isEditable: isEditable()
}
- html = template(ctx)
+ html = $compile(template(ctx))($scope)
$el.html(html)
$el.on "click", ".user-assigned", (event) ->
@@ -303,7 +304,7 @@ AssignedToDirective = ($rootscope, $confirm, $repo, $loading, $qqueue, $template
$el.on "click", ".icon-delete", (event) ->
event.preventDefault()
return if not isEditable()
- title = "Are you sure you want to leave it unassigned?" # TODO: i18n
+ title = $translate.instant("COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED")
$confirm.ask(title).then (finish) =>
finish()
@@ -326,7 +327,8 @@ AssignedToDirective = ($rootscope, $confirm, $repo, $loading, $qqueue, $template
require:"ngModel"
}
-module.directive("tgAssignedTo", ["$rootScope", "$tgConfirm", "$tgRepo", "$tgLoading", "$tgQqueue", "$tgTemplate", AssignedToDirective])
+module.directive("tgAssignedTo", ["$rootScope", "$tgConfirm", "$tgRepo", "$tgLoading", "$tgQqueue", "$tgTemplate", "$translate", "$compile",
+ AssignedToDirective])
#############################################################################
@@ -392,7 +394,7 @@ DeleteButtonDirective = ($log, $repo, $confirm, $location, $template) ->
return $log.error "DeleteButtonDirective requires on-delete-title set in scope."
$el.on "click", ".button", (event) ->
- title = $scope.$eval($attrs.onDeleteTitle)
+ title = $attrs.onDeleteTitle
subtitle = $model.$modelValue.subject
$confirm.askOnDelete(title, subtitle).then (finish) =>
@@ -471,7 +473,6 @@ EditableSubjectDirective = ($rootscope, $repo, $confirm, $loading, $qqueue, $tem
$el.find('div.edit-subject').hide()
$el.find('div.view-subject span.edit').hide()
-
$scope.$watch $attrs.ngModel, (value) ->
return if not value
$scope.item = value
@@ -490,7 +491,8 @@ EditableSubjectDirective = ($rootscope, $repo, $confirm, $loading, $qqueue, $tem
template: template
}
-module.directive("tgEditableSubject", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", EditableSubjectDirective])
+module.directive("tgEditableSubject", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue",
+ "$tgTemplate", EditableSubjectDirective])
#############################################################################
@@ -498,9 +500,9 @@ module.directive("tgEditableSubject", ["$rootScope", "$tgRepo", "$tgConfirm", "$
#############################################################################
EditableDescriptionDirective = ($rootscope, $repo, $confirm, $compile, $loading, $selectedText, $qqueue, $template) ->
- template = $template.get("common/components/editable-description.html") # TODO: i18n
- noDescriptionMegEditMode = $template.get("common/components/editable-description-msg-edit-mode.html") # TODO: i18n
- noDescriptionMegReadMode = $template.get("common/components/editable-description-msg-read-mode.html") # TODO: i18n
+ template = $template.get("common/components/editable-description.html")
+ noDescriptionMegEditMode = $template.get("common/components/editable-description-msg-edit-mode.html")
+ noDescriptionMegReadMode = $template.get("common/components/editable-description-msg-read-mode.html")
link = ($scope, $el, $attrs, $model) ->
$el.find('.edit-description').hide()
@@ -569,8 +571,8 @@ EditableDescriptionDirective = ($rootscope, $repo, $confirm, $compile, $loading,
template: template
}
-module.directive("tgEditableDescription", ["$rootScope", "$tgRepo", "$tgConfirm",
- "$compile", "$tgLoading", "$selectedText", "$tgQqueue", "$tgTemplate", EditableDescriptionDirective])
+module.directive("tgEditableDescription", ["$rootScope", "$tgRepo", "$tgConfirm", "$compile", "$tgLoading",
+ "$selectedText", "$tgQqueue", "$tgTemplate", EditableDescriptionDirective])
#############################################################################
@@ -580,14 +582,16 @@ module.directive("tgEditableDescription", ["$rootScope", "$tgRepo", "$tgConfirm"
## completely bindonce, they only serves for visualization of data.
#############################################################################
-ListItemIssueStatusDirective = ->
+ListItemUsStatusDirective = ->
link = ($scope, $el, $attrs) ->
- issue = $scope.$eval($attrs.tgListitemIssueStatus)
- bindOnce $scope, "issueStatusById", (issueStatusById) ->
- $el.html(issueStatusById[issue.status].name)
+ us = $scope.$eval($attrs.tgListitemUsStatus)
+ bindOnce $scope, "usStatusById", (usStatusById) ->
+ $el.html(usStatusById[us.status].name)
return {link:link}
+module.directive("tgListitemUsStatus", ListItemUsStatusDirective)
+
ListItemTaskStatusDirective = ->
link = ($scope, $el, $attrs) ->
@@ -597,14 +601,7 @@ ListItemTaskStatusDirective = ->
return {link:link}
-
-ListItemUsStatusDirective = ->
- link = ($scope, $el, $attrs) ->
- us = $scope.$eval($attrs.tgListitemUsStatus)
- bindOnce $scope, "usStatusById", (usStatusById) ->
- $el.html(usStatusById[us.status].name)
-
- return {link:link}
+module.directive("tgListitemTaskStatus", ListItemTaskStatusDirective)
ListItemAssignedtoDirective = ($template) ->
@@ -626,6 +623,41 @@ ListItemAssignedtoDirective = ($template) ->
module.directive("tgListitemAssignedto", ["$tgTemplate", ListItemAssignedtoDirective])
+
+ListItemIssueStatusDirective = ->
+ link = ($scope, $el, $attrs) ->
+ issue = $scope.$eval($attrs.tgListitemIssueStatus)
+ bindOnce $scope, "issueStatusById", (issueStatusById) ->
+ $el.html(issueStatusById[issue.status].name)
+
+ return {link:link}
+
+module.directive("tgListitemIssueStatus", ListItemIssueStatusDirective)
+
+
+ListItemTypeDirective = ->
+ link = ($scope, $el, $attrs) ->
+ render = (issueTypeById, issue) ->
+ type = issueTypeById[issue.type]
+ domNode = $el.find(".level")
+ domNode.css("background-color", type.color)
+ domNode.attr("title", type.name)
+
+ bindOnce $scope, "issueTypeById", (issueTypeById) ->
+ issue = $scope.$eval($attrs.tgListitemType)
+ render(issueTypeById, issue)
+
+ $scope.$watch $attrs.tgListitemType, (issue) ->
+ render($scope.issueTypeById, issue)
+
+ return {
+ link: link
+ templateUrl: "common/components/level.html"
+ }
+
+module.directive("tgListitemType", ListItemTypeDirective)
+
+
ListItemPriorityDirective = ->
link = ($scope, $el, $attrs) ->
render = (priorityById, issue) ->
@@ -648,6 +680,7 @@ ListItemPriorityDirective = ->
module.directive("tgListitemPriority", ListItemPriorityDirective)
+
ListItemSeverityDirective = ->
link = ($scope, $el, $attrs) ->
render = (severityById, issue) ->
@@ -668,26 +701,7 @@ ListItemSeverityDirective = ->
templateUrl: "common/components/level.html"
}
-
-ListItemTypeDirective = ->
- link = ($scope, $el, $attrs) ->
- render = (issueTypeById, issue) ->
- type = issueTypeById[issue.type]
- domNode = $el.find(".level")
- domNode.css("background-color", type.color)
- domNode.attr("title", type.name)
-
- bindOnce $scope, "issueTypeById", (issueTypeById) ->
- issue = $scope.$eval($attrs.tgListitemType)
- render(issueTypeById, issue)
-
- $scope.$watch $attrs.tgListitemType, (issue) ->
- render($scope.issueTypeById, issue)
-
- return {
- link: link
- templateUrl: "common/components/level.html"
- }
+module.directive("tgListitemSeverity", ListItemSeverityDirective)
#############################################################################
@@ -715,35 +729,27 @@ TgProgressBarDirective = ($template) ->
module.directive("tgProgressBar", ["$tgTemplate", TgProgressBarDirective])
+
#############################################################################
## Main title directive
#############################################################################
-TgMainTitleDirective = ($template) ->
- template = $template.get("common/components/main-title.html", true)
-
- render = (el, projectName, sectionName) ->
- el.html(template({
- projectName: projectName
- sectionName: sectionName
- }))
+TgMainTitleDirective = ($translate) ->
link = ($scope, $el, $attrs) ->
- element = angular.element($el)
- $scope.$watch "project", (project) ->
- render($el, project.name, $scope.sectionName) if project
-
- $scope.$on "project:loaded", (ctx, project) =>
- render($el, project.name, $scope.sectionName)
+ $attrs.$observe "i18nSectionName", (i18nSectionName) ->
+ trans = $translate(i18nSectionName)
+ trans.then (sectionName) -> $scope.sectionName = sectionName
+ trans.catch (sectionName) -> $scope.sectionName = sectionName
$scope.$on "$destroy", ->
$el.off()
- return {link: link}
+ return {
+ link: link
+ templateUrl: "common/components/main-title.html"
+ scope: {
+ projectName : "=projectName"
+ }
+ }
-module.directive("tgMainTitle", ["$tgTemplate", TgMainTitleDirective])
-
-module.directive("tgListitemType", ListItemTypeDirective)
-module.directive("tgListitemIssueStatus", ListItemIssueStatusDirective)
-module.directive("tgListitemSeverity", ListItemSeverityDirective)
-module.directive("tgListitemTaskStatus", ListItemTaskStatusDirective)
-module.directive("tgListitemUsStatus", ListItemUsStatusDirective)
+module.directive("tgMainTitle", ["$translate", TgMainTitleDirective])
diff --git a/app/coffee/modules/common/confirm.coffee b/app/coffee/modules/common/confirm.coffee
index 039fc89a..fd877c4b 100644
--- a/app/coffee/modules/common/confirm.coffee
+++ b/app/coffee/modules/common/confirm.coffee
@@ -27,21 +27,21 @@ bindMethods = @.taiga.bindMethods
NOTIFICATION_MSG = {
"success":
- title: "Everything is ok"
- message: "Our Oompa Loompas saved all your changes!"
+ title: "NOTIFICATION.OK"
+ message: "NOTIFICATION.SAVED"
"error":
- title: "Oops, something happened..."
- message: "Our Oompa Loompas are sad, your changes were not saved!"
+ title: "NOTIFICATION.WARNING"
+ message: "NOTIFICATION.WARNING_TEXT"
"light-error":
- title: "Oops, something happened..."
- message: "Our Oompa Loompas are sad, your changes were not saved!"
+ title: "NOTIFICATION.WARNING"
+ message: "NOTIFICATION.WARNING_TEXT"
}
class ConfirmService extends taiga.Service
- @.$inject = ["$q", "lightboxService", "$tgLoading"]
+ @.$inject = ["$q", "lightboxService", "$tgLoading", "$translate"]
- constructor: (@q, @lightboxService, @loading) ->
+ constructor: (@q, @lightboxService, @loading, @translate) ->
bindMethods(@)
hide: (el)->
@@ -51,6 +51,8 @@ class ConfirmService extends taiga.Service
el.off(".confirm-dialog")
ask: (title, subtitle, message, lightboxSelector=".lightbox-generic-ask") ->
+ defered = @q.defer()
+
el = angular.element(lightboxSelector)
# Render content
@@ -58,8 +60,6 @@ class ConfirmService extends taiga.Service
el.find("span.subtitle").html(subtitle)
el.find("span.message").html(message)
- defered = @q.defer()
-
# Assign event handlers
el.on "click.confirm-dialog", "a.button-green", debounce 2000, (event) =>
event.preventDefault()
@@ -80,9 +80,11 @@ class ConfirmService extends taiga.Service
return defered.promise
askOnDelete: (title, message) ->
- return @.ask(title, "Are you sure you want to delete?", message) #TODO: i18n
+ return @.ask(title, @translate.instant("NOTIFICATION.ASK_DELETE"), message)
askChoice: (title, subtitle, choices, replacement, warning, lightboxSelector=".lightbox-ask-choice") ->
+ defered = @q.defer()
+
el = angular.element(lightboxSelector)
# Render content
@@ -103,7 +105,6 @@ class ConfirmService extends taiga.Service
choicesField.html('')
_.each choices, (value, key) ->
choicesField.append(angular.element(""))
- defered = @q.defer()
# Assign event handlers
el.on "click.confirm-dialog", "a.button-green", debounce 2000, (event) =>
@@ -127,11 +128,12 @@ class ConfirmService extends taiga.Service
return defered.promise
error: (message) ->
+ defered = @q.defer()
+
el = angular.element(".lightbox-generic-error")
# Render content
el.find("h2.title").html(message)
- defered = @q.defer()
# Assign event handlers
el.on "click.confirm-dialog", "a.button-green", (event) =>
@@ -149,12 +151,13 @@ class ConfirmService extends taiga.Service
return defered.promise
success: (title, message) ->
+ defered = @q.defer()
+
el = angular.element(".lightbox-generic-success")
# Render content
el.find("h2.title").html(title) if title
el.find("p.message").html(message) if message
- defered = @q.defer()
# Assign event handlers
el.on "click.confirm-dialog", "a.button-green", (event) =>
@@ -208,12 +211,12 @@ class ConfirmService extends taiga.Service
if title
el.find("h4").html(title)
else
- el.find("h4").html(NOTIFICATION_MSG[type].title)
+ el.find("h4").html(@translate.instant(NOTIFICATION_MSG[type].title))
if message
el.find("p").html(message)
else
- el.find("p").html(NOTIFICATION_MSG[type].message)
+ el.find("p").html(@translate.instant(NOTIFICATION_MSG[type].message))
body = angular.element("body")
body.find(".notification-message .notification-light")
diff --git a/app/coffee/modules/common/custom-field-values.coffee b/app/coffee/modules/common/custom-field-values.coffee
index c827afb8..cbf788cf 100644
--- a/app/coffee/modules/common/custom-field-values.coffee
+++ b/app/coffee/modules/common/custom-field-values.coffee
@@ -121,7 +121,7 @@ CustomAttributesValuesDirective = ($templates, $storage) ->
module.directive("tgCustomAttributesValues", ["$tgTemplate", "$tgStorage", CustomAttributesValuesDirective])
-CustomAttributeValueDirective = ($template, $selectedText) ->
+CustomAttributeValueDirective = ($template, $selectedText, $compile) ->
template = $template.get("custom-attributes/custom-attribute-value.html", true)
templateEdit = $template.get("custom-attributes/custom-attribute-value-edit.html", true)
@@ -139,8 +139,10 @@ CustomAttributeValueDirective = ($template, $selectedText) ->
if editable and (edit or not value)
html = templateEdit(ctx)
+ html = $compile(html)($scope)
else
html = template(ctx)
+ html = $compile(html)($scope)
$el.html(html)
@@ -195,4 +197,4 @@ CustomAttributeValueDirective = ($template, $selectedText) ->
restrict: "AE"
}
-module.directive("tgCustomAttributeValue", ["$tgTemplate", "$selectedText", CustomAttributeValueDirective])
+module.directive("tgCustomAttributeValue", ["$tgTemplate", "$selectedText", "$compile", CustomAttributeValueDirective])
diff --git a/app/coffee/modules/common/estimation.coffee b/app/coffee/modules/common/estimation.coffee
index 09b11e5e..18348762 100644
--- a/app/coffee/modules/common/estimation.coffee
+++ b/app/coffee/modules/common/estimation.coffee
@@ -28,7 +28,7 @@ module = angular.module("taigaCommon")
## User story estimation directive (for Lightboxes)
#############################################################################
-LbUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $template) ->
+LbUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $template, $compile) ->
# Display the points of a US and you can edit it.
#
# Example:
@@ -40,7 +40,6 @@ LbUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $
link = ($scope, $el, $attrs, $model) ->
$scope.$watch $attrs.ngModel, (us) ->
- console.log "watch"
if us
estimationProcess = $tgEstimationsService.create($el, us, $scope.project)
estimationProcess.onSelectedPointForRole = (roleId, pointId) ->
@@ -57,6 +56,7 @@ LbUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $
mainTemplate = "common/estimation/us-estimation-points-per-role.html"
template = $template.get(mainTemplate, true)
html = template(ctx)
+ html = $compile(html)($scope)
@$el.html(html)
estimationProcess.render()
@@ -69,14 +69,14 @@ LbUsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $
require: "ngModel"
}
-module.directive("tgLbUsEstimation", ["$tgEstimationsService", "$rootScope", "$tgRepo", "$tgConfirm", "$tgTemplate", LbUsEstimationDirective])
+module.directive("tgLbUsEstimation", ["$tgEstimationsService", "$rootScope", "$tgRepo", "$tgConfirm", "$tgTemplate", "$compile", LbUsEstimationDirective])
#############################################################################
## User story estimation directive
#############################################################################
-UsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $qqueue, $template) ->
+UsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $qqueue, $template, $compile) ->
# Display the points of a US and you can edit it.
#
# Example:
@@ -103,6 +103,7 @@ UsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $qq
mainTemplate = "common/estimation/us-estimation-points-per-role.html"
template = $template.get(mainTemplate, true)
html = template(ctx)
+ html = $compile(html)($scope)
@$el.html(html)
estimationProcess.render()
@@ -116,7 +117,7 @@ UsEstimationDirective = ($tgEstimationsService, $rootScope, $repo, $confirm, $qq
require: "ngModel"
}
-module.directive("tgUsEstimation", ["$tgEstimationsService", "$rootScope", "$tgRepo", "$tgConfirm", "$tgQqueue", "$tgTemplate",
+module.directive("tgUsEstimation", ["$tgEstimationsService", "$rootScope", "$tgRepo", "$tgConfirm", "$tgQqueue", "$tgTemplate", "$compile"
UsEstimationDirective])
diff --git a/app/coffee/modules/common/filters.coffee b/app/coffee/modules/common/filters.coffee
index e9559306..27647dd6 100644
--- a/app/coffee/modules/common/filters.coffee
+++ b/app/coffee/modules/common/filters.coffee
@@ -33,15 +33,14 @@ defaultFilter = ->
module.filter("default", defaultFilter)
-yesNoFilter = ->
- #TODO: i18n
+yesNoFilter = ($translate) ->
return (value) ->
if value
- return "Yes"
+ return $translate.instant("COMMON.YES")
- return "No"
+ return $translate.instant("COMMON.NO")
-module.filter("yesNo", yesNoFilter)
+module.filter("yesNo", ["$translate", yesNoFilter])
unslugify = ->
diff --git a/app/coffee/modules/common/history.coffee b/app/coffee/modules/common/history.coffee
index c7ab11d5..2d7ddced 100644
--- a/app/coffee/modules/common/history.coffee
+++ b/app/coffee/modules/common/history.coffee
@@ -68,7 +68,7 @@ class HistoryController extends taiga.Controller
return @rs.history.undeleteComment(type, objectId, activityId).then => @.loadHistory(type, objectId)
-HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
+HistoryDirective = ($log, $loading, $qqueue, $template, $confirm, $translate, $compile) ->
templateChangeDiff = $template.get("common/history/history-change-diff.html", true)
templateChangePoints = $template.get("common/history/history-change-points.html", true)
templateChangeGeneric = $template.get("common/history/history-change-generic.html", true)
@@ -96,25 +96,26 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
# Helpers
getHumanizedFieldName = (field) ->
- humanizedFieldNames = {
- # US
- assigned_to: "assigned to"
- is_closed: "is closed"
- finish_date: "finish date"
- client_requirement: "client requirement"
- team_requirement: "team requirement"
+ humanizedFieldNames = {}
- # Task
- milestone: "sprint"
- user_story: "user story"
- is_iocaine: "is iocaine"
+ # US
+ humanizedFieldNames.assigned_to = $translate.instant("COMMON.FIELDS.ASSIGNED_TO").toLowerCase()
+ humanizedFieldNames.is_closed = $translate.instant("IS_CLOSED").toLowerCase()
+ humanizedFieldNames.finish_date = $translate.instant("US.FIELDS.FINISH_DATE").toLowerCase()
+ humanizedFieldNames.client_repquirement = $translate.instant("US.FIELDS.CLIENT_REQUIREMENT").toLowerCase()
+ humanizedFieldNames.team_requirement = $translate.instant("US.FIELDS.TEAM_REQUIREMENT").toLowerCase()
- # Attachment
- is_deprecated: "is deprecated"
+ # Task
+ humanizedFieldNames.milestone = $translate.instant("TASK.FIELDS.MILESTONE").toLowerCase()
+ humanizedFieldNames.user_story = $translate.instant("TASK.FIELDS.USER_STORY").toLowerCase()
+ humanizedFieldNames.is_iocaine = $translate.instant("TASK.FIELDS.IS_IOCAINE").toLowerCase()
+
+ # Attachment
+ humanizedFieldNames.is_deprecated = $translate.instant("TASK.FIELDS.IS_IOCAINE").toLowerCase()
+
+ humanizedFieldNames.blocked_note = $translate.instant("TASK.FIELDS.IS_IOCAINE").toLowerCase()
+ humanizedFieldNames.is_blocked = $translate.instant("TASK.FIELDS.IS_BLOCKED").toLowerCase()
- blocked_note: "blocked note"
- is_blocked: "is blocked"
- } # TODO i18n
return humanizedFieldNames[field] or field
getUserFullName = (userId) ->
@@ -152,16 +153,14 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
attachments = _.map value, (changes, type) ->
if type == "new"
return _.map changes, (change) ->
- # TODO: i18n
- return templateChangeDiff({name: "new attachment", diff: change.filename})
+ return templateChangeDiff({name: $translate.instant("ACTIVITY.NEW_ATTACHMENT"), diff: change.filename})
else if type == "deleted"
return _.map changes, (change) ->
- # TODO: i18n
- return templateChangeDiff({name: "deleted attachment", diff: change.filename})
+ return templateChangeDiff({name: $translate.instant("ACTIVITY.DELETED_ATTACHMENT"), diff: change.filename})
else
return _.map changes, (change) ->
- # TODO: i18n
- name = "updated attachment #{change.filename}"
+ name = $tranlsate.instant("ACTIVITY.UPDATED_ATTACHMENT", {filename: change.filename})
+
diff = _.map change.changes, (values, name) ->
return {
name: getHumanizedFieldName(name)
@@ -177,16 +176,19 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
customAttributes = _.map value, (changes, type) ->
if type == "new"
return _.map changes, (change) ->
- return templateChangeGeneric({
+ html = templateChangeGeneric({
name: change.name,
from: formatChange(""),
to: formatChange(change.value)
})
+
+ html = $compile(html)($scope)
+
+ return html[0].outerHTML
else if type == "deleted"
return _.map changes, (change) ->
- # TODO: i18n
return templateChangeDiff({
- name: "deleted custom attribute",
+ name: $translate.instant("ACTIVITY.DELETED_CUSTOM_ATTRIBUTE")
diff: change.name
})
else
@@ -207,7 +209,11 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
else if field == "blocked_note"
return templateChangeDiff({name: getHumanizedFieldName("blocked_note"), diff: value[1]})
else if field == "points"
- return templateChangePoints({points: value})
+ html = templateChangePoints({points: value})
+
+ html = $compile(html)($scope)
+
+ return html[0].outerHTML
else if field == "attachments"
return renderAttachmentEntry(value)
else if field == "custom_attributes"
@@ -216,7 +222,11 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
name = getHumanizedFieldName(field)
removed = _.difference(value[0], value[1])
added = _.difference(value[1], value[0])
- return templateChangeList({name:name, removed:removed, added: added})
+ html = templateChangeList({name:name, removed:removed, added: added})
+
+ html = $compile(html)($scope)
+
+ return html[0].outerHTML
else if field == "assigned_to"
name = getHumanizedFieldName(field)
from = formatChange(value[0] or "Unassigned")
@@ -233,13 +243,12 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
renderChangesHelperText = (change) ->
size = countChanges(change)
- if size == 1
- return "Made #{size} change" # TODO: i18n
- return "Made #{size} changes" # TODO: i18n
+
+ return $translate.instant("ACTIVITY.SIZE_CHANGE", {size: size})
renderComment = (comment) ->
if (comment.delete_comment_date or comment.delete_comment_user?.name)
- return templateDeletedComment({
+ html = templateDeletedComment({
deleteCommentDate: moment(comment.delete_comment_date).format("DD MMM YYYY HH:mm") if comment.delete_comment_date
deleteCommentUser: comment.delete_comment_user.name
deleteComment: comment.comment_html
@@ -247,7 +256,11 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
canRestoreComment: comment.delete_comment_user.pk == $scope.user.id or $scope.project.my_permissions.indexOf("modify_project") > -1
})
- return templateActivity({
+ html = $compile(html)($scope)
+
+ return html[0].outerHTML
+
+ html = templateActivity({
avatar: getUserAvatar(comment.user.pk)
userFullName: comment.user.name
creationDate: moment(comment.created_at).format("DD MMM YYYY HH:mm")
@@ -261,6 +274,10 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
canDeleteComment: comment.user.pk == $scope.user?.id or $scope.project.my_permissions.indexOf("modify_project") > -1
})
+ html = $compile(html)($scope)
+
+ return html[0].outerHTML
+
renderChange = (change) ->
return templateActivity({
avatar: getUserAvatar(change.user.pk)
@@ -281,7 +298,11 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
else
showMore = totalEntries - entries.length
- return templateBaseEntries({entries: entries, showMore:showMore})
+ html = templateBaseEntries({entries: entries, showMore:showMore})
+
+ html = $compile(html)($scope)
+
+ return html
# Render into DOM (operations with dom mutability)
@@ -394,7 +415,9 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
$el.off()
templateFn = ($el, $attrs) ->
- return templateBase({ngmodel: $attrs.ngModel, type: $attrs.type, mode: $attrs.mode})
+ html = templateBase({ngmodel: $attrs.ngModel, type: $attrs.type, mode: $attrs.mode})
+
+ return html
return {
controller: HistoryController
@@ -405,4 +428,4 @@ HistoryDirective = ($log, $loading, $qqueue, $template, $confirm) ->
}
-module.directive("tgHistory", ["$log", "$tgLoading", "$tgQqueue", "$tgTemplate", "$tgConfirm", HistoryDirective])
+module.directive("tgHistory", ["$log", "$tgLoading", "$tgQqueue", "$tgTemplate", "$tgConfirm", "$translate", "$compile", HistoryDirective])
diff --git a/app/coffee/modules/common/importer.coffee b/app/coffee/modules/common/importer.coffee
index e1bdbd96..10a10db8 100644
--- a/app/coffee/modules/common/importer.coffee
+++ b/app/coffee/modules/common/importer.coffee
@@ -22,7 +22,7 @@
module = angular.module("taigaCommon")
-ImportProjectButtonDirective = ($rs, $confirm, $location, $navUrls) ->
+ImportProjectButtonDirective = ($rs, $confirm, $location, $navUrls, $translate) ->
link = ($scope, $el, $attrs) ->
$el.on "click", ".import-project-button", (event) ->
event.preventDefault()
@@ -39,29 +39,25 @@ ImportProjectButtonDirective = ($rs, $confirm, $location, $navUrls) ->
onSuccess = (result) ->
loader.stop()
if result.status == 202 # Async mode
- title = "Our Oompa Loompas are importing your project" # TODO: i18n
- message = "This process could take a few minutes
We will send you
- an email when ready" # TODO: i18n
+ title = $translate.instant("PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE")
+ message = $translate.instant("PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE")
$confirm.success(title, message)
else # result.status == 201 # Sync mode
ctx = {project: result.data.slug}
$location.path($navUrls.resolve("project-admin-project-profile-details", ctx))
- $confirm.notify("success", "Your project has been imported successfuly.") # TODO: i18n
+ msg = $translate.instant("PROJECT.IMPORT.SYNC_SUCCESS")
+ $confirm.notify("success", msg)
onError = (result) ->
loader.stop()
console.log "Error", result
- errorMsg = "Our oompa loompas have some problems importing your dump data.
- Please try again. " # TODO: i18n
+ errorMsg = $translate.instant("PROJECT.IMPORT.ERROR")
if result.status == 429 # TOO MANY REQUESTS
- errorMsg = "Sorry, our oompa loompas are very busy right now.
- Please try again in a few minutes. " # TODO: i18n
+ errorMsg = $translate.instant("PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST")
else if result.data?._error_message
- errorMsg = "Our oompa loompas have some problems importing your dump data:
- #{result.data._error_message}" # TODO: i18n
-
+ errorMsg = $translate.instant("PROJECT.IMPORT.ERROR_MESSAGE", {error_message: result.data._error_message})
$confirm.notify("error", errorMsg)
loader.start()
@@ -69,5 +65,5 @@ ImportProjectButtonDirective = ($rs, $confirm, $location, $navUrls) ->
return {link: link}
-module.directive("tgImportProjectButton", ["$tgResources", "$tgConfirm", "$location", "$tgNavUrls",
+module.directive("tgImportProjectButton", ["$tgResources", "$tgConfirm", "$location", "$tgNavUrls", "$translate",
ImportProjectButtonDirective])
diff --git a/app/coffee/modules/common/lightboxes.coffee b/app/coffee/modules/common/lightboxes.coffee
index d43b6964..f4d089e9 100644
--- a/app/coffee/modules/common/lightboxes.coffee
+++ b/app/coffee/modules/common/lightboxes.coffee
@@ -146,9 +146,10 @@ module.directive("lightbox", ["lightboxService", LightboxDirective])
# Issue/Userstory blocking message lightbox directive.
-BlockLightboxDirective = ($rootscope, $tgrepo, $confirm, lightboxService, $loading, $qqueue) ->
+BlockLightboxDirective = ($rootscope, $tgrepo, $confirm, lightboxService, $loading, $qqueue, $translate) ->
link = ($scope, $el, $attrs, $model) ->
- $el.find("h2.title").text($attrs.title)
+ $translate($attrs.title).then (title) ->
+ $el.find("h2.title").text(title)
unblock = $qqueue.bindAdd (item, finishCallback) =>
promise = $tgrepo.save(item)
@@ -216,14 +217,14 @@ BlockLightboxDirective = ($rootscope, $tgrepo, $confirm, lightboxService, $loadi
require: "ngModel"
}
-module.directive("tgLbBlock", ["$rootScope", "$tgRepo", "$tgConfirm", "lightboxService", "$tgLoading", "$tgQqueue", BlockLightboxDirective])
+module.directive("tgLbBlock", ["$rootScope", "$tgRepo", "$tgConfirm", "lightboxService", "$tgLoading", "$tgQqueue", "$translate", BlockLightboxDirective])
#############################################################################
## Generic Lightbox Blocking-Message Input Directive
#############################################################################
-BlockingMessageInputDirective = ($log, $template) ->
+BlockingMessageInputDirective = ($log, $template, $compile) ->
template = $template.get("common/lightbox/lightbox-blocking-message-input.html", true)
link = ($scope, $el, $attrs, $model) ->
@@ -246,14 +247,14 @@ BlockingMessageInputDirective = ($log, $template) ->
restrict: "EA"
}
-module.directive("tgBlockingMessageInput", ["$log", "$tgTemplate", BlockingMessageInputDirective])
+module.directive("tgBlockingMessageInput", ["$log", "$tgTemplate", "$compile", BlockingMessageInputDirective])
#############################################################################
## Create/Edit Userstory Lightbox Directive
#############################################################################
-CreateEditUserstoryDirective = ($repo, $model, $rs, $rootScope, lightboxService, $loading) ->
+CreateEditUserstoryDirective = ($repo, $model, $rs, $rootScope, lightboxService, $loading, $translate) ->
link = ($scope, $el, attrs) ->
$scope.isNew = true
@@ -270,8 +271,8 @@ CreateEditUserstoryDirective = ($repo, $model, $rs, $rootScope, lightboxService,
})
# Update texts for creation
- $el.find(".button-green").html("Create") #TODO: i18n
- $el.find(".title").html("New user story ") #TODO: i18n
+ $el.find(".button-green").html($translate.instant("COMMON.CREATE"))
+ $el.find(".title").html($translate.instant("LIGHTBOX.CREATE_EDIT_US.NEW_US"))
$el.find(".tag-input").val("")
$el.find(".blocked-note").addClass("hidden")
@@ -286,8 +287,8 @@ CreateEditUserstoryDirective = ($repo, $model, $rs, $rootScope, lightboxService,
$scope.isNew = false
# Update texts for edition
- $el.find(".button-green").html("Save") #TODO: i18n
- $el.find(".title").html("Edit user story ") #TODO: i18n
+ $el.find(".button-green").html($translate.instant("COMMON.SAVE"))
+ $el.find(".title").html($translate.instant("LIGHTBOX.CREATE_EDIT_US.EDIT_US"))
$el.find(".tag-input").val("")
# Update requirement info (team, client or blocked)
@@ -365,6 +366,7 @@ module.directive("tgLbCreateEditUserstory", [
"$rootScope",
"lightboxService",
"$tgLoading",
+ "$translate",
CreateEditUserstoryDirective
])
@@ -427,7 +429,7 @@ module.directive("tgLbCreateBulkUserstories", [
## AssignedTo Lightbox Directive
#############################################################################
-AssignedToLightboxDirective = (lightboxService, lightboxKeyboardNavigationService, $template) ->
+AssignedToLightboxDirective = (lightboxService, lightboxKeyboardNavigationService, $template, $compile) ->
link = ($scope, $el, $attrs) ->
selectedUser = null
selectedItem = null
@@ -461,6 +463,9 @@ AssignedToLightboxDirective = (lightboxService, lightboxKeyboardNavigationServic
}
html = usersTemplate(ctx)
+
+ html = $compile(html)($scope)
+
$el.find("div.watchers").html(html)
lightboxKeyboardNavigationService.init($el)
@@ -520,7 +525,7 @@ AssignedToLightboxDirective = (lightboxService, lightboxKeyboardNavigationServic
}
-module.directive("tgLbAssignedto", ["lightboxService", "lightboxKeyboardNavigationService", "$tgTemplate", AssignedToLightboxDirective])
+module.directive("tgLbAssignedto", ["lightboxService", "lightboxKeyboardNavigationService", "$tgTemplate", "$compile", AssignedToLightboxDirective])
#############################################################################
diff --git a/app/coffee/modules/common/wisiwyg.coffee b/app/coffee/modules/common/wisiwyg.coffee
index 1527ec01..b3bd2073 100644
--- a/app/coffee/modules/common/wisiwyg.coffee
+++ b/app/coffee/modules/common/wisiwyg.coffee
@@ -55,7 +55,7 @@ module = angular.module("taigaCommon")
#############################################################################
## WYSIWYG markitup editor directive
#############################################################################
-tgMarkitupDirective = ($rootscope, $rs, $tr, $selectedText, $template) ->
+tgMarkitupDirective = ($rootscope, $rs, $selectedText, $template, $compile) ->
previewTemplate = $template.get("common/wysiwyg/wysiwyg-markitup-preview.html", true)
link = ($scope, $el, $attrs, $model) ->
@@ -76,7 +76,10 @@ tgMarkitupDirective = ($rootscope, $rs, $tr, $selectedText, $template) ->
markdownDomNode = element.parents(".markdown")
markItUpDomNode = element.parents(".markItUp")
$rs.mdrender.render($scope.projectId, $model.$modelValue).then (data) ->
- markdownDomNode.append(previewTemplate({data: data.data}))
+ html = previewTemplate({data: data.data})
+ html = $compile(html)($scope)
+
+ markdownDomNode.append(html)
markItUpDomNode.hide()
markdown = element.closest(".markdown")
@@ -178,42 +181,43 @@ tgMarkitupDirective = ($rootscope, $rs, $tr, $selectedText, $template) ->
setCaretPosition(data.textarea, markdownCaretPositon) if markdownCaretPositon
+ #I18N
markupSet: [
{
- name: $tr.t("markdown-editor.heading-1")
+ name: "First Level Heading"
key: "1"
- placeHolder: $tr.t("markdown-editor.placeholder")
+ placeHolder: "Your title here..."
closeWith: (markItUp) -> markdownTitle(markItUp, "=")
},
{
- name: $tr.t("markdown-editor.heading-2")
+ name: "Second Level Heading"
key: "2"
- placeHolder: $tr.t("markdown-editor.placeholder")
+ placeHolder: "Your title here..."
closeWith: (markItUp) -> markdownTitle(markItUp, "-")
},
{
- name: $tr.t("markdown-editor.heading-3")
+ name: "Third Level Heading"
key: "3"
openWith: "### "
- placeHolder: $tr.t("markdown-editor.placeholder")
+ placeHolder: "Your title here..."
},
{
separator: "---------------"
},
{
- name: $tr.t("markdown-editor.bold")
+ name: "Bold"
key: "B"
openWith: "**"
closeWith: "**"
},
{
- name: $tr.t("markdown-editor.italic")
+ name: "Italic"
key: "I"
openWith: "_"
closeWith: "_"
},
{
- name: $tr.t("markdown-editor.strike")
+ name: "Strike"
key: "S"
openWith: "~~"
closeWith: "~~"
@@ -222,29 +226,29 @@ tgMarkitupDirective = ($rootscope, $rs, $tr, $selectedText, $template) ->
separator: "---------------"
},
{
- name: $tr.t("markdown-editor.bulleted-list")
+ name: "Bulleted List"
openWith: "- "
},
{
- name: $tr.t("markdown-editor.numeric-list")
+ name: "Numeric List"
openWith: (markItUp) -> markItUp.line+". "
},
{
separator: "---------------"
},
{
- name: $tr.t("markdown-editor.picture")
+ name: "Picture"
key: "P"
replaceWith: '![[![Alternative text]!]](<<<[![Url:!:http://]!]>>> "[![Title]!]")'
beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp)
afterInsert:(markItUp) -> urlFormatting(markItUp)
},
{
- name: $tr.t("markdown-editor.link")
+ name: "Link"
key: "L"
openWith: "["
closeWith: '](<<<[![Url:!:http://]!]>>> "[![Title]!]")'
- placeHolder: $tr.t("markdown-editor.link-placeholder")
+ placeHolder: "Your text to link here..."
beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp)
afterInsert:(markItUp) -> urlFormatting(markItUp)
},
@@ -252,11 +256,11 @@ tgMarkitupDirective = ($rootscope, $rs, $tr, $selectedText, $template) ->
separator: "---------------"
},
{
- name: $tr.t("markdown-editor.quotes")
+ name: "Quotes"
openWith: "> "
},
{
- name: $tr.t("markdown-editor.code-block")
+ name: "Code Block / Code"
openWith: "```\n"
closeWith: "\n```"
},
@@ -264,7 +268,7 @@ tgMarkitupDirective = ($rootscope, $rs, $tr, $selectedText, $template) ->
separator: "---------------"
},
{
- name: $tr.t("markdown-editor.preview")
+ name: "Preview"
call: preview
className: "preview-icon"
},
@@ -338,4 +342,4 @@ tgMarkitupDirective = ($rootscope, $rs, $tr, $selectedText, $template) ->
return {link:link, require:"ngModel"}
-module.directive("tgMarkitup", ["$rootScope", "$tgResources", "$tgI18n", "$selectedText", "$tgTemplate", tgMarkitupDirective])
+module.directive("tgMarkitup", ["$rootScope", "$tgResources", "$selectedText", "$tgTemplate", tgMarkitupDirective])
diff --git a/app/coffee/modules/issues/detail.coffee b/app/coffee/modules/issues/detail.coffee
index 2be4c7d7..130e9113 100644
--- a/app/coffee/modules/issues/detail.coffee
+++ b/app/coffee/modules/issues/detail.coffee
@@ -47,13 +47,14 @@ class IssueDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
"$appTitle",
"$tgAnalytics",
"$tgNavUrls",
+ "$translate",
"tgLoader"
]
constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location,
- @log, @appTitle, @analytics, @navUrls, tgLoader) ->
+ @log, @appTitle, @analytics, @navUrls, @translate, tgLoader) ->
@scope.issueRef = @params.issueref
- @scope.sectionName = "Issue Details"
+ @scope.sectionName = @translate.instant("ISSUES.SECTION_NAME")
@.initializeEventHandlers()
promise = @.loadInitialData()
@@ -145,7 +146,7 @@ module.controller("IssueDetailController", IssueDetailController)
## Issue status display directive
#############################################################################
-IssueStatusDisplayDirective = ($template)->
+IssueStatusDisplayDirective = ($template, $compile)->
# Display if a Issue is open or closed and its issueboard status.
#
# Example:
@@ -162,6 +163,9 @@ IssueStatusDisplayDirective = ($template)->
html = template({
status: $scope.statusById[issue.status]
})
+
+ html = $compile(html)($scope)
+
$el.html(html)
$scope.$watch $attrs.ngModel, (issue) ->
@@ -176,14 +180,14 @@ IssueStatusDisplayDirective = ($template)->
require: "ngModel"
}
-module.directive("tgIssueStatusDisplay", ["$tgTemplate", IssueStatusDisplayDirective])
+module.directive("tgIssueStatusDisplay", ["$tgTemplate", "$compile", IssueStatusDisplayDirective])
#############################################################################
## Issue status button directive
#############################################################################
-IssueStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template) ->
+IssueStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->
# Display the status of Issue and you can edit it.
#
# Example:
@@ -208,6 +212,9 @@ IssueStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $t
statuses: $scope.statusList
editable: isEditable()
})
+
+ html = $compile(html)($scope)
+
$el.html(html)
save = $qqueue.bindAdd (statusId) =>
@@ -259,13 +266,13 @@ IssueStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $t
require: "ngModel"
}
-module.directive("tgIssueStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", IssueStatusButtonDirective])
+module.directive("tgIssueStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", "$compile", IssueStatusButtonDirective])
#############################################################################
## Issue type button directive
#############################################################################
-IssueTypeButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template) ->
+IssueTypeButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->
# Display the type of Issue and you can edit it.
#
# Example:
@@ -285,6 +292,8 @@ IssueTypeButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $tem
render = (issue) =>
type = $scope.typeById[issue.type]
+ html = $compile(html)($scope)
+
html = template({
type: type
typees: $scope.typeList
@@ -340,14 +349,14 @@ IssueTypeButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $tem
require: "ngModel"
}
-module.directive("tgIssueTypeButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", IssueTypeButtonDirective])
+module.directive("tgIssueTypeButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", "$compile", IssueTypeButtonDirective])
#############################################################################
## Issue severity button directive
#############################################################################
-IssueSeverityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template) ->
+IssueSeverityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->
# Display the severity of Issue and you can edit it.
#
# Example:
@@ -372,6 +381,9 @@ IssueSeverityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue,
severityes: $scope.severityList
editable: isEditable()
})
+
+ html = $compile(html)($scope)
+
$el.html(html)
save = $qqueue.bindAdd (severity) =>
@@ -424,14 +436,14 @@ IssueSeverityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue,
require: "ngModel"
}
-module.directive("tgIssueSeverityButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", IssueSeverityButtonDirective])
+module.directive("tgIssueSeverityButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", "$compile", IssueSeverityButtonDirective])
#############################################################################
## Issue priority button directive
#############################################################################
-IssuePriorityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template) ->
+IssuePriorityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) ->
# Display the priority of Issue and you can edit it.
#
# Example:
@@ -456,6 +468,9 @@ IssuePriorityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue,
priorityes: $scope.priorityList
editable: isEditable()
})
+
+ html = $compile(html)($scope)
+
$el.html(html)
save = $qqueue.bindAdd (priority) =>
@@ -508,14 +523,14 @@ IssuePriorityButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue,
require: "ngModel"
}
-module.directive("tgIssuePriorityButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", IssuePriorityButtonDirective])
+module.directive("tgIssuePriorityButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", "$compile", IssuePriorityButtonDirective])
#############################################################################
## Promote Issue to US button directive
#############################################################################
-PromoteIssueToUsButtonDirective = ($rootScope, $repo, $confirm, $qqueue) ->
+PromoteIssueToUsButtonDirective = ($rootScope, $repo, $confirm, $qqueue, $translate) ->
link = ($scope, $el, $attrs, $model) ->
save = $qqueue.bindAdd (issue, finish) =>
@@ -545,8 +560,8 @@ PromoteIssueToUsButtonDirective = ($rootScope, $repo, $confirm, $qqueue) ->
event.preventDefault()
issue = $model.$modelValue
- title = "Promote this issue to a new user story" # TODO: i18n
- message = "Are you sure you want to create a new US from this Issue?" # TODO: i18n
+ title = $translate.instant("ISSUES.CONFIRM_PROMOTE.TITLE")
+ message = $translate.instant("ISSUES.CONFIRM_PROMOTE.MESSAGE")
subtitle = issue.subject
$confirm.ask(title, subtitle, message).then (finish) =>
@@ -563,5 +578,5 @@ PromoteIssueToUsButtonDirective = ($rootScope, $repo, $confirm, $qqueue) ->
link: link
}
-module.directive("tgPromoteIssueToUsButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgQqueue",
+module.directive("tgPromoteIssueToUsButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgQqueue", "$translate"
PromoteIssueToUsButtonDirective])
diff --git a/app/coffee/modules/issues/list.coffee b/app/coffee/modules/issues/list.coffee
index 7bc3a7ef..f13d5e16 100644
--- a/app/coffee/modules/issues/list.coffee
+++ b/app/coffee/modules/issues/list.coffee
@@ -310,7 +310,7 @@ module.controller("IssuesController", IssuesController)
## Issues Directive
#############################################################################
-IssuesDirective = ($log, $location, $template) ->
+IssuesDirective = ($log, $location, $template, $compile) ->
## Issues Pagination
template = $template.get("issue/issue-paginator.html", true)
@@ -360,7 +360,11 @@ IssuesDirective = ($log, $location, $template) ->
else
pages.push({classes: "page", num: i, type: "page"})
- $pagEl.html(template(options))
+
+ html = template(options)
+ html = $compile(html)($scope)
+
+ $pagEl.html(html)
$scope.$watch "issues", (value) ->
# Do nothing if value is not logical true
@@ -427,14 +431,14 @@ IssuesDirective = ($log, $location, $template) ->
return {link:link}
-module.directive("tgIssues", ["$log", "$tgLocation", "$tgTemplate", IssuesDirective])
+module.directive("tgIssues", ["$log", "$tgLocation", "$tgTemplate", "$compile", IssuesDirective])
#############################################################################
## Issues Filters Directive
#############################################################################
-IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template) ->
+IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template, $translate) ->
template = $template.get("issue/issues-filters.html", true)
templateSelected = $template.get("issue/issues-filters-selected.html", true)
@@ -590,8 +594,8 @@ IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template) -
target = angular.element(event.currentTarget)
customFilterName = target.parent().data('id')
- title = "Delete custom filter" # TODO: i18n
- message = "the custom filter '#{customFilterName}'" # TODO: i18n
+ title = $translate.instant("ISSUES.FILTERS.CONFIRM_DELETE.TITLE")
+ message = $translate.instant("ISSUES.FILTERS.CONFIRM_DELETE.MESSAGE", {customFilterName: customFilterName})
$confirm.askOnDelete(title, message).then (finish) ->
promise = $ctrl.deleteMyFilter(customFilterName)
@@ -652,7 +656,7 @@ IssuesFiltersDirective = ($log, $location, $rs, $confirm, $loading, $template) -
return {link:link}
-module.directive("tgIssuesFilters", ["$log", "$tgLocation", "$tgResources", "$tgConfirm", "$tgLoading", "$tgTemplate",
+module.directive("tgIssuesFilters", ["$log", "$tgLocation", "$tgResources", "$tgConfirm", "$tgLoading", "$tgTemplate", "$translate",
IssuesFiltersDirective])
diff --git a/app/coffee/modules/kanban/main.coffee b/app/coffee/modules/kanban/main.coffee
index b56a46a7..bb2fc5dc 100644
--- a/app/coffee/modules/kanban/main.coffee
+++ b/app/coffee/modules/kanban/main.coffee
@@ -307,10 +307,9 @@ module.directive("tgKanban", ["$tgRepo", "$rootScope", KanbanDirective])
## Kanban Archived Status Column Header Control
#############################################################################
-KanbanArchivedStatusHeaderDirective = ($rootscope) ->
- #TODO: i18N
- showArchivedText = "Show archived"
- hideArchivedText = "Hide archived"
+KanbanArchivedStatusHeaderDirective = ($rootscope, $translate) ->
+ showArchivedText = $translate.instant("KANBAN.ACTION_SHOW_ARCHIVED")
+ hideArchivedText = $translate.instant("KANBAN.ACTION_HIDE_ARCHIVED")
link = ($scope, $el, $attrs) ->
status = $scope.$eval($attrs.tgKanbanArchivedStatusHeader)
@@ -338,19 +337,18 @@ KanbanArchivedStatusHeaderDirective = ($rootscope) ->
return {link:link}
-module.directive("tgKanbanArchivedStatusHeader", [ "$rootScope", KanbanArchivedStatusHeaderDirective])
+module.directive("tgKanbanArchivedStatusHeader", [ "$rootScope", "$translate", KanbanArchivedStatusHeaderDirective])
#############################################################################
## Kanban Archived Status Column Intro Directive
#############################################################################
-KanbanArchivedStatusIntroDirective = ->
- # TODO: i18n
- hiddenUserStoriexText = "The user stories in this status are hidden by default"
+KanbanArchivedStatusIntroDirective = ($translate) ->
userStories = []
link = ($scope, $el, $attrs) ->
+ hiddenUserStoriexText = $translate.instant("KANBAN.HIDDEN_USER_STORIES")
status = $scope.$eval($attrs.tgKanbanArchivedStatusIntro)
$el.text(hiddenUserStoriexText)
@@ -397,7 +395,7 @@ KanbanArchivedStatusIntroDirective = ->
return {link:link}
-module.directive("tgKanbanArchivedStatusIntro", KanbanArchivedStatusIntroDirective)
+module.directive("tgKanbanArchivedStatusIntro", ["$translate", KanbanArchivedStatusIntroDirective])
#############################################################################
@@ -495,14 +493,14 @@ module.directive("tgKanbanWipLimit", KanbanWipLimitDirective)
## Kanban User Directive
#############################################################################
-KanbanUserDirective = ($log) ->
+KanbanUserDirective = ($log, $compile) ->
template = _.template("""
- class="not-clickable"<% } %>>
+ class="not-clickable"<% } %>>
- """) # TODO: i18n
+ """)
clickable = false
@@ -527,7 +525,7 @@ KanbanUserDirective = ($log) ->
else
ctx = {name: user.full_name_display, imgurl: user.photo, clickable: clickable}
- html = template(ctx)
+ html = $compile(template(ctx))($scope)
$el.html(html)
username_label.text(ctx.name)
@@ -556,4 +554,4 @@ KanbanUserDirective = ($log) ->
return {link: link, require:"ngModel"}
-module.directive("tgKanbanUserAvatar", ["$log", KanbanUserDirective])
+module.directive("tgKanbanUserAvatar", ["$log", "$compile", KanbanUserDirective])
diff --git a/app/coffee/modules/locales.coffee b/app/coffee/modules/locales.coffee
deleted file mode 100644
index c5f75116..00000000
--- a/app/coffee/modules/locales.coffee
+++ /dev/null
@@ -1,22 +0,0 @@
-###
-# Copyright (C) 2014 Andrey Antukh
-# Copyright (C) 2014 Jesús Espino Garcia
-# Copyright (C) 2014 David Barragán Merino
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-# File: modules/locales.coffee
-###
-
-module = angular.module("taigaLocales", [])
diff --git a/app/coffee/modules/locales/.empty b/app/coffee/modules/locales/.empty
deleted file mode 100644
index e69de29b..00000000
diff --git a/app/coffee/modules/projects/lightboxes.coffee b/app/coffee/modules/projects/lightboxes.coffee
index c38afbc8..e83d328b 100644
--- a/app/coffee/modules/projects/lightboxes.coffee
+++ b/app/coffee/modules/projects/lightboxes.coffee
@@ -26,7 +26,7 @@ debounce = @.taiga.debounce
module = angular.module("taigaProject")
-CreateProject = ($rootscope, $repo, $confirm, $location, $navurls, $rs, $projectUrl, $loading, lightboxService, $cacheFactory) ->
+CreateProject = ($rootscope, $repo, $confirm, $location, $navurls, $rs, $projectUrl, $loading, lightboxService, $cacheFactory, $translate) ->
link = ($scope, $el, attrs) ->
$scope.data = {}
$scope.templates = []
@@ -41,7 +41,9 @@ CreateProject = ($rootscope, $repo, $confirm, $location, $navurls, $rs, $project
$loading.finish(submitButton)
$rootscope.$broadcast("projects:reload")
- $confirm.notify("success", "Success") #TODO: i18n
+
+ $confirm.notify("success", $translate.instant("COMMON.SAVE"))
+
$location.url($projectUrl.get(response))
lightboxService.close($el)
@@ -126,7 +128,7 @@ CreateProject = ($rootscope, $repo, $confirm, $location, $navurls, $rs, $project
return {link:link}
module.directive("tgLbCreateProject", ["$rootScope", "$tgRepo", "$tgConfirm", "$location", "$tgNavUrls",
- "$tgResources", "$projectUrl", "$tgLoading", "lightboxService", "$cacheFactory", CreateProject])
+ "$tgResources", "$projectUrl", "$tgLoading", "lightboxService", "$cacheFactory", "$translate", CreateProject])
#############################################################################
diff --git a/app/coffee/modules/related-tasks.coffee b/app/coffee/modules/related-tasks.coffee
index 740f12d9..2aaa96ea 100644
--- a/app/coffee/modules/related-tasks.coffee
+++ b/app/coffee/modules/related-tasks.coffee
@@ -25,7 +25,7 @@ debounce = @.taiga.debounce
module = angular.module("taigaRelatedTasks", [])
-RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $template) ->
+RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $template, $translate) ->
templateView = $template.get("task/related-task-row.html", true)
templateEdit = $template.get("task/related-task-row-edit.html", true)
@@ -79,9 +79,8 @@ RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $tem
$el.find('input').focus().select()
$el.on "click", ".delete-task", (event) ->
- #TODO: i18n
+ title = $translate.instant("TASK.TITLE_DELETE_ACTION")
task = $model.$modelValue
- title = "Delete Task"
message = task.subject
$confirm.askOnDelete(title, message).then (finish) ->
@@ -109,7 +108,7 @@ RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $tem
return {link:link, require:"ngModel"}
-module.directive("tgRelatedTaskRow", ["$tgRepo", "$compile", "$tgConfirm", "$rootScope", "$tgLoading", "$tgTemplate", RelatedTaskRowDirective])
+module.directive("tgRelatedTaskRow", ["$tgRepo", "$compile", "$tgConfirm", "$rootScope", "$tgLoading", "$tgTemplate", "$translate", RelatedTaskRowDirective])
RelatedTaskCreateFormDirective = ($repo, $compile, $confirm, $tgmodel, $loading, $analytics, $template) ->
template = $template.get("task/related-task-create-form.html", true)
diff --git a/app/coffee/modules/resources/projects.coffee b/app/coffee/modules/resources/projects.coffee
index 88393f48..a311609c 100644
--- a/app/coffee/modules/resources/projects.coffee
+++ b/app/coffee/modules/resources/projects.coffee
@@ -24,7 +24,7 @@ taiga = @.taiga
sizeFormat = @.taiga.sizeFormat
-resourceProvider = ($config, $repo, $http, $urls, $auth, $q, $rootScope) ->
+resourceProvider = ($config, $repo, $http, $urls, $auth, $q, $rootScope, $translate) ->
service = {}
service.get = (projectId) ->
@@ -99,7 +99,7 @@ resourceProvider = ($config, $repo, $http, $urls, $auth, $q, $rootScope) ->
statusUpdater("in-progress", null, message, percent)
uploadComplete = (evt) =>
- statusUpdater("done", "Importing Project", "This process can take a while, please keep the window open.") # i18n
+ statusUpdater("done", $translate.instant("PROJECT.IMPORT.TITLE"), $translate.instant("PROJECT.IMPORT.DESCRIPTION"))
uploadFailed = (evt) =>
statusUpdater("error")
@@ -141,5 +141,4 @@ resourceProvider = ($config, $repo, $http, $urls, $auth, $q, $rootScope) ->
module = angular.module("taigaResources")
-module.factory("$tgProjectsResourcesProvider", ["$tgConfig", "$tgRepo", "$tgHttp", "$tgUrls", "$tgAuth", "$q",
- resourceProvider])
+module.factory("$tgProjectsResourcesProvider", ["$tgConfig", "$tgRepo", "$tgHttp", "$tgUrls", "$tgAuth", "$q", "$translate", resourceProvider])
diff --git a/app/coffee/modules/taskboard/charts.coffee b/app/coffee/modules/taskboard/charts.coffee
index 55b80cc3..20098ab4 100644
--- a/app/coffee/modules/taskboard/charts.coffee
+++ b/app/coffee/modules/taskboard/charts.coffee
@@ -85,14 +85,20 @@ SprintGraphDirective = ->
tooltip: true
tooltipOpts:
content: (label, xval, yval, flotItem) ->
- #TODO: i18n
formattedDate = moment(xval).format("DD MMM")
roundedValue = Math.round(yval)
+
if flotItem.seriesIndex == 1
- return "Optimal pending points for day #{formattedDate} should be #{roundedValue}"
+ return $translate.instant("TASKBOARD.CHARTS.OPTIMAL", {
+ formattedDate: formattedDate,
+ roundedValue: roundedValue
+ })
else
- return "Real pending points for day #{formattedDate} is #{roundedValue}"
+ return $translate.instant("TASKBOARD.CHARTS.REAL", {
+ formattedDate: formattedDate,
+ roundedValue: roundedValue
+ })
element.empty()
element.plot(data, options).data("plot")
diff --git a/app/coffee/modules/taskboard/lightboxes.coffee b/app/coffee/modules/taskboard/lightboxes.coffee
index 367aba17..c57e67eb 100644
--- a/app/coffee/modules/taskboard/lightboxes.coffee
+++ b/app/coffee/modules/taskboard/lightboxes.coffee
@@ -23,7 +23,7 @@ taiga = @.taiga
bindOnce = @.taiga.bindOnce
debounce = @.taiga.debounce
-CreateEditTaskDirective = ($repo, $model, $rs, $rootscope, $loading, lightboxService) ->
+CreateEditTaskDirective = ($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate) ->
link = ($scope, $el, attrs) ->
$scope.isNew = true
@@ -40,10 +40,13 @@ CreateEditTaskDirective = ($repo, $model, $rs, $rootscope, $loading, lightboxSer
$scope.isNew = true
# Update texts for creation
- $el.find(".button-green").html("Create") #TODO: i18n
- $el.find(".title").html("New task ") #TODO: i18n
- $el.find(".tag-input").val("")
+ create = $translate.instant("COMMON.CREATE")
+ $el.find(".button-green").html(create)
+ newTask = $translate.instant("LIGHTBOX.CREATE_EDIT_TASK.TITLE")
+ $el.find(".title").html(newTask + " ")
+
+ $el.find(".tag-input").val("")
lightboxService.open($el)
$scope.$on "taskform:edit", (ctx, task) ->
@@ -51,10 +54,13 @@ CreateEditTaskDirective = ($repo, $model, $rs, $rootscope, $loading, lightboxSer
$scope.isNew = false
# Update texts for edition
- $el.find(".button-green").html("Save") #TODO: i18n
- $el.find(".title").html("Edit task ") #TODO: i18n
- $el.find(".tag-input").val("")
+ save = $translate.instant("COMMON.SAVE")
+ edit = $translate.instant("LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT")
+ $el.find(".button-green").html(save)
+ $el.find(".title").html(edit + " ")
+
+ $el.find(".tag-input").val("")
lightboxService.open($el)
@@ -142,6 +148,7 @@ module.directive("tgLbCreateEditTask", [
"$rootScope",
"$tgLoading",
"lightboxService",
+ "$translate"
CreateEditTaskDirective
])
diff --git a/app/coffee/modules/taskboard/main.coffee b/app/coffee/modules/taskboard/main.coffee
index 8a922148..e28db184 100644
--- a/app/coffee/modules/taskboard/main.coffee
+++ b/app/coffee/modules/taskboard/main.coffee
@@ -259,7 +259,6 @@ TaskboardDirective = ($rootscope) ->
event.preventDefault()
target = angular.element(event.currentTarget)
target.toggleClass('active');
- #toggleText(target, ["Hide statistics", "Show statistics"]) # TODO: i18n
$rootscope.$broadcast("taskboard:graph:toggle-visibility")
tableBodyDom = $el.find(".taskboard-table-body")
diff --git a/app/coffee/modules/tasks/detail.coffee b/app/coffee/modules/tasks/detail.coffee
index 353fbaff..d35dbb93 100644
--- a/app/coffee/modules/tasks/detail.coffee
+++ b/app/coffee/modules/tasks/detail.coffee
@@ -145,7 +145,7 @@ module.controller("TaskDetailController", TaskDetailController)
## Task status display directive
#############################################################################
-TaskStatusDisplayDirective = ($template) ->
+TaskStatusDisplayDirective = ($template, $compile) ->
# Display if a Task is open or closed and its taskboard status.
#
# Example:
@@ -162,6 +162,9 @@ TaskStatusDisplayDirective = ($template) ->
html = template({
status: $scope.statusById[task.status]
})
+
+ html = $compile(html)($scope)
+
$el.html(html)
$scope.$watch $attrs.ngModel, (task) ->
@@ -176,14 +179,14 @@ TaskStatusDisplayDirective = ($template) ->
require: "ngModel"
}
-module.directive("tgTaskStatusDisplay", ["$tgTemplate", TaskStatusDisplayDirective])
+module.directive("tgTaskStatusDisplay", ["$tgTemplate", "$compile", TaskStatusDisplayDirective])
#############################################################################
## Task status button directive
#############################################################################
-TaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
+TaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue, $translate) ->
# Display the status of Task and you can edit it.
#
# Example:
@@ -199,7 +202,7 @@ TaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
<%- status.name %>
<% if(editable){ %><% }%>
- status
+
<% _.each(statuses, function(st) { %>
@@ -208,7 +211,7 @@ TaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
<% }); %>
- """) #TODO: i18n
+ """)
link = ($scope, $el, $attrs, $model) ->
isEditable = ->
@@ -217,11 +220,12 @@ TaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
render = (task) =>
status = $scope.statusById[task.status]
- html = template({
+ html = $compile(template({
status: status
statuses: $scope.statusList
editable: isEditable()
- })
+ }))($scope)
+
$el.html(html)
save = $qqueue.bindAdd (status) =>
@@ -274,7 +278,7 @@ TaskStatusButtonDirective = ($rootScope, $repo, $confirm, $loading, $qqueue) ->
require: "ngModel"
}
-module.directive("tgTaskStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue",
+module.directive("tgTaskStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$translate",
TaskStatusButtonDirective])
diff --git a/app/coffee/modules/team/main.coffee b/app/coffee/modules/team/main.coffee
index 9bc9b57a..edfc9e5d 100644
--- a/app/coffee/modules/team/main.coffee
+++ b/app/coffee/modules/team/main.coffee
@@ -41,18 +41,19 @@ class TeamController extends mixOf(taiga.Controller, taiga.PageMixin)
"$tgNavUrls",
"$appTitle",
"$tgAuth",
- "tgLoader"
+ "tgLoader",
+ "$translate"
]
- constructor: (@scope, @rootscope, @repo, @rs, @params, @q, @location, @navUrls, @appTitle, @auth, tgLoader) ->
- @scope.sectionName = "Team"
+ constructor: (@scope, @rootscope, @repo, @rs, @params, @q, @location, @navUrls, @appTitle, @auth, tgLoader, @translate) ->
+ @scope.sectionName = "TEAM.SECTION_NAME"
promise = @.loadInitialData()
# On Success
promise.then =>
- #TODO: i18n
- @appTitle.set("Team - " + @scope.project.name)
+ text = @translate.instant("TEAM.APP_TITLE", {"projectName": @scope.project.name})
+ @appTitle.set(text)
# On Error
promise.then null, @.onInitialDataError.bind(@)
@@ -211,11 +212,13 @@ module.directive("tgTeamMembers", TeamMembersDirective)
## Leave project Directive
#############################################################################
-LeaveProjectDirective = ($repo, $confirm, $location, $rs, $navurls) ->
+LeaveProjectDirective = ($repo, $confirm, $location, $rs, $navurls, $translate) ->
link = ($scope, $el, $attrs) ->
$scope.leave = () ->
- #TODO: i18n
- $confirm.ask("Leave this project", "Are you sure you want to leave the project?").then (finish) =>
+ leave_project_text = $translate.instant("TEAM.ACTION_LEAVE_PROJECT")
+ confirm_leave_project_text = $translate.instant("TEAM.CONFIRM_LEAVE_PROJECT")
+
+ $confirm.ask(leave_project_text, confirm_leave_project_text).then (finish) =>
promise = $rs.projects.leave($attrs.projectid)
promise.then =>
diff --git a/app/coffee/modules/user-settings/change-password.coffee b/app/coffee/modules/user-settings/change-password.coffee
index d8df8ddd..387b92d6 100644
--- a/app/coffee/modules/user-settings/change-password.coffee
+++ b/app/coffee/modules/user-settings/change-password.coffee
@@ -42,11 +42,12 @@ class UserChangePasswordController extends mixOf(taiga.Controller, taiga.PageMix
"$q",
"$tgLocation",
"$tgNavUrls",
- "$tgAuth"
+ "$tgAuth",
+ "$translate"
]
- constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @auth) ->
- @scope.sectionName = "Change Password" #i18n
+ constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @auth, @translate) ->
+ @scope.sectionName = @translate.instant("CHANGE_PASSWORD.SECTION_NAME")
@scope.project = {}
@scope.user = @auth.getUser()
@@ -74,13 +75,13 @@ module.controller("UserChangePasswordController", UserChangePasswordController)
## User ChangePassword Directive
#############################################################################
-UserChangePasswordDirective = ($rs, $confirm, $loading) ->
+UserChangePasswordDirective = ($rs, $confirm, $loading, $translate) ->
link = ($scope, $el, $attrs, ctrl) ->
submit = debounce 2000, (event) =>
event.preventDefault()
if $scope.newPassword1 != $scope.newPassword2
- $confirm.notify('error', "The passwords dosn't match")
+ $confirm.notify('error', $translate.instant("CHANGE_PASSWORD.ERROR_PASSWORD_MATCH"))
return
$loading.start(submitButton)
diff --git a/app/coffee/modules/user-settings/main.coffee b/app/coffee/modules/user-settings/main.coffee
index 656decd4..654aee69 100644
--- a/app/coffee/modules/user-settings/main.coffee
+++ b/app/coffee/modules/user-settings/main.coffee
@@ -41,17 +41,20 @@ class UserSettingsController extends mixOf(taiga.Controller, taiga.PageMixin)
"$q",
"$tgLocation",
"$tgNavUrls",
- "$tgAuth"
+ "$tgAuth",
+ "$translate"
]
- constructor: (@scope, @rootscope, @config, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @auth) ->
- @scope.sectionName = "User Profile" #i18n
+ constructor: (@scope, @rootscope, @config, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @auth, @translate) ->
+ @scope.sectionName = "USER_SETTINGS.MENU.SECTION_TITLE"
+
@scope.project = {}
@scope.user = @auth.getUser()
+ @scope.lang = @getLan()
maxFileSize = @config.get("maxUploadFileSize", null)
if maxFileSize
- @scope.maxFileSizeMsg = "[Max, size: #{sizeFormat(maxFileSize)}" # TODO: i18n
+ @scope.maxFileSizeMsg = @translate.instant("USER_SETTINGS.AVATAR_MAX_SIZE", {"maxFileSize": sizeFormat(maxFileSize)})
promise = @.loadInitialData()
@@ -73,6 +76,10 @@ class UserSettingsController extends mixOf(taiga.Controller, taiga.PageMixin)
openDeleteLightbox: ->
@rootscope.$broadcast("deletelightbox:new", @scope.user)
+ getLan: ->
+ return @scope.user.lang ||
+ @translate.preferredLanguage()
+
module.controller("UserSettingsController", UserSettingsController)
@@ -80,7 +87,7 @@ module.controller("UserSettingsController", UserSettingsController)
## User Profile Directive
#############################################################################
-UserProfileDirective = ($confirm, $auth, $repo) ->
+UserProfileDirective = ($confirm, $auth, $repo, $translate) ->
link = ($scope, $el, $attrs) ->
submit = debounce 2000, (event) =>
event.preventDefault()
@@ -90,13 +97,15 @@ UserProfileDirective = ($confirm, $auth, $repo) ->
changeEmail = $scope.user.isAttributeModified("email")
+ $scope.user.lang = $scope.lang
+ $translate.use($scope.user.lang)
+
onSuccess = (data) =>
$auth.setUser(data)
if changeEmail
- $confirm.success("Check your inbox!
- We have sent a mail to your account
- with the instructions to set your new address") #TODO: i18n
+ text = $translate.instant("USER_PROFILE.CHANGE_EMAIL_SUCCESS")
+ $confirm.success(text)
else
$confirm.notify('success')
@@ -113,7 +122,7 @@ UserProfileDirective = ($confirm, $auth, $repo) ->
return {link:link}
-module.directive("tgUserProfile", ["$tgConfirm", "$tgAuth", "$tgRepo", UserProfileDirective])
+module.directive("tgUserProfile", ["$tgConfirm", "$tgAuth", "$tgRepo", "$translate", UserProfileDirective])
#############################################################################
diff --git a/app/coffee/modules/user-settings/notifications.coffee b/app/coffee/modules/user-settings/notifications.coffee
index 6af3c428..d81814ff 100644
--- a/app/coffee/modules/user-settings/notifications.coffee
+++ b/app/coffee/modules/user-settings/notifications.coffee
@@ -45,7 +45,7 @@ class UserNotificationsController extends mixOf(taiga.Controller, taiga.PageMixi
]
constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, @navUrls, @auth) ->
- @scope.sectionName = "Email Notifications" #i18n
+ @scope.sectionName = "USER_SETTINGS.NOTIFICATIONS.SECTION_NAME"
@scope.project = {}
@scope.user = @auth.getUser()
diff --git a/app/coffee/modules/userstories/detail.coffee b/app/coffee/modules/userstories/detail.coffee
index 7347f72d..23f0612a 100644
--- a/app/coffee/modules/userstories/detail.coffee
+++ b/app/coffee/modules/userstories/detail.coffee
@@ -154,7 +154,7 @@ module.controller("UserStoryDetailController", UserStoryDetailController)
## User story status display directive
#############################################################################
-UsStatusDisplayDirective = ($template) ->
+UsStatusDisplayDirective = ($template, $compile) ->
# Display if a US is open or closed and its kanban status.
#
# Example:
@@ -164,14 +164,19 @@ UsStatusDisplayDirective = ($template) ->
# - US object (ng-model)
# - scope.statusById object
- template = $template.get("common/components/status-display.html", true)
+ template = $template.get("common/components/status-display.html")
link = ($scope, $el, $attrs) ->
render = (us) ->
- html = template({
+ statusScope = $scope.$new()
+
+ _.assign(statusScope, {
is_closed: us.is_closed
status: $scope.statusById[us.status]
})
+
+ html = $compile(html)(statusScope)
+
$el.html(html)
$scope.$watch $attrs.ngModel, (us) ->
@@ -186,14 +191,14 @@ UsStatusDisplayDirective = ($template) ->
require: "ngModel"
}
-module.directive("tgUsStatusDisplay", ["$tgTemplate", UsStatusDisplayDirective])
+module.directive("tgUsStatusDisplay", ["$tgTemplate", "$compile", UsStatusDisplayDirective])
#############################################################################
## User story related tasts progress splay Directive
#############################################################################
-UsTasksProgressDisplayDirective = ($template) ->
+UsTasksProgressDisplayDirective = ($template, $compile) ->
# Display a progress bar with the stats of completed tasks.
#
# Example:
@@ -203,8 +208,6 @@ UsTasksProgressDisplayDirective = ($template) ->
# - Task object list (ng-model)
# - scope.taskStatusById object
- template = $template.get("us/us-task-progress.html", true)
-
link = ($scope, $el, $attrs) ->
render = (tasks) ->
totalTasks = tasks.length
@@ -212,12 +215,14 @@ UsTasksProgressDisplayDirective = ($template) ->
progress = if totalTasks > 0 then 100 * totalClosedTasks / totalTasks else 0
- html = template({
+ _.assign($scope, {
totalTasks: totalTasks
totalClosedTasks: totalClosedTasks
- progress: progress
+ progress: progress,
+ style: {
+ width: progress + "%"
+ }
})
- $el.html(html)
$scope.$watch $attrs.ngModel, (tasks) ->
render(tasks) if tasks?
@@ -226,12 +231,14 @@ UsTasksProgressDisplayDirective = ($template) ->
$el.off()
return {
+ templateUrl: "us/us-task-progress.html"
link: link
restrict: "EA"
require: "ngModel"
+ scope: true
}
-module.directive("tgUsTasksProgressDisplay", ["$tgTemplate", UsTasksProgressDisplayDirective])
+module.directive("tgUsTasksProgressDisplay", ["$tgTemplate", "$compile", UsTasksProgressDisplayDirective])
#############################################################################
@@ -326,7 +333,7 @@ module.directive("tgUsStatusButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$t
## User story team requirements button directive
#############################################################################
-UsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template) ->
+UsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) ->
template = $template.get("us/us-team-requirement-button.html", true)
link = ($scope, $el, $attrs, $model) ->
@@ -343,6 +350,8 @@ UsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qq
isRequired: us.team_requirement
}
html = template(ctx)
+ html = $compile(html)($scope)
+
$el.html(html)
save = $qqueue.bindAdd (team_requirement) =>
@@ -383,13 +392,13 @@ UsTeamRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qq
require: "ngModel"
}
-module.directive("tgUsTeamRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", UsTeamRequirementButtonDirective])
+module.directive("tgUsTeamRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", "$compile", UsTeamRequirementButtonDirective])
#############################################################################
## User story client requirements button directive
#############################################################################
-UsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template) ->
+UsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) ->
template = $template.get("us/us-client-requirement-button.html", true)
link = ($scope, $el, $attrs, $model) ->
@@ -405,7 +414,7 @@ UsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $
canEdit: canEdit()
isRequired: us.client_requirement
}
- html = template(ctx)
+ html = $compile(template(ctx))($scope)
$el.html(html)
save = $qqueue.bindAdd (client_requirement) =>
@@ -443,5 +452,5 @@ UsClientRequirementButtonDirective = ($rootscope, $tgrepo, $confirm, $loading, $
require: "ngModel"
}
-module.directive("tgUsClientRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate",
+module.directive("tgUsClientRequirementButton", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQqueue", "$tgTemplate", "$compile",
UsClientRequirementButtonDirective])
diff --git a/app/coffee/modules/wiki/main.coffee b/app/coffee/modules/wiki/main.coffee
index 9596212b..a6368f56 100644
--- a/app/coffee/modules/wiki/main.coffee
+++ b/app/coffee/modules/wiki/main.coffee
@@ -49,11 +49,12 @@ class WikiDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
"$appTitle",
"$tgNavUrls",
"$tgAnalytics",
- "tgLoader"
+ "tgLoader",
+ "$translate"
]
constructor: (@scope, @rootscope, @repo, @model, @confirm, @rs, @params, @q, @location,
- @filter, @log, @appTitle, @navUrls, @analytics, tgLoader) ->
+ @filter, @log, @appTitle, @navUrls, @analytics, tgLoader, @translate) ->
@scope.projectSlug = @params.pslug
@scope.wikiSlug = @params.slug
@scope.sectionName = "Wiki"
@@ -111,8 +112,7 @@ class WikiDetailController extends mixOf(taiga.Controller, taiga.PageMixin)
@q.all([@.loadWikiLinks(), @.loadWiki()])
delete: ->
- # TODO: i18n
- title = "Delete Wiki Page"
+ title = @translate.instant("WIKI.DELETE_LIGHTBOX_TITLE")
message = unslugify(@scope.wiki.slug)
@confirm.askOnDelete(title, message).then (finish) =>
@@ -135,7 +135,7 @@ module.controller("WikiDetailController", WikiDetailController)
## Wiki Summary Directive
#############################################################################
-WikiSummaryDirective = ($log, $template) ->
+WikiSummaryDirective = ($log, $template, $compile) ->
template = $template.get("wiki/wiki-summary.html", true)
link = ($scope, $el, $attrs, $model) ->
@@ -156,6 +156,7 @@ WikiSummaryDirective = ($log, $template) ->
user: user
}
html = template(ctx)
+ html = $compile(html)($scope)
$el.html(html)
$scope.$watch $attrs.ngModel, (wikiPage) ->
@@ -171,7 +172,7 @@ WikiSummaryDirective = ($log, $template) ->
require: "ngModel"
}
-module.directive("tgWikiSummary", ["$log", "$tgTemplate", WikiSummaryDirective])
+module.directive("tgWikiSummary", ["$log", "$tgTemplate", "$compile", WikiSummaryDirective])
#############################################################################
diff --git a/app/coffee/modules/wiki/nav.coffee b/app/coffee/modules/wiki/nav.coffee
index 21cd19e6..558ff820 100644
--- a/app/coffee/modules/wiki/nav.coffee
+++ b/app/coffee/modules/wiki/nav.coffee
@@ -34,7 +34,7 @@ module = angular.module("taigaWiki")
## Wiki Main Directive
#############################################################################
-WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading, $template) ->
+WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading, $template, $compile, $translate) ->
template = $template.get("wiki/wiki-nav.html", true)
link = ($scope, $el, $attrs) ->
$ctrl = $el.controller()
@@ -53,6 +53,8 @@ WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $l
deleteWikiLinkPermission: deleteWikiLinkPermission
})
+ html = $compile(html)($scope)
+
$el.off()
$el.html(html)
@@ -80,8 +82,7 @@ WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $l
target = angular.element(event.currentTarget)
linkId = target.parents('.wiki-link').data('id')
- # TODO: i18n
- title = "Delete Wiki Link"
+ title = $translate.instant("WIKI.DELETE_LIGHTBOX_TITLE")
message = $scope.wikiLinks[linkId].title
$confirm.askOnDelete(title, message).then (finish) =>
@@ -143,4 +144,4 @@ WikiNavDirective = ($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $l
return {link:link}
module.directive("tgWikiNav", ["$tgRepo", "$log", "$tgLocation", "$tgConfirm", "$tgNavUrls",
- "$tgAnalytics", "$tgLoading", "$tgTemplate", WikiNavDirective])
+ "$tgAnalytics", "$tgLoading", "$tgTemplate", "$compile", "$translate", WikiNavDirective])
diff --git a/app/locales/en/app.json b/app/locales/en/app.json
deleted file mode 100644
index 6498b36c..00000000
--- a/app/locales/en/app.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "checksley": {
- "defaultMessage": "This value seems to be invalid.",
- "type-email": "This value should be a valid email.",
- "type-url": "This value should be a valid url.",
- "type-urlstrict": "This value should be a valid url.",
- "type-number": "This value should be a valid number.",
- "type-digits": "This value should be digits.",
- "type-dateIso": "This value should be a valid date (YYYY-MM-DD).",
- "type-alphanum": "This value should be alphanumeric.",
- "type-phone": "This value should be a valid phone number.",
- "notnull": "This value should not be null.",
- "notblank": "This value should not be blank.",
- "required": "This value is required.",
- "regexp": "This value seems to be invalid.",
- "min": "This value should be greater than or equal to %s.",
- "max": "This value should be lower than or equal to %s.",
- "range": "This value should be between %s and %s.",
- "minlength": "This value is too short. It should have %s characters or more.",
- "maxlength": "This value is too long. It should have %s characters or less.",
- "rangelength": "This value length is invalid. It should be between %s and %s characters long.",
- "mincheck": "You must select at least %s choices.",
- "maxcheck": "You must select %s choices or less.",
- "rangecheck": "You must select between %s and %s choices.",
- "equalto": "This value should be the same."
- },
- "common": {
- "subject": "Subject",
- "save": "Save",
- "blocked": "Blocked",
- "cancel": "Cancel",
- "status": "Status",
- "new-bulk": "New bulk insert",
- "one-item-line": "One item per line..."
- },
- "pagination": {
- "next": "Next",
- "prev": "Previous"
- },
- "markdown-editor": {
- "heading-1": "First Level Heading",
- "heading-2": "Second Level Heading",
- "heading-3": "Third Level Heading",
- "bold": "Bold",
- "italic": "Italic",
- "strike": "Strike",
- "bulleted-list": "Bulleted List",
- "numeric-list": "Numeric List",
- "picture": "Picture",
- "link": "Link",
- "quotes": "Quotes",
- "code-block": "Code Block / Code",
- "preview": "Preview",
- "help": "Help",
- "placeholder": "Your title here...",
- "link-placeholder": "Your text to link here..."
- },
- "us": {
- "title-new": "New User Story",
- "team-requirement": "Team Requirement",
- "client-requirement": "Client Requirement"
- }
-}
diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json
new file mode 100644
index 00000000..623f622d
--- /dev/null
+++ b/app/locales/locale-en.json
@@ -0,0 +1,872 @@
+{
+ "COMMON": {
+ "YES": "Yes",
+ "NO": "No",
+ "LOADING": "Loading...",
+ "LOADING_PROJECT": "Loading project...",
+ "SAVE": "Save",
+ "CANCEL": "Cancel",
+ "ACCEPT": "Accept",
+ "DELETE": "Delete",
+ "CREATE": "Create",
+ "ADD": "Add",
+ "YES": "Yes",
+ "NO": "No",
+ "COPY_TO_CLIPBOARD": "Copy to clipboard: Ctrl+C",
+ "EDIT": "Edit",
+ "DRAG": "Drag",
+ "TAG_LINE": "Your agile, free, and open source project management tool",
+ "TAG_LINE_2": "LOVE YOUR PROJECT",
+ "BLOCK": "Block",
+ "UNBLOCK": "Unblock",
+ "BLOCKED": "Blocked",
+ "CREATED_BY": "Created by {{fullDisplayName}}",
+ "FROM": "from",
+ "TO": "to",
+ "CLOSE": "close",
+ "BLOCKED_NOTE": "Why is this user story blocked?",
+ "BLOCKED_REASON": "Please explain the reason",
+ "GO_HOME": "Take me home",
+ "PLUGINS": "Plugins",
+ "BETA": "We are on beta!",
+ "ONE_ITEM_LINE": "One item per line...",
+ "NEW_BULK": "New bulk insert",
+ "RELATED_TASKS": "Related tasks",
+ "LOGOUT": "Logout",
+ "GENERIC_ERROR": "One of our Oompa Loompas says {{error}}.",
+ "IOCAINE_TEXT": "Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!",
+ "TAGS": {
+ "PLACEHOLDER": "I'm it! Tag me...",
+ "DELETE": "delete tag",
+ "ADD": "Add tag"
+ },
+ "DESCRIPTION": {
+ "EMPTY": "Empty space is so boring... go on be descriptive... A rose by any other name would smell as sweet...",
+ "MARKDOWN_HELP": "Markown syntax help",
+ "NO_DESCRIPTION": "No description yet"
+ },
+ "FIELDS": {
+ "SUBJECT": "Subject",
+ "NAME": "Name",
+ "URL": "URL",
+ "DESCRIPTION": "Description",
+ "VALUE": "Value",
+ "SLUG": "Slug",
+ "COLOR": "Color",
+ "IS_CLOSED": "Is closed?",
+ "STATUS": "Status",
+ "ASSIGNED_TO": "Assigned to",
+ "POINTS": "Points",
+ "BLOCKED_NOTE": "blocked note",
+ "IS_BLOCKED": "is blocked"
+ },
+ "ROLES": {
+ "ALL": "All"
+ },
+ "ASSIGNED_TO": {
+ "NOT_ASSIGNED": "Not assigned",
+ "DELETE_ASSIGNMENT": "Delete assignment",
+ "REMOVE_ASSIGNED": "Remove assigned",
+ "TOO_MANY": "...too many users, keep filtering",
+ "CONFIRM_UNASSIGNED": "Are you sure you want to leave it unassigned?"
+ },
+ "STATUS": {
+ "CLOSED": "Closed",
+ "OPEN": "Open"
+ },
+ "WATCHERS": {
+ "ADD": "Add watcher",
+ "TITLE": "watchers",
+ "DELETE": "delete watcher"
+ },
+ "CUSTOM_ATTRIBUTES": {
+ "CUSTOM_FIELDS": "Custom Fields",
+ "SAVE": "Save Custom Field",
+ "EDIT": "Edit Custom Field",
+ "DELETE": "Delete custom attribute",
+ "CONFIRM_DELETE": "Remeber that all values in this custom field will be deleted. Are you sure you want to continue?"
+ },
+ "FILTERS": {
+ "TITLE": "filters",
+ "INPUT_PLACEHOLDER": "Subject or reference",
+ "TITLE_ACTION_FILTER_BUTTON": "search",
+ "BREADCRUMB_TITLE": "back to categories",
+ "BREADCRUMB_FILTERS": "Filters",
+ "BREADCRUMB_STATUS": "status"
+ }
+ },
+ "AUTH": {
+ "INVITED_YOU": "has invited you to join the project",
+ "NOT_REGISTERED_YET": "Not registered yet?",
+ "REGISTER": "Register",
+ "CREATE_ACCOUNT": "create your free account here"
+ },
+ "ATTACHMENT": {
+ "SECTION_NAME": "attachments",
+ "TITLE": "<%- name %> uploaded on <%- created_date %>",
+ "DESCIPTION": "Type a short description",
+ "DEPRECATED_FILE": "Deprecated?",
+ "ADD": "Add new attachment. <%- maxFileSizeMsg %>",
+ "MAX_FILE_SIZE": "[Max. size: {{maxFileSize}}]",
+ "SHOW_DEPRECATED": "+ show deprecated atachments",
+ "HIDE_DEPRECATED": "- hide deprecated atachments",
+ "COUNT_DEPRECATED": "({{ctrl.deprecatedAttachmentsCount }} deprecated)",
+ "MAX_UPLOAD_SIZE": "Maximum upload size is {{maxFileSize}}",
+ "DATE": "DD MMM YYYY [at] hh:mm",
+ "FIELDS": {
+ "IS_DEPRECATED": "is deprecated"
+ }
+ },
+ "PAGINATION": {
+ "PREVIOUS": "Prev",
+ "NEXT": "Next"
+ },
+ "ADMIN": {
+ "COMMON": {
+ "TITLE_ACTION_EDIT_VALUE": "Edit value",
+ "TITLE_ACTION_DELETE_VALUE": "Delete value"
+ },
+ "HELP": "Do you need help? Check out our support page!",
+ "PROJECT_DEFAULT_VALUES": {
+ "TITLE": "Default Values",
+ "SUBTITLE": "Set default values for all selector inputs."
+ },
+ "MEMBERSHIPS": {
+ "TITLE": "Manage members",
+ "ADD_BUTTON": "+ New member",
+ "ADD_BUTTON_TITLE": "Add new member"
+ },
+ "PROJECT_EXPORT": {
+ "TITLE": "Export",
+ "SUBTITLE": "Export your project to save a backup or to create a new one based on this.",
+ "EXPORT_BUTTON": "Export",
+ "EXPORT_BUTTON_TITLE": "Export your project",
+ "LOADING_TITLE": "We are generating your dump file",
+ "DUMP_READY": "Your dump file is ready!",
+ "LOADING_MESSAGE": "Please don't close this page.",
+ "ASYNC_MESSAGE": "We will send you an email when ready.",
+ "SYNC_MESSAGE": "If the download doesn't start automatically click here.",
+ "ERROR": "Our oompa loompas have some problems generasting your dump. MPlease try again.",
+ "ERROR_BUSY": "Sorry, our oompa loompas are very busy right now. Please try again in a few minutes.",
+ "ERROR_MESSAGE": "Our oompa loompas have some problems generasting your dump: {{message}}"
+ },
+ "MODULES": {
+ "TITLE": "Modules",
+ "ENABLE": "Enable",
+ "DISABLE": "Disable",
+ "BACKLOG": "Backlog",
+ "BACKLOG_DESCRIPTION": "Manage your user stories to maintain an organized view of upcoming and prioritized work.",
+ "KANBAN": "Kanban",
+ "KANBAN_DESCRIPTION": "Organize your project in a lean way with this board.",
+ "ISSUES": "Issues",
+ "ISSUES_DESCRIPTION": "Track the bugs, questions and enhancements related to your project. Don't miss anything!",
+ "WIKI": "Wiki",
+ "WIKI_DESCRIPTION": "Add, modify, or delete content in collaboration with others. This is the right place for your project documentation.",
+ "MEETUP": "Meet Up",
+ "MEETUP_DESCRIPTION": "Choose your videoconference system. Even developers need face to face contact.",
+ "SELECT_VIDEOCONFERENCE": "Select a videoconference system",
+ "SALT_CHAT_ROOM": "If you want you can append a salt code to the name of the chat room"
+ },
+ "PROJECT_PROFILE": {
+ "PAGE_TITLE": "Project profile - {{sectionName}} - {{projectName}}",
+ "PROJECT_DETAILS": "Project details",
+ "PROJECT_NAME": "Project name",
+ "PROJECT_SLUG": "Project slug",
+ "NUMBER_SPRINTS": "Number of sprints",
+ "NUMBER_US_POINTS": "Number of US points",
+ "DESCRIPTION": "DESCRIPTION",
+ "PUBLIC_PROJECT": "Public project",
+ "PRIVATE_PROJECT": "Private project",
+ "DELETE": "Delete this project"
+ },
+ "REPORTS": {
+ "TITLE": "Reports",
+ "SUBTITLE": "Export your project data in CSV format and make your own reports.",
+ "DESCRIPTION": "Download a CSV file or copy the generated URL and open it in your favourite text editor or spreadsheet to make your own project data reports. You will be able to visualize and analize all your data easily.",
+ "HELP": "How to use this on my own spreadsheet?",
+ "REGENERATE_TITLE": "Change URL",
+ "REGENERATE_SUBTITLE": "You going to change the CSV data access url. The previous url will be disabled. Are you sure?"
+ },
+ "CUSTOM_FIELDS": {
+ "TITLE": "Custom Fields",
+ "SUBTITLE": "Specify the custom fields for your user stories, tasks and issues",
+ "US_DESCRIPTION": "User stories custom fields",
+ "US_ADD": "Add a custom field in user stories",
+ "TASK_DESCRIPTION": "Tasks custom fields",
+ "TASK_ADD": "Add a custom field in tasks",
+ "ISSUE_DESCRIPTION": "Issues custom fields",
+ "ISSUE_ADD": "Add a custom field in issues"
+ },
+ "PROJECT_VALUES": {
+ "APP_TITLE": "Project values - {{sectionName}} - {{projectName}}",
+ "REPLACEMENT": "All items with this value will be changed to",
+ "ERROR_DELETE_ALL": "You can't delete all values."
+ },
+ "PROJECT_VALUES_POINTS": {
+ "TITLE": "Us points",
+ "SUBTITLE": "Specify the points your user stories could be estimated to",
+ "ACTION_ADD": "Add new point"
+ },
+ "PROJECT_VALUES_PRIORITIES": {
+ "TITLE": "Issue priorities",
+ "SUBTITLE": "Specify the priorities your issues will have"
+ },
+ "PROJECT_VALUES_SEVERITIES": {
+ "TITLE": "Issue severities",
+ "SUBTITLE": "Specify the severities your issues will have"
+ },
+ "PROJECT_VALUES_STATUS": {
+ "TITLE": "Status",
+ "SUBTITLE": "Specify the statuses your user stories, tasks and issues will go through",
+ "US_TITLE": "US Statuses",
+ "TASK_TITLE": "Task Statuses",
+ "ISSUE_TITLE": "Issue Statuses"
+ },
+ "PROJECT_VALUES_TYPES": {
+ "TITLE": "Types",
+ "SUBTITLE": "Specify the types your user stories could be estimated to",
+ "ISSUE_TITLE": "Issues types",
+ "ACTION_ADD": "Add new {{objName}}"
+ },
+ "ROLES": {
+ "SECTION_NAME": "Roles - {{projectName}}",
+ "WARNING_NO_ROLE": "Be careful, no role in your project will be able to estimate the point value for user stories",
+ "HELP_ROLE_ENABLED": "When enabled, members assigned to this role will be able to estimate the point value for user stories",
+ "COUNT_MEMBERS": "{{ role.members_count }} members with this role",
+ "TITLE_DELETE_ROLE": "Delete Role",
+ "REPLACEMENT_ROLE": "All the users with this role will be moved to",
+ "WARNING_DELETE_ROLE": "Be careful, all role estimations will be removed",
+ "ERROR_DELETE_ALL": "You can't delete all values"
+ },
+ "THIRD_PARTIES": {
+ "SECRET_KEY": "Secret key",
+ "PAYLOAD_URL": "Payload URL",
+ "VALID_IPS": "Valid origin ips (separated by ,)"
+ },
+ "BITBUCKET": {
+ "SECTION_NAME": "Bitbucket",
+ "APP_TITLE": "Bitbucket - {{projectName}}",
+ "INFO_VERIFYING_IP": "Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."
+ },
+ "GITLAB": {
+ "SECTION_NAME": "Gitlab",
+ "APP_TITLE": "Gitlab - {{projectName}}",
+ "INFO_VERIFYING_IP": "Gitlab requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."
+ },
+ "GITHUB": {
+ "SECTION_NAME": "Github",
+ "APP_TITLE": "Github - {{projectName}}"
+ },
+ "WEBHOOKS": {
+ "APP_TITLE": "Webhooks - {{projectName}}",
+ "SECTION_NAME": "Webhooks",
+ "SUBTITLE": "Webhooks notify external services about events in Taiga, like comments, user stories....",
+ "ADD_NEW": "Add a New Webhook",
+ "TYPE_NAME": "Type the service name",
+ "TYPE_PAYLOAD_URL": "Type the service payload url",
+ "TYPE_SERVICE_SECRET": "Type the service secret key",
+ "SAVE": "Save Webhook",
+ "CANCEL": "Cancel Webhook",
+ "TOGGLE_HISTORY": "Toggle history",
+ "SHOW_HISTORY": "(Show history)",
+ "TEST": "Test Webhook",
+ "EDIT": "Edit Webhook",
+ "DELETE": "Delete Webhook",
+ "REQUEST": "Request",
+ "RESEND_REQUEST": "Resend request",
+ "HEADERS": "Headers",
+ "PAYLOAD": "Payload",
+ "RESPONSE": "Response",
+ "DATE": "DD MMM YYYY [at] hh:mm:ss",
+ "ACTION_HIDE_HISTORY": "(Hide history)",
+ "ACTION_SHOW_HISTORY": "(Show history)",
+ "WEBHOOK_NAME": "Webhook '{{name}}'"
+ },
+ "CUSTOM_ATTRIBUTES": {
+ "ADD": "Add custom field",
+ "EDIT": "Edit Custom Field",
+ "DELETE": "Delete Custom Field",
+ "SAVE_TITLE": "Save Custom Field",
+ "CANCEL_TITLE": "Cancel creation",
+ "SET_FIELD_NAME": "Set your custom field name",
+ "SET_FIELD_DESCRIPTION": "Set your custom field description",
+ "ACTION_UPDATE": "Update Custom Field",
+ "ACTION_CANCEL_EDITION": "Cancel edition"
+ },
+ "MEMBERSHIP": {
+ "COLUMN_MEMBER": "Member",
+ "COLUMN_ADMIN": "Admin",
+ "COLUMN_ROLE": "Role",
+ "COLUMN_STATUS": "Status",
+ "STATUS_ACTIVE": "Active",
+ "STATUS_PENDING": "Pending",
+ "DELETE_MEMBER": "Delete member",
+ "SUCCESS_SEND_INVITATION": "We've sent the invitation again to '{{email}}'.",
+ "ERROR_SEND_INVITATION": "We haven't sent the invitation.",
+ "SUCCESS_DELETE": "We've deleted {{message}}.",
+ "ERROR_DELETE": "We have not been able to delete {{message}}.",
+ "DEFAULT_DELETE_MESSAGE": "the invitation to {{email}}"
+ },
+ "DEFAULT_VALUES": {
+ "LABEL_POINTS": "Default value for points selector",
+ "LABEL_US": "Default value for US status selector",
+ "LABEL_TASK_STATUS": "Default value for task status selector",
+ "LABEL_PRIORITY": "Default value for priority selector",
+ "LABEL_SEVERITY": "Default value for severity selector",
+ "LABEL_ISSUE_TYPE": "Default value for issue type selector",
+ "LABEL_ISSUE_STATUS": "Default value for issue status selector"
+ },
+ "PROJECT": {
+ "COLORS": {
+ "ACTION_NEW_STATUS": "+ Add new status"
+ }
+ },
+ "CSV": {
+ "TITLE": "{{csvType}} reports",
+ "DOWNLOAD": "Download CSV",
+ "URL_FIELD_PLACEHOLDER": "Please regenerate CSV url",
+ "TITLE_REGENERATE_URL": "Regenerate CSV url",
+ "ACTION_GENERATE_URL": "Generate Url",
+ "ACTION_REGENERATE": "Regenerate"
+ },
+ "STATUS": {
+ "PLACEHOLDER_WRITE_STATUS_NAME": "Write a name for the new status"
+ },
+ "TYPES": {
+ "PLACEHOLDER_WRITE_NAME": "Write a name for the new element"
+ },
+ "US_STATUS": {
+ "ACTION_ADD_STATUS": "Add new status",
+ "IS_ARCHIVED_COLUMN": "Is archived?",
+ "WIP_LIMIT_COLUMN": "WIP Limit",
+ "PLACEHOLDER_WRITE_NAME": "Write a name for the new status"
+ },
+ "MENU": {
+ "TITLE": "Admin",
+ "PROJECT": "Project",
+ "ATTRIBUTES": "Attributes",
+ "MEMBERS": "Members",
+ "PERMISSIONS": "Permissions",
+ "INTEGRATIONS": "Integrations",
+ "PLUGINS": "Plugins"
+ },
+ "SUBMENU": {
+ "ROLE_UX": "UX",
+ "ROLE_PRODUCT_OWNER": "Product Owner",
+ "ROLE_DESIGNER": "Designer",
+ "ROLE_BACK": "Back",
+ "ROLE_FRONT": "Front",
+ "ACTION_NEW_ROLE": "+ New role",
+ "TITLE_ACTION_NEW_ROLE": "Add new role"
+ },
+ "SUBMENU_PROJECT_VALUES": {
+ "STATUS": "Status",
+ "POINTS": "Points",
+ "PRIORITIES": "Priorities",
+ "SEVERITIES": "Severities",
+ "TYPES": "Types",
+ "CUSTOM_FIELDS": "Custom fields"
+ },
+ "SUBMENU_PROJECT_PROFILE": {
+ "TITLE": "Project Profile"
+ },
+ "SUBMENU_ROLES": {
+ "TITLE": "Roles"
+ },
+ "SUBMENU_THIDPARTIES": {
+ "TITLE": "Services"
+ }
+ },
+ "PROJECT": {
+ "WELCOME": "Welcome",
+ "SECTION_PROJECTS": "Projects",
+ "STATS": {
+ "PROJECT": "project
points",
+ "DEFINED": "defined
points",
+ "ASSIGNED": "assigned
points",
+ "CLOSED": "closed
points"
+ },
+ "SECTION": {
+ "SEARCH": "Search",
+ "BACKLOG": "Backlog",
+ "KANBAN": "Kanban",
+ "ISSUES": "Issues",
+ "WIKI": "Wiki",
+ "TEAM": "Team",
+ "MEETUP": "Meet Up",
+ "ADMIN": "Admin"
+ },
+ "NAVIGATION": {
+ "SECTION_TITLE": "Your project",
+ "PLACEHOLDER_SEARCH": "Search in...",
+ "ACTION_CREATE_PROJECT": "Create project",
+ "TITLE_ACTION_IMPORT": "Import project",
+ "TITLE_PRVIOUS_PROJECT": "Show previous projects",
+ "TITLE_NEXT_PROJECT": "Show next projects"
+ },
+ "IMPORT": {
+ "TITLE": "Importing Project",
+ "DESCRIPTION": "This process can take a while, please keep the window open.",
+ "ASYNC_IN_PROGRESS_TITLE": "Our Oompa Loompas are importing your project",
+ "ASYNC_IN_PROGRESS_MESSAGE": "This process could take a few minutes
We will send you an email when ready",
+ "ERROR": "Our oompa loompas have some problems importing your dump data. Please try again.",
+ "ERROR_TOO_MANY_REQUEST": "Sorry, our oompa loompas are very busy right now. Please try again in a few minutes.",
+ "ERROR_MESSAGE": "Our oompa loompas have some problems importing your dump data: {{error_message}}",
+ "SYNC_SUCCESS": "Your project has been imported successfuly"
+ }
+ },
+ "LIGHTBOX": {
+ "DELETE_ACCOUNT": {
+ "SECTION_NAME": "Delete Taiga Account",
+ "CONFIRM": "Are you sure you want to delete your Taiga account?",
+ "SUBTITLE": "We're going to miss you! :-("
+ },
+ "DELETE_PROJECT": {
+ "TITLE": "Delete project",
+ "QUESTION": "Are you sure you want to delete this project?",
+ "SUBTITLE": "All project data US/Tasks/Issues/Sprints/WikiPages will be lost! :-(",
+ "CONFIRM": "Yes, I'm really sure"
+ },
+ "ASSIGNED_TO": {
+ "SELECT": "Select assigned to",
+ "SEARCH": "Search for users"
+ },
+ "ADD_MEMBER": {
+ "TITLE": "New Member",
+ "HELP_TEXT": "If users are already registered on Taiga, they will be added automatically. Otherwise they will receive an invitation."
+ },
+ "CREATE_ISSUE": {
+ "TITLE": "Add Issue"
+ },
+ "FEEDBACK": {
+ "TITLE": "Tell us something...",
+ "COMMENT": "...a bug, some suggestions, something cool... or even your worst nightmare with Taiga",
+ "ACTION_SEND": "Send feedback"
+ },
+ "SEARCH": {
+ "TITLE": "Search",
+ "PLACEHOLDER_SEARCH": "What are you looking for?"
+ },
+ "ADD_EDIT_SPRINT": {
+ "TITLE": "New sprint",
+ "PLACEHOLDER_SPRINT_NAME": "sprint name",
+ "PLACEHOLDER_SPRINT_START": "Estimated Start",
+ "PLACEHOLDER_SPRINT_END": "Estimated End",
+ "ACTION_DELETE_SPRINT": "Do you want to delete this sprint?",
+ "TITLE_ACTION_DELETE_SPRINT": "delete sprint",
+ "LAST_SPRINT_NAME": " last sprint is {{lastSprint}} ;-) "
+ },
+ "CREATE_EDIT_TASK": {
+ "TITLE": "New task",
+ "PLACEHOLDER_SUBJECT": "A task subject",
+ "PLACEHOLDER_STATUS": "Task status",
+ "OPTION_UNASSIGNED": "Unassigned",
+ "PLACEHOLDER_SHORT_DESCRIPTION": "Type a short description",
+ "ACTION_EDIT": "Edit task"
+ },
+ "CREATE_EDIT_US": {
+ "TITLE": "New US",
+ "PLACEHOLDER_DESCRIPTION": "Please add descriptive text to help others better understand this US",
+ "NEW_US": "New user story",
+ "EDIT_US": "Edit user story"
+ },
+ "DELETE_SPRINT": {
+ "TITLE": "Delete sprint"
+ },
+ "CREATE_MEMBER": {
+ "PLACEHOLDER_INVITATION_TEXT": "(Optional) Add a personalized text to the invitation. Tell something lovely to your new members ;-)",
+ "PLACEHOLDER_TYPE_EMAIL": "Type an Email"
+ }
+ },
+ "US": {
+ "TOTAL_POINTS": "total",
+ "ADD": "+ Add a new User Story",
+ "ADD_BULK": "Add some new User Stories in bulk",
+ "PROMOTED": "This US has been promoted from Issue",
+ "TITLE_LINK_GO_TO_ISSUE": "Go to issue",
+ "EXTERNAL_REFERENCE": "This US has been created from",
+ "GO_TO_EXTERNAL_REFERENCE": "Go to origin",
+ "BLOCKED": "This user story is blocked",
+ "PREVIOUS": "previous user story",
+ "NEXT": "next user story",
+ "TITLE_DELETE_ACTION": "Delete User Story",
+ "LIGHTBOX_TITLE_BLOKING_US": "Blocking us",
+ "TASK_COMPLETED": "{{totalClosedTasks}}/{{totalTasks}} tasks completed",
+ "ASSIGN": "Assign User Story",
+ "NOT_ESTIMATED": "Not estimated",
+ "TOTAL_US_POINTS": "Total Us points",
+ "FIELDS": {
+ "TEAM_REQUIREMENT": "Team Requirement",
+ "CLIENT_REQUIREMENT": "Client Requirement",
+ "FINISH_DATE": "Finish date"
+ }
+ },
+ "COMMENTS": {
+ "DELETED_INFO": "Comment deleted by {{deleteCommentUser}} on {{deleteCommentDate}}",
+ "TITLE": "Comments",
+ "COMMENT": "Comment",
+ "TYPE_NEW_COMMENT": "Type a new comment here",
+ "SHOW_DELETED": "Show deleted comment",
+ "HIDE_DELETED": "Hide deleted comment",
+ "RESTORE": "Restore comment"
+ },
+ "ACTIVITY": {
+ "SHOW_ACTIVITY": "Show activity",
+ "SHOW_MORE": "+ Show previous entries ({{showMore}} more)",
+ "TITLE": "Activity",
+ "REMOVED": "removed",
+ "ADDED": "added",
+ "US_POINTS": "US points ({{name}})",
+ "NEW_ATTACHMENT": "new attachment",
+ "DELETED_ATTACHMENT": "deleted attachment",
+ "UPDATED_ATTACHMENT": "updated attachment {{filename}}",
+ "DELETED_CUSTOM_ATTRIBUTE": "deleted custom attribute",
+ "SIZE_CHANGE": "Made {{size}} {size, plural, one{change} other{changes}}"
+ },
+ "BACKLOG": {
+ "MOVE_US_TO_CURRENT_SPRINT": "Move to Current Sprint",
+ "SHOW_FILTERS": "Show filters",
+ "SHOW_TAGS": "Show tags",
+ "EMPTY": "Your backlog is empty!",
+ "CREATE_NEW_US": "Create a new US",
+ "CREATE_NEW_US_EMPTY_HELP": "You may want to create a new user story",
+ "EXCESS_OF_POINTS": "Excess of points",
+ "PENDING_POINTS": "Pending Points",
+ "CLOSED_POINTS": "Closed points",
+ "COMPACT_SPRINT": "Compact Sprint",
+ "GO_TO_TASKBOARD": "Go to the taskboard of {{::name}}",
+ "EDIT_SPRINT": "Edit Sprint",
+ "CLOSED_POINTS": "closed",
+ "TOTAL_POINTS": "total",
+ "STATUS_NAME": "Status Name",
+ "SORTABLE_FILTER_ERROR": "You can't drop on backlog when filters are open",
+ "DOOMLINE": "Project Scope [Doomline]",
+ "CHART": {
+ "OPTIMAL": "Optimal pending points for sprint {{xval}} should be {{yval}}",
+ "REAL": "Real pending points for sprint {{xval}} is {{yval}}",
+ "INCREMENT_TEAM": "Incremented points by team requirements for sprint {{xval}} is {{yval}}",
+ "INCREMENT_CLIENT": "Incremented points by client requirements for sprint {{xval}} is {{yval}}"
+ },
+ "TAGS": {
+ "SHOW": "Show Tags",
+ "HIDE": "Hide Tags"
+ },
+ "TABLE": {
+ "COLUMN_US": "User Stories",
+ "TITLE_COLUMN_POINTS": "Select view per Role"
+ },
+ "SPRINT_SUMMARY": {
+ "TOTAL_POINTS": "total
points",
+ "COMPLETED_POINTS": "completed
points",
+ "OPEN_TASKS": "open
tasks",
+ "CLOSED_TASKS": "closed
tasks",
+ "IOCAINE_DOSES": "iocaine
doses",
+ "SHOW_STATISTICS_TITLE": "Show statistics"
+ },
+ "SUMMARY": {
+ "PROJECT_POINTS": "project
points",
+ "DEFINED_POINTS": "defined
points",
+ "CLOSED_POINTS": "closed
points",
+ "POINTS_PER_SPRINT": "points /
sprint"
+ },
+ "FILTERS": {
+ "TITLE": "Filters",
+ "REMOVE": "Remove Filters",
+ "SHOW": "Show Filters",
+ "FILTER_CATEGORY_STATUS": "Status",
+ "FILTER_CATEGORY_TAGS": "Tags"
+ },
+ "SPRINTS": {
+ "TITLE": "SPRINTS",
+ "LINK_TASKBOARD": "Sprint Taskboard",
+ "TITLE_LINK_TASKBOARD": "Go to Taskboard of {{spring.name}}",
+ "NUMBER_SPRINTS": "
sprints",
+ "TITLE_ACTION_NEW_SPRINT": "+ New sprint",
+ "ACTION_NEW_SPRINT": "+ New sprint",
+ "ACTION_SHOW_CLOSED_SPRINTS": "Show closed sprints",
+ "ACTION_HIDE_CLOSED_SPRINTS": "Hide closed sprints"
+ }
+ },
+ "ERROR": {
+ "TEXT1": "Something happened and our Oompa Loompas are working on it.",
+ "TEXT2": "Try reloading again soon.",
+ "NOT_FOUND": "Not found",
+ "NOT_FOUND_TEXT": "Error 404. The page you are looking for no longer exists. Perhaps you can return back to TAIGA homepage and see if you can find what you are looking for.",
+ "PERMISSION_DENIED": "Permission denied",
+ "PERMISSION_DENIED_CODE": "Error 403."
+ },
+ "TASKBOARD": {
+ "SECTION_NAME": "Taskboard",
+ "TITLE_ACTION_ADD": "Add a new Task",
+ "TITLE_ACTION_ADD_BULK": "Add some new Tasks in bulk",
+ "TITLE_ACTION_ASSIGN": "Assign task",
+ "TITLE_ACTION_EDIT": "Edit task",
+ "TABLE": {
+ "COLUMN": "User story",
+ "TITLE_ACTION_FOLD": "Fold column",
+ "TITLE_ACTION_UNFOLD": "Unfold column",
+ "TITLE_ACTION_FOLD_ROW": "Fold Row",
+ "TITLE_ACTION_UNFOLD_ROW": "Unfold Row",
+ "FIELD_POINTS": "points",
+ "ROW_UNASSIGED_TASKS_TITLE": "Unassigned tasks"
+ },
+ "CHARTS": {
+ "OPTIMAL": "Optimal pending points for day #{formattedDate} should be {{roundedValue}}",
+ "REAL": "Real pending points for day {{formattedDate}} is {{roundedValue}}"
+ }
+ },
+ "TASK": {
+ "PLACEHOLDER_SUBJECT": "Type the new task subject",
+ "TITLE_SELECT_STATUS": "Status Name",
+ "LINK_TASKBOARD": "Go to taskboard",
+ "OWNER_US": "This task belongs to",
+ "TITLE_LINK_GO_OWNER": "Go to user story",
+ "ORIGIN_US": "This task has been created from",
+ "TITLE_LINK_GO_ORIGIN": "Go to user story",
+ "BLOCKED": "This task is blocked",
+ "PREVIOUS": "previous task",
+ "NEXT": "next task",
+ "TITLE_DELETE_ACTION": "Delete Task",
+ "LIGHTBOX_TITLE_BLOKING_TASK": "Blocking task",
+ "FIELDS": {
+ "MILESTONE": "Sprint",
+ "USER_STORY": "User story",
+ "IS_IOCAINE": "Is iocaine"
+ }
+ },
+ "NOTIFICATION": {
+ "OK": "Everything is ok",
+ "WARNING": "Oops, something happened...",
+ "WARNING_TEXT": "Our oompa Loompas are sad, your changes were not saved!",
+ "SAVED": "Our oompa Loompas saved all your changes!",
+ "CLOSE": "Close notification",
+ "MAIL": "Notifications By Mail",
+ "ASK_DELETE": "Are you sure you want to delete?"
+ },
+ "CANCEL_ACCOUNT": {
+ "TITLE": "Cancel your account",
+ "SUBTITLE": "We're sorry you are leaving the taiga, we hope you enjoyed your stay :)",
+ "PLACEHOLDER_INPUT_TOKEN": "cancel account token",
+ "ACTION_LEAVING": "Yes, I'm leaving!",
+ "SUCCESS": "Our Oompa Loompas removed your account"
+ },
+ "CHANGE_EMAIL_FORM": {
+ "TITLE": "Change your email",
+ "SUBTITLE": "One click more and your email will be updated!",
+ "PLACEHOLDER_INPUT_TOKEN": "change email token",
+ "ACTION_CHANGE_EMAIL": "Change email",
+ "SUCCESS": "Our Oompa Loompas updated your email"
+ },
+ "CHANGE_PASSWORD_RECOVERY_FORM": {
+ "TITLE": "Create a new Taiga pass",
+ "SUBTITLE": "And hey, you may want to eat some more iron-rich food, it's good for your brain :P",
+ "PLACEHOLDER_RECOVER_PASSWORD_TOKEN": "Recover password token",
+ "LINK_NEED_TOKEN": "Need one?",
+ "TITLE_LINK_NEED_TOKEN": "Did you need a token to recover your password because you forgot it?",
+ "PLACEHOLDER_NEW_PASSWORD": "New password",
+ "PLACEHOLDER_RE_TYPE_NEW_PASSWORD": "Re-type new password",
+ "ACTION_RESET_PASSWORD": "Reset Password",
+ "SUCCESS": "Our Oompa Loompas saved your new password.
Try to sign in with it."
+ },
+ "FORGOT_PASSWORD_FORM": {
+ "TITLE": "Oops, did you forget your password?",
+ "SUBTITLE": "Enter your username or email to get a new one",
+ "PLACEHOLDER_FIELD": "Username or email",
+ "ACTION_RESET_PASSWORD": "Reset Password",
+ "LINK_CANCEL": "Nah, take me back. I think I remember it.",
+ "SUCCESS": "Check your inbox!
We have sent a mail to
{{email}}
with the instructions to set a new password",
+ "ERROR": "According to our Oompa Loompas, your are not registered yet."
+ },
+ "LOGIN_COMMON": {
+ "HEADER": "I already have a Taiga login",
+ "PLACEHOLDER_AUTH_NAME": "Username or email (case sensitive)",
+ "LINK_FORGOT_PASSWORD": "Forgot it?",
+ "TITLE_LINK_FORGOT_PASSWORD": "Did you forgot your password?",
+ "ACTION_ENTER": "Enter",
+ "ACTION_SIGN_IN": "Sign in",
+ "PLACEHOLDER_AUTH_PASSWORD": "Password (case sensitive)"
+ },
+ "LOGIN_FORM": {
+ "ERROR_AUTH_INCORRECT": "According to our Oompa Loompas, your username/email or password are incorrect.",
+ "ERROR_GENERIC": "According to our Oompa Loompas there was an error.",
+ "SUCCESS": "Our Oompa Loompas are happy, welcome to Taiga."
+ },
+ "INVITATION_LOGIN_FORM": {
+ "NOT_FOUND": "Ooops, we have a problem
Our Oompa Loompas can't find your invitation.",
+ "SUCCESS": "You've successfully joined this project, Welcome to {{project_name}",
+ "ERROR": "According to our Oompa Loompas, your are not registered yet or typed an invalid password."
+ },
+ "REGISTER_FORM": {
+ "PLACEHOLDER_NAME": "Pick a username (case sensitive)",
+ "PLACEHOLDER_FULL_NAME": "Pick your full name",
+ "PLACEHOLDER_EMAIL": "Your email",
+ "PLACEHOLDER_PASSWORD": "Set a password (case sensitive)",
+ "ACTION_SIGN_UP": "Sign up",
+ "TITLE_LINK_LOGIN": "Log in",
+ "LINK_LOGIN": "Are you already registered? Log in"
+ },
+ "ISSUES": {
+ "SECTION_NAME": "Issue Details",
+ "ACTION_NEW_ISSUE": "+ NEW ISSUE",
+ "ACTION_PROMOTE_TO_US": "Promote to User Story",
+ "PLACEHOLDER_FILTER_NAME": "Write the filter name and press enter",
+ "PROMOTED": "This issue has been promoted to US:",
+ "EXTERNAL_REFERENCE": "This issue has been created from",
+ "GO_TO_EXTERNAL_REFERENCE": "Go to origin",
+ "BLOCKED": "This issue is blocked",
+ "TITLE_PREVIOUS_ISSUE": "previous issue",
+ "TITLE_NEXT_ISSUE": "next issue",
+ "ACTION_DELETE": "Delete issue",
+ "LIGHTBOX_TITLE_BLOKING_ISSUE": "Blocking issue",
+ "FIELDS": {
+ "PRIORITY": "priority",
+ "SEVERITY": "severity",
+ "TYPE": "type"
+ },
+ "CONFIRM_PROMOTE": {
+ "TITLE": "Promote this issue to a new user story",
+ "MESSAGE": "Are you sure you want to create a new US from this Issue?"
+ },
+ "FILTERS": {
+ "ACTION_SAVE_CUSTOM_FILTER": "save as custom filter",
+ "CONFIRM_DELETE": {
+ "TITLE": "Delete custom filter",
+ "MESSAGE": "the custom filter '{{customFilterName}}'"
+ },
+ "FILTER_CATEGORY_TYPE": "Type",
+ "FILTER_CATEGORY_STATUS": "Status",
+ "FILTER_CATEGORY_SEVERITY": "Severity",
+ "FILTER_CATEGORY_PRIORITIES": "Priorities",
+ "FILTER_CATEGORY_TAGS": "Tags",
+ "FILTER_CATEGORY_ASSIGNED_TO": "Assigned to",
+ "FILTER_CATEGORY_CREATED_BY": "Created by",
+ "CUSTOM_FILTERS": "Custom filters"
+ },
+ "TABLE": {
+ "COLUMN_CREATED": "Created",
+ "TITLE_ACTION_CHANGE_STATUS": "Change status",
+ "EMPTY": {
+ "TITLE": "There are no issues to report :-)",
+ "SUBTITLE": "Did you find an issue?",
+ "ACTION_CREATE_ISSUE": "Create a new Issue"
+ }
+ }
+ },
+ "KANBAN": {
+ "TITLE_ACTION_FOLD": "Fold column",
+ "TITLE_ACTION_UNFOLD": "Unfold column",
+ "TITLE_ACTION_FOLD_CARDS": "Fold cards",
+ "TITLE_ACTION_UNFOLD_CARDS": "Unfold cards",
+ "TITLE_ACTION_ADD_US": "Add New User Story",
+ "TITLE_ACTION_ADD_BULK": "Add New bulk",
+ "ACTION_SHOW_ARCHIVED": "Show archived",
+ "ACTION_HIDE_ARCHIVED": "Hide archived",
+ "HIDDEN_USER_STORIES": "The user stories in this status are hidden by default",
+ "ARCHIVED": "You have archived",
+ "UNDO_ARCHIVED": "Drag & drop again to undo"
+ },
+ "SEARCH": {
+ "FILTER_USER_STORIES": "User Stories",
+ "FILTER_ISSUES": "Issues",
+ "FILTER_TASKS": "Tasks",
+ "FILTER_WIKI": "Wiki Pages",
+ "PLACEHOLDER_SEARCH": "Search in...",
+ "TITLE_ACTION_SEARCH": "search",
+ "EMPTY_TITLE": "It looks like nothing was found with your search criteria.",
+ "EMPTY_DESCRIPTION": "Maybe try one of the tabs above or search again"
+ },
+ "TEAM": {
+ "SECTION_NAME": "Team",
+ "APP_TITLE": "TEAM - {{projectName}}",
+ "PLACEHOLDER_INPUT_SEARCH": "Search by username or role...",
+ "COLUMN_MR_WOLF": "Mr. Wolf",
+ "EXPLANATION_COLUMN_MR_WOLF": "Closed issues",
+ "COLUMN_IOCAINE": "Iocaine Drinker",
+ "EXPLANATION_COLUMN_IOCAINE": "Iocaine doses ingested",
+ "COLUMN_CERVANTES": "Cervantes",
+ "EXPLANATION_COLUMN_CERVANTES": "Wiki pages edited",
+ "COLUMN_BUG_HUNTER": "Total Bug Hunter",
+ "EXPLANATION_COLUMN_BUG_HUNTER": "Bugs reported",
+ "COLUMN_NIGHT_SHIFT": "Night Shift",
+ "EXPLANATION_COLUMN_NIGHT_SHIFT": "Tasks closed",
+ "COLUMN_TOTAL_POWER": "Total Power",
+ "EXPLANATION_COLUMN_TOTAL_POWER": "Total Points",
+ "SECTION_TITLE_TEAM": "Team >",
+ "SECTION_FILTER_ALL": "All",
+ "CONFIRM_LEAVE_PROJECT": "Are you sure you want to leave the project?",
+ "ACTION_LEAVE_PROJECT": "Leave this project"
+ },
+ "CHANGE_PASSWORD": {
+ "SECTION_NAME": "Change password",
+ "FIELD_CURRENT_PASSWORD": "Current Password",
+ "PLACEHOLDER_CURRENT_PASSWORD": "Your current password (or empty if you have no password yet)",
+ "FIELD_NEW_PASSWORD": "New Password",
+ "FIELD_RETYPE_PASSWORD": "Retype Password",
+ "ERROR_PASSWORD_MATCH": "The passwords doesn't match"
+ },
+ "USER_SETTINGS": {
+ "AVATAR_MAX_SIZE": "[Max, size: {{maxFileSize}}}",
+ "MENU": {
+ "SECTION_TITLE": "User Settings",
+ "USER_PROFILE": "User profile",
+ "CHANGE_PASSWORD": "Change password",
+ "EMAIL_NOTIFICATIONS": "Email notifications"
+ },
+ "NOTIFICATIONS": {
+ "SECTION_NAME": "Email Notifications",
+ "COLUMN_PROJECT": "Project",
+ "COLUMN_RECEIVE_ALL": "Receive All",
+ "COLUMN_ONLY_INVOLVED": "Only Involved",
+ "COLUMN_NO_NOTIFICATIONS": "No notifications"
+ },
+ "POPOVER": {
+ "USER_PROFILE": "User Profile",
+ "CHANGE_PASSWORD": "Change Password",
+ "NOTIFICATIONS": "Notifications",
+ "FEEDBACK": "Feedback",
+ "TITLE_AVATAR": "User preferences"
+ }
+ },
+ "USER_PROFILE": {
+ "IMAGE_HELP": "The image will be cropped to 80x80px.
",
+ "ACTION_CHANGE_IMAGE": "Change",
+ "ACTION_USE_GRAVATAR": "Use gravatar image",
+ "ACTION_DELETE_ACCOUNT": "Delete Taiga account",
+ "CHANGE_EMAIL_SUCCESS": "Check your inbox!
We have sent a mail to your account
with the instructions to set your new address",
+ "CHANGE_PHOTO": "Change photo",
+ "FIELD": {
+ "USERNAME": "Username",
+ "EMAIL": "Email",
+ "FULL_NAME": "Full name",
+ "PLACEHOLDER_FULL_NAME": "Set your full name (ex. Íñigo Montoya)",
+ "BIO": "Bio",
+ "PLACEHOLDER_BIO": "Tell us something about you",
+ "LANGUAGE": "Language"
+ }
+ },
+ "WIZARD": {
+ "SECTION_TITLE_CHOOSE_TEMPLATE": "Choose a template",
+ "CHOOSE_TEMPLATE_TEXT": "Which template would fit better in your project?",
+ "SECTION_TITLE_CREATE_PROJECT": "Create Project",
+ "CREATE_PROJECT_TEXT": "Fresh and clean. So exciting!",
+ "PROGRESS_TEMPLATE_SELECTION": "Template selection",
+ "PROGRESS_NAME_DESCRIPTION": "Name and description"
+ },
+ "WIKI": {
+ "PLACEHOLDER_PAGE": "Write your wiki page",
+ "REMOVE": "Remove this wiki page",
+ "DELETE_LIGHTBOX_TITLE": "Delete Wiki Page",
+ "NAVIGATION": {
+ "SECTION_NAME": "Links",
+ "ACTION_ADD_LINK": "Add link"
+ },
+ "SUMMARY": {
+ "TIMES_EDITED": "times
edited",
+ "LAST_EDIT": "last
edit",
+ "LAST_MODIFICATION": "last modification"
+ }
+ },
+ "LANGUAGES": {
+ "ENGLISH": "English"
+ }
+}
diff --git a/app/partials/admin/admin-membership-paginator.jade b/app/partials/admin/admin-membership-paginator.jade
index 6d6a0aa0..742bdfac 100644
--- a/app/partials/admin/admin-membership-paginator.jade
+++ b/app/partials/admin/admin-membership-paginator.jade
@@ -2,7 +2,7 @@ ul.paginator
<% if (showPrevious) { %>
li.previous
a(href="", class="previous next_prev_button", class="disabled")
- span(i18next="pagination.prev") Prev
+ span(translate="PAGINATION.PREVIOUS")
<% } %>
<% _.each(pages, function(item) { %>
@@ -19,5 +19,5 @@ ul.paginator
<% if (showNext) { %>
li.next
a(href="", class="next next_prev_button", class="disabled")
- span(i18next="pagination.next") Next
+ span(translate="PAGINATION.NEXT")
<% } %>
diff --git a/app/partials/admin/admin-memberships-row-checkbox.jade b/app/partials/admin/admin-memberships-row-checkbox.jade
index 108bcd40..efa25b23 100644
--- a/app/partials/admin/admin-memberships-row-checkbox.jade
+++ b/app/partials/admin/admin-memberships-row-checkbox.jade
@@ -1,5 +1,5 @@
.check
input(type="checkbox", id!="<%- inputId %>")
div
- span.check-text.check-yes Yes
- span.check-text.check-no No
+ span.check-text.check-yes(translate="COMMON.YES")
+ span.check-text.check-no(translate="COMMON.NO")
diff --git a/app/partials/admin/admin-memberships.jade b/app/partials/admin/admin-memberships.jade
index 880ccb68..dd0d8510 100644
--- a/app/partials/admin/admin-memberships.jade
+++ b/app/partials/admin/admin-memberships.jade
@@ -1,5 +1,7 @@
+doctype html
+
div.wrapper.memberships(ng-controller="MembershipsController as ctrl",
- ng-init="section='admin'", tg-memberships)
+ ng-init="section='admin'; sectionName='ADMIN.MEMBERSHIPS.TITLE'", tg-memberships)
sidebar.menu-secondary.sidebar(tg-admin-navigation="memberships")
include ../includes/modules/admin-menu
@@ -9,8 +11,9 @@ div.wrapper.memberships(ng-controller="MembershipsController as ctrl",
include ../includes/components/mainTitle
.action-buttons
- a.button-green(title="Add new member" href="" ng-click="ctrl.addNewMembers()")
- span.text + New member
+ a.button-green(href="", title="{{ ADMIN.MEMBERSHIPS.ADD_BUTTON_TITLE | translate }}",
+ ng-click="ctrl.addNewMembers()")
+ span.text(translate="ADMIN.MEMBERSHIPS.ADD_BUTTON")
include ../includes/modules/admin/admin-membership-table
diff --git a/app/partials/admin/admin-project-default-values.jade b/app/partials/admin/admin-project-default-values.jade
index 14182365..886b2bac 100644
--- a/app/partials/admin/admin-project-default-values.jade
+++ b/app/partials/admin/admin-project-default-values.jade
@@ -1,5 +1,7 @@
+doctype html
+
div.wrapper(tg-project-default-values, ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Default values'")
+ ng-init="section='admin'; sectionName='ADMIN.PROJECT_DEFAULT_VALUES.TITLE'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
include ../includes/modules/admin-menu
@@ -9,7 +11,6 @@ div.wrapper(tg-project-default-values, ng-controller="ProjectProfileController a
section.main.admin-common
header
include ../includes/components/mainTitle
-
- p.total Default Values
+ p.admin-subtitle(translate="ADMIN.PROJECT_DEFAULT_VALUES.SUBTITLE")
include ../includes/modules/admin/default-values
diff --git a/app/partials/admin/admin-project-export.jade b/app/partials/admin/admin-project-export.jade
index 3274b08a..f92a33c3 100644
--- a/app/partials/admin/admin-project-export.jade
+++ b/app/partials/admin/admin-project-export.jade
@@ -1,5 +1,8 @@
+doctype html
+
div.wrapper(ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Export'")
+ ng-init="section='admin'; sectionName='ADMIN.PROJECT_EXPORT.TITLE'")
+
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
include ../includes/modules/admin-menu
@@ -9,18 +12,18 @@ div.wrapper(ng-controller="ProjectProfileController as ctrl",
section.main.admin-common(tg-project-export)
header
include ../includes/components/mainTitle
- p.admin-subtitle Export your project to save a backup or to create a new one based on this.
+ p.admin-subtitle(translate="ADMIN.PROJECT_EXPORT.SUBTITLE")
div.admin-project-export-buttons
- a.button-green.button-export(href="", title="Export your project")
- span Export
+ a.button-green.button-export(href="", title="{{ 'ADMIN.PROJECT_EXPORT.EXPORT_BUTTON_TITLE' | translate }}")
+ span(translate="ADMIN.PROJECT_EXPORT.EXPORT_BUTTON")
div.admin-project-export-result.hidden
div.spin.hidden
- img(src="/svg/spinner-circle.svg", alt="loading...")
+ img(src="/svg/spinner-circle.svg", alt="{{ 'COMMON.LOADING' | translate }}")
h3.result-title
p.result-message
a.help-button(href="https://taiga.io/support/import-export-projects/", target="_blank")
span.icon.icon-help
- span Do you need help? Check out our support page!
+ span(translate="ADMIN.HELP")
diff --git a/app/partials/admin/admin-project-modules.jade b/app/partials/admin/admin-project-modules.jade
index 0df09adf..0aae183c 100644
--- a/app/partials/admin/admin-project-modules.jade
+++ b/app/partials/admin/admin-project-modules.jade
@@ -1,5 +1,7 @@
+doctype html
+
div.wrapper(tg-project-modules, ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Modules'")
+ ng-init="section='admin'; sectionName='ADMIN.MODULES.TITLE'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
include ../includes/modules/admin-menu
@@ -15,76 +17,76 @@ div.wrapper(tg-project-modules, ng-controller="ProjectProfileController as ctrl"
div.icon.icon-backlog
div.desc
p
- span Backlog
- | Manage your user stories to maintain an organized view of upcoming and prioritized work.
+ span.title(translate="ADMIN.MODULES.BACKLOG")
+ span(translate="ADMIN.MODULES.BACKLOG_DESCRIPTION")
div.activate
input.activate-input(type="checkbox", id="functionality-backlog",
ng-model="project.is_backlog_activated")
label.button.button-gray(ng-switch="project.is_backlog_activated",
for="functionality-backlog")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
+ span(ng-switch-when="true", translate="ADMIN.MODULES.DISABLE")
+ span(ng-switch-when="false", translate="ADMIN.MODULES.ENABLE")
div.functionality(ng-class="{true:'active', false:''}[project.is_kanban_activated]")
div.icon.icon-kanban
div.desc
p
- span Kanban
- | Organize your project in a lean way with this board.
+ span.title(translate="ADMIN.MODULES.KANBAN")
+ span(translate="ADMIN.MODULES.KANBAN_DESCRIPTION")
div.activate
input.activate-input(type="checkbox", id="functionality-kanban",
ng-model="project.is_kanban_activated")
label.button.button-gray(ng-switch="project.is_kanban_activated",
for="functionality-kanban")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
+ span(ng-switch-when="true", translate="ADMIN.MODULES.DISABLE")
+ span(ng-switch-when="false", translate="ADMIN.MODULES.ENABLE")
div.functionality(ng-class="{true:'active', false:''}[project.is_issues_activated]")
div.icon.icon-issues
div.desc
p
- span Issues
- | Track the bugs, questions and enhancements related to your project. Don't miss anything!
+ span.title(translate="COMMON.ISSUES")
+ span(translate="ADMIN.MODULES.ISSUES_DESCRIPTION")
div.activate
input.activate-input(type="checkbox", id="functionality-issues",
ng-model="project.is_issues_activated")
label.button.button-gray(ng-switch="project.is_issues_activated",
for="functionality-issues")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
+ span(ng-switch-when="true", translate="ADMIN.MODULES.DISABLE")
+ span(ng-switch-when="false", translate="ADMIN.MODULES.ENABLE")
div.functionality(ng-class="{true:'active', false:''}[project.is_wiki_activated]")
div.icon.icon-wiki
div.desc
p
- span Wiki
- | Add, modify, or delete content in collaboration with others. This is the right place for your project documentation.
+ span.title(translate="ADMIN.MODULES.WIKI")
+ span(translate="ADMIN.MODULES.WIKI_DESCRIPTION")
div.activate
input.activate-input(type="checkbox", id="functionality-wiki",
ng-model="project.is_wiki_activated")
label.button.button-gray(ng-switch="project.is_wiki_activated",
for="functionality-wiki")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
+ span(ng-switch-when="true", translate="ADMIN.MODULES.DISABLE")
+ span(ng-switch-when="false", translate="ADMIN.MODULES.ENABLE")
div.functionality(ng-class="{true:'active', false:''}[isVideoconferenceActivated]")
div.icon.icon-video
div.desc
p
- span Meet Up
- | Choose your videoconference system. Even developers need face to face contact.
+ span.title(translate="ADMIN.MODULES.MEETUP")
+ span(translate="ADMIN.MODULES.MEETUP_DESCRIPTION")
div.activate
input.activate-input(type="checkbox", id="functionality-video",
ng-model="isVideoconferenceActivated")
label.button.button-gray(ng-switch="isVideoconferenceActivated",
for="functionality-video")
- span(ng-switch-when="true") Disable
- span(ng-switch-when="false") Enable
+ span(ng-switch-when="true", translate="ADMIN.MODULES.DISABLE")
+ span(ng-switch-when="false", translate="ADMIN.MODULES.ENABLE")
div.videoconference-attributes.hidden
select(ng-model="project.videoconferences",
ng-options="e.id as e.name for e in [{'id':'appear-in', 'name':'AppearIn'},{'id':'talky', 'name': 'Talky'}]")
- option(value="") Select a videoconference system
+ option(value="", translate="ADMIN.MODULES.SELECT_VIDEOCONFERENCE")
input(type="text", ng-model="project.videoconferences_salt",
- placeholder="If you want you can append a salt code to the name of the chat room")
- button.button-green.submit-button(type="submit", title="Save") Save
+ placeholder="{{'ADMIN.MODULES.SALT_CHAT_ROOM' | translate}}")
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
diff --git a/app/partials/admin/admin-project-profile.jade b/app/partials/admin/admin-project-profile.jade
index cb90def2..f71f6acb 100644
--- a/app/partials/admin/admin-project-profile.jade
+++ b/app/partials/admin/admin-project-profile.jade
@@ -1,5 +1,7 @@
+doctype html
+
div.wrapper(tg-project-profile, ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Project details'")
+ ng-init="section='admin'; sectionName='ADMIN.PROJECT_PROFILE.PROJECT_DETAILS'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
include ../includes/modules/admin-menu
@@ -12,29 +14,29 @@ div.wrapper(tg-project-profile, ng-controller="ProjectProfileController as ctrl"
form
fieldset
- label(for="project-name") Project Name
- input(type="text", name="name", placeholder="Project name", id="project-name",
+ label(for="project-name", translate="ADMIN.PROJECT_PROFILE.PROJECT_NAME")
+ input(type="text", name="name", placeholder="{{'ADMIN.PROJECT_PROFILE.PROJECT_NAME' | translate}}", id="project-name",
ng-model="project.name", data-required="true", maxlength="45")
fieldset
- label(for="project-slug") Project Slug
- input(type="text", name="slug", placeholder="Slug", id="project-slug",
+ label(for="project-slug", translate="ADMIN.PROJECT_PROFILE.PROJECT_SLUG")
+ input(type="text", name="slug", placeholder="{{'ADMIN.PROJECT_PROFILE.PROJECT_SLUG' | translate}}", id="project-slug",
ng-model="project.slug", data-required="true")
fieldset
- label(for="project-sprints") Number of sprints
- input(type="number", name="total_milestones", min="0", placeholder="Number of sprints",
+ label(for="project-sprints", translate="ADMIN.PROJECT_PROFILE.NUMBER_SPRINTS")
+ input(type="number", name="total_milestones", min="0", placeholder="{{'ADMIN.PROJECT_PROFILE.NUMBER_SPRINTS' | translate}}",
id="project-sprints", ng-model="project.total_milestones", data-type="digits")
fieldset
- label(for="total-story-points") Number of US points
- input(type="number", name="total_story_points", min="0", placeholder="Number of US points",
+ label(for="total-story-points", translate="ADMIN.PROJECT_PROFILE.NUMBER_US_POINTS")
+ input(type="number", name="total_story_points", min="0", placeholder="{{'ADMIN.PROJECT_PROFILE.NUMBER_US_POINTS' | translate}}",
id="total-story-points", ng-model="project.total_story_points",
data-type="digits", data-required="true")
fieldset
- label(for="project-description") Description
- textarea(name="description", placeholder="Description", id="project-description",
+ label(for="project-description", translate="ADMIN.PROJECT_PROFILE.DESCRIPTION")
+ textarea(name="description", placeholder="{{'ADMIN.PROJECT_PROFILE.DESCRIPTION' | translate}}", id="project-description",
ng-model="project.description", data-required="true")
div
@@ -42,14 +44,14 @@ div.wrapper(tg-project-profile, ng-controller="ProjectProfileController as ctrl"
div
input.privacy-project(type="radio", name="private-project", ng-model="project.is_private", ng-value="false")
label.trans-button(for="public-project")
- span Public Project
+ span(translate="ADMIN.PROJECT_PROFILE.PUBLIC_PROJECT")
div
input.privacy-project(type="radio", name="private-project", ng-model="project.is_private", ng-value="true")
label.trans-button(for="private-project")
- span Private Project
+ span(translate="ADMIN.PROJECT_PROFILE.PRIVATE_PROJECT")
- button.button-green.submit-button(type="submit", title="Save") Save
- a.delete-project(href="", title="Delete this project", ng-click="ctrl.openDeleteLightbox()") Delete this project
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
+ a.delete-project(href="", title="{{'ADMIN.PROJECT_PROFILE.DELETE' | translate}}", ng-click="ctrl.openDeleteLightbox()", translate="ADMIN.PROJECT_PROFILE.DELETE")
div.lightbox.lightbox-delete-project(tg-lb-delete-project)
include ../includes/modules/lightbox-delete-project
diff --git a/app/partials/admin/admin-project-reports.jade b/app/partials/admin/admin-project-reports.jade
index a066b767..7575d0cd 100644
--- a/app/partials/admin/admin-project-reports.jade
+++ b/app/partials/admin/admin-project-reports.jade
@@ -1,5 +1,7 @@
+doctype html
+
div.wrapper(ng-controller="ProjectProfileController as ctrl",
- ng-init="section='admin'; sectionName='Reports'")
+ ng-init="section='admin'; sectionName='ADMIN.REPORTS.TITLE'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-profile")
include ../includes/modules/admin-menu
@@ -9,24 +11,14 @@ div.wrapper(ng-controller="ProjectProfileController as ctrl",
section.main.admin-common(tg-project-export)
header
include ../includes/components/mainTitle
- p.admin-subtitle Export your project data in CSV format and make your own reports.
+ p.admin-subtitle(translate="ADMIN.REPORTS.SUBTITLE")
- p Download a CSV file or copy the generated URL and open it in your favourite text editor or spreadsheet to make your own project data reports. You will be able to visualize and analize all your data easily.
+ p(translate="ADMIN.REPORTS.DESCRIPTION")
- - var csvType = "US";
- - var controller = "CsvExporterUserstoriesController";
+ div.admin-attributes-section(tg-csv-us)
+ div.admin-attributes-section(tg-csv-task)
div.admin-attributes-section
- include ../includes/modules/admin/project-csv
-
- - var csvType = "Task";
- - var controller = "CsvExporterTasksController";
- div.admin-attributes-section
- include ../includes/modules/admin/project-csv
-
- - var csvType = "Issues";
- - var controller = "CsvExporterIssuesController";
- div.admin-attributes-section
- include ../includes/modules/admin/project-csv
+ div(tg-csv-issue)
a.help-button(href="https://taiga.io/support/csv-reports/", target="_blank")
span.icon.icon-help
- span How to use this on my own spreadsheet?
+ span(translate="ADMIN.REPORTS.HELP")
diff --git a/app/partials/admin/admin-project-values-custom-fields.jade b/app/partials/admin/admin-project-values-custom-fields.jade
index ddc03dfc..d8b93d59 100644
--- a/app/partials/admin/admin-project-values-custom-fields.jade
+++ b/app/partials/admin/admin-project-values-custom-fields.jade
@@ -1,4 +1,7 @@
-div.wrapper(ng-controller="ProjectValuesSectionController")
+doctype html
+
+div.wrapper(ng-controller="ProjectValuesSectionController",
+ ng-init="sectionName='ADMIN.CUSTOM_FIELDS.TITLE'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include ../includes/modules/admin-menu
@@ -7,25 +10,19 @@ div.wrapper(ng-controller="ProjectValuesSectionController")
section.main.admin-common.admin-attributes
include ../includes/components/mainTitle
- p.admin-subtitle Specify the custom fields for your user stories, tasks and issues
+ p.admin-subtitle(translate="ADMIN.CUSTOM_FIELDS.SUBTITLE")
div.admin-attributes-section(tg-project-custom-attributes,
ng-controller="ProjectCustomAttributesController as ctrl",
- ng-init="type='userstory';")
- - var customFieldSectionTitle = "User stories custom fields"
- - var customFieldButtonTitle = "Add a custom field in user stories"
+ ng-init="type='userstory'; customFieldSectionTitle='ADMIN.CUSTOM_FIELDS.US_DESCRIPTION'; customFieldButtonTitle='ADMIN.CUSTOM_FIELDS.US_ADD'")
include ../includes/modules/admin/admin-custom-attributes
div.admin-attributes-section(tg-project-custom-attributes,
ng-controller="ProjectCustomAttributesController as ctrl",
- ng-init="type='task';")
- - var customFieldSectionTitle = "Tasks custom fields"
- - var customFieldButtonTitle = "Add a custom field in tasks"
+ ng-init="type='task'; customFieldSectionTitle='ADMIN.CUSTOM_FIELDS.TASK_DESCRIPTION'; customFieldButtonTitle='ADMIN.CUSTOM_FIELDS.TASK_ADD'")
include ../includes/modules/admin/admin-custom-attributes
div.admin-attributes-section(tg-project-custom-attributes,
ng-controller="ProjectCustomAttributesController as ctrl",
- ng-init="type='issue';")
- - var customFieldSectionTitle = "Issues custom fields"
- - var customFieldButtonTitle = "Add a custom field in issues"
+ ng-init="type='issue'; customFieldSectionTitle='ADMIN.CUSTOM_FIELDS.ISSUE_DESCRIPTION'; customFieldButtonTitle='ADMIN.CUSTOM_FIELDS.ISSUE_ADD'")
include ../includes/modules/admin/admin-custom-attributes
diff --git a/app/partials/admin/admin-project-values-points.jade b/app/partials/admin/admin-project-values-points.jade
index 64ef3fb1..c36426e5 100644
--- a/app/partials/admin/admin-project-values-points.jade
+++ b/app/partials/admin/admin-project-values-points.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="ProjectValuesSectionController")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include ../includes/modules/admin-menu
@@ -7,9 +9,9 @@ div.wrapper(ng-controller="ProjectValuesSectionController")
section.main.admin-common.admin-attributes
include ../includes/components/mainTitle
- p.admin-subtitle Specify the points your user stories could be estimated to
+ p.admin-subtitle(translate="ADMIN.PROJECT_VALUES_POINTS.SUBTITLE")
div.admin-attributes-section(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='userstories'; type='points'; sectionName='Us points'",
+ ng-init="section='admin'; resource='userstories'; type='points'; sectionName='ADMIN.PROJECT_VALUES_POINTS.TITLE'",
type="points")
include ../includes/modules/admin/project-points
diff --git a/app/partials/admin/admin-project-values-priorities.jade b/app/partials/admin/admin-project-values-priorities.jade
index 4e0c5098..e2179393 100644
--- a/app/partials/admin/admin-project-values-priorities.jade
+++ b/app/partials/admin/admin-project-values-priorities.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="ProjectValuesSectionController")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include ../includes/modules/admin-menu
@@ -7,9 +9,9 @@ div.wrapper(ng-controller="ProjectValuesSectionController")
section.main.admin-common.admin-attributes
include ../includes/components/mainTitle
- p.admin-subtitle Specify the priorities your issues will have
+ p.admin-subtitle(translate="ADMIN.PROJECT_VALUES_PRIORITIES.SUBTITLE")
div.admin-attributes-section(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='priorities'; sectionName='Issue priorities'; objName='priority'",
+ ng-init="section='admin'; resource='issues'; type='priorities'; sectionName='ADMIN.PROJECT_VALUES_PRIORITIES.TITLE'; objName='priority'",
type="priorities")
include ../includes/modules/admin/project-types
diff --git a/app/partials/admin/admin-project-values-severities.jade b/app/partials/admin/admin-project-values-severities.jade
index 507ff930..5b295441 100644
--- a/app/partials/admin/admin-project-values-severities.jade
+++ b/app/partials/admin/admin-project-values-severities.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="ProjectValuesSectionController")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include ../includes/modules/admin-menu
@@ -7,9 +9,9 @@ div.wrapper(ng-controller="ProjectValuesSectionController")
section.main.admin-common.admin-attributes
include ../includes/components/mainTitle
- p.admin-subtitle Specify the severities your issues will have
+ p.admin-subtitle(translate="ADMIN.PROJECT_VALUES_SEVERITIES.SUBTITLE")
div.admin-attributes-section(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='severities'; sectionName='Issue severities'; objName='severity'",
+ ng-init="section='admin'; resource='issues'; type='severities'; sectionName='ADMIN.PROJECT_VALUES_SEVERITIES.TITLE'; objName='severity'",
type="severities")
include ../includes/modules/admin/project-types
diff --git a/app/partials/admin/admin-project-values-status.jade b/app/partials/admin/admin-project-values-status.jade
index 5f6e8876..a2488dfa 100644
--- a/app/partials/admin/admin-project-values-status.jade
+++ b/app/partials/admin/admin-project-values-status.jade
@@ -1,4 +1,7 @@
-div.wrapper(ng-controller="ProjectValuesSectionController")
+doctype html
+
+div.wrapper(ng-controller="ProjectValuesSectionController",
+ ng-init="section='admin'; sectionName='ADMIN.PROJECT_VALUES_STATUS.TITLE'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include ../includes/modules/admin-menu
@@ -7,19 +10,19 @@ div.wrapper(ng-controller="ProjectValuesSectionController")
section.main.admin-common.admin-attributes
include ../includes/components/mainTitle
- p.admin-subtitle Specify the statuses your user stories, tasks and issues will go through
+ p.admin-subtitle(translate="ADMIN.PROJECT_VALUES_STATUS.SUBTITLE")
- div.admin-attributes-section(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='userstories'; type='userstory-statuses'; sectionName='Us Statuses'",
- type="userstory-statuses")
+ div.admin-attributes-section(tg-project-values, type="userstory-statuses",
+ ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='userstories'; type='userstory-statuses'; sectionName='ADMIN.PROJECT_VALUES_STATUS.US_TITLE'")
include ../includes/modules/admin/project-us-status
- div.admin-attributes-section(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='tasks'; type='task-statuses'; sectionName='Task Statuses'",
- type="task-statuses")
+ div.admin-attributes-section(tg-project-values, type="task-statuses",
+ ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='tasks'; type='task-statuses'; sectionName='ADMIN.PROJECT_VALUES_STATUS.TASK_TITLE'")
include ../includes/modules/admin/project-status
- div.admin-attributes-section(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='issue-statuses'; sectionName='Issue Statuses'",
- type="issue-statuses")
+ div.admin-attributes-section(tg-project-values, type="issue-statuses",
+ ng-controller="ProjectValuesController as ctrl",
+ ng-init="section='admin'; resource='issues'; type='issue-statuses'; sectionName='ADMIN.PROJECT_VALUES_STATUS.ISSUE_TITLE'")
include ../includes/modules/admin/project-status
diff --git a/app/partials/admin/admin-project-values-types.jade b/app/partials/admin/admin-project-values-types.jade
index 2f033b29..7b96c24c 100644
--- a/app/partials/admin/admin-project-values-types.jade
+++ b/app/partials/admin/admin-project-values-types.jade
@@ -1,4 +1,7 @@
-div.wrapper(ng-controller="ProjectValuesSectionController")
+doctype html
+
+div.wrapper(ng-controller="ProjectValuesSectionController"
+ ng-init="sectionName='ADMIN.PROJECT_VALUES_TYPES.TITLE'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include ../includes/modules/admin-menu
@@ -7,9 +10,9 @@ div.wrapper(ng-controller="ProjectValuesSectionController")
section.main.admin-common.admin-attributes
include ../includes/components/mainTitle
- p.admin-subtitle Specify the types your user stories could be estimated to
+ p.admin-subtitle(translate="ADMIN.PROJECT_VALUES_TYPES.SUBTITLE")
div.admin-attributes-section(tg-project-values, ng-controller="ProjectValuesController as ctrl",
- ng-init="section='admin'; resource='issues'; type='issue-types'; sectionName='Issue types'; objName='type'",
+ ng-init="section='admin'; resource='issues'; sectionName='ADMIN.PROJECT_VALUES_TYPES.ISSUE_TITLE'; type='issue-types'; objName='type'",
type="issue-types")
include ../includes/modules/admin/project-types
diff --git a/app/partials/admin/admin-roles.jade b/app/partials/admin/admin-roles.jade
index 2899d960..236125ca 100644
--- a/app/partials/admin/admin-roles.jade
+++ b/app/partials/admin/admin-roles.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper.roles(ng-controller="RolesController as ctrl",
ng-init="section='admin'", tg-roles)
sidebar.menu-secondary.sidebar(tg-admin-navigation="roles")
@@ -9,29 +11,28 @@ div.wrapper.roles(ng-controller="RolesController as ctrl",
.header-with-actions
include ../includes/components/mainTitle
.action-buttons(ng-if="!role.external_user")
- a.button-red.delete-role(href="", title="Delete", ng-click="ctrl.delete()")
- span Delete
+ a.button-red.delete-role(href="", title="{{'COMMON.DELETE' | translate}}", ng-click="ctrl.delete()")
+ span(translate="COMMON.DELETE")
div(ng-if="!role.external_user")
div(tg-edit-role)
.edit-role
input(type="text", value="{{ role.name }}")
- a.save.icon.icon-floppy(href="", title="Save")
+ a.save.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
p.total
- span.role-name(title="{{ role.members_count }} members with this role") {{ role.name }}
+ span.role-name(title="{{'ADMIN.ROLES.COUNT_MEMBERS' | translate}}") {{ role.name }}
a.edit-value.icon.icon-edit
- div.any-computable-role(ng-hide="anyComputableRole") Be careful, no role in your project will be able to estimate the point value for user stories
+ div.any-computable-role(ng-hide="anyComputableRole", translate="ADMIN.ROLES.WARNING_NO_ROLE")
- div.general-category
- | When enabled, members assigned to this role will be able to estimate the point value for user stories
+ div.general-category(translate="ADMIN.ROLES.HELP_ROLE_ENABLED")
div.check
input(type="checkbox", ng-model="role.computable", ng-change="ctrl.setComputable()")
div
- span.check-text.check-yes Yes
- span.check-text.check-no No
+ span.check-text.check-yes(translate="COMMON.YES")
+ span.check-text.check-no(translate="COMMON.NO")
div(ng-if="role.external_user")
p.total
diff --git a/app/partials/admin/admin-third-parties-bitbucket.jade b/app/partials/admin/admin-third-parties-bitbucket.jade
index 0fb33c63..992da283 100644
--- a/app/partials/admin/admin-third-parties-bitbucket.jade
+++ b/app/partials/admin/admin-third-parties-bitbucket.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper.roles(tg-bitbucket-webhooks, ng-controller="BitbucketController as ctrl",
ng-init="section='admin'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
@@ -10,25 +12,25 @@ div.wrapper.roles(tg-bitbucket-webhooks, ng-controller="BitbucketController as c
form
fieldset
- label(for="secret-key") Secret key
- input(type="text", name="secret-key", ng-model="bitbucket.secret", placeholder="Secret key", id="secret-key")
+ label(for="secret-key", translate="ADMIN.THIRD_PARTIES.SECRET_KEY")
+ input(type="text", name="secret-key", ng-model="bitbucket.secret", placeholder="{{'ADMIN.THIRD_PARTIES.SECRET_KEY' | translate}}", id="secret-key")
fieldset
.select-input-text(tg-select-input-text)
div
- label(for="payload-url") Payload URL
+ label(for="payload-url", translate="ADMIN.THIRD_PARTIES.PAYLOAD_URL")
.field-with-option
- input(type="text", ng-model="bitbucket.webhooks_url", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url")
+ input(type="text", ng-model="bitbucket.webhooks_url", name="payload-url", readonly="readonly", placeholder="{{'ADMIN.THIRD_PARTIES.PAYLOAD_URL' | translate}}", id="payload-url")
.option-wrapper.select-input-content
.icon.icon-copy
- .help-copy Copy to clipboard: Ctrl+C
+ .help-copy(translate="COMMON.COPY_TO_CLIPBOARD")
fieldset
- label(for="valid-origin-ips") Valid origin ips (separated by ,)
- input(type="text", name="valid-origin-ips", tg-valid-origin-ips, ng-model="bitbucket.valid_origin_ips", placeholder="Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation.", id="valid-origin-ips")
+ label(for="valid-origin-ips", translate="ADMIN.THIRD_PARTIES.VALID_IPS")
+ input(type="text", name="valid-origin-ips", tg-valid-origin-ips, ng-model="bitbucket.valid_origin_ips", placeholder="{{'ADMIN.BITBUCKET.INFO_VERIFYING_IP' | translate}}", id="valid-origin-ips")
- button.button-green.submit-button(type="submit", title="Save") Save
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
a.help-button(href="https://taiga.io/support/bitbucket-integration/", target="_blank")
span.icon.icon-help
- span Do you need help? Check out our support page!
+ span(translate="ADMIN.HELP")
diff --git a/app/partials/admin/admin-third-parties-github.jade b/app/partials/admin/admin-third-parties-github.jade
index c9ce5e8d..03d2400b 100644
--- a/app/partials/admin/admin-third-parties-github.jade
+++ b/app/partials/admin/admin-third-parties-github.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper.roles(tg-github-webhooks, ng-controller="GithubController as ctrl",
ng-init="section='admin'")
sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
@@ -10,21 +12,21 @@ div.wrapper.roles(tg-github-webhooks, ng-controller="GithubController as ctrl",
form
fieldset
- label(for="secret-key") Secret key
- input(type="text", name="secret-key", ng-model="github.secret", placeholder="Secret key", id="secret-key")
+ label(for="secret-key", translate="ADMIN.THIRD_PARTIES.SECRET_KEY")
+ input(type="text", name="secret-key", ng-model="github.secret", placeholder="{{'ADMIN.THIRD_PARTIES.SECRET_KEY' | translate}}", id="secret-key")
fieldset
.select-input-text(tg-select-input-text)
div
- label(for="payload-url") Payload URL
+ label(for="payload-url", translate="ADMIN.THIRD_PARTIES.PAYLOAD_URL")
.field-with-option
- input(type="text", ng-model="github.webhooks_url", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url")
+ input(type="text", ng-model="github.webhooks_url", name="payload-url", readonly="readonly", placeholder="{{'ADMIN.THIRD_PARTIES.PAYLOAD_URL' | translate}}", id="payload-url")
.option-wrapper.select-input-content
.icon.icon-copy
- .help-copy Copy to clipboard: Ctrl+C
+ .help-copy(translate="COMMON.COPY_TO_CLIPBOARD")
- button.button-green.submit-button(type="submit", title="Save") Save
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}")
a.help-button(href="https://taiga.io/support/github-integration/", target="_blank")
span.icon.icon-help
- span Do you need help? Check out our support page!
+ span(translate="ADMIN.HELP")
diff --git a/app/partials/admin/admin-third-parties-gitlab.jade b/app/partials/admin/admin-third-parties-gitlab.jade
index 6ce05ce2..9a552bbc 100644
--- a/app/partials/admin/admin-third-parties-gitlab.jade
+++ b/app/partials/admin/admin-third-parties-gitlab.jade
@@ -1,38 +1,36 @@
-block head
- title Taiga Your agile, free, and open source project management tool
+doctype html
-block content
- div.wrapper.roles(tg-gitlab-webhooks, ng-controller="GitlabController as ctrl",
- ng-init="section='admin'")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
- include ../includes/modules/admin-menu
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-gitlab")
- include ../includes/modules/admin-submenu-third-parties
+div.wrapper.roles(tg-gitlab-webhooks, ng-controller="GitlabController as ctrl",
+ ng-init="section='admin'")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
+ include ../includes/modules/admin-menu
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-gitlab")
+ include ../includes/modules/admin-submenu-third-parties
- section.main.admin-common.admin-third-parties
- include ../includes/components/mainTitle
+ section.main.admin-common.admin-third-parties
+ include ../includes/components/mainTitle
- form
- fieldset
- label(for="secret-key") Secret key
- input(type="text", name="secret-key", ng-model="gitlab.secret", placeholder="Secret key", id="secret-key")
+ form
+ fieldset
+ label(for="secret-key", translate="ADMIN.THIRD_PARTIES.SECRET_KEY")
+ input(type="text", name="secret-key", ng-model="gitlab.secret", placeholder="{{'ADMIN.THIRD_PARTIES.SECRET_KEY' | translate}}", id="secret-key")
- fieldset
- .select-input-text(tg-select-input-text)
- div
- label(for="payload-url") Payload URL
- .field-with-option
- input(type="text", ng-model="gitlab.webhooks_url", name="payload-url", readonly="readonly", placeholder="Payload URL", id="payload-url")
- .option-wrapper.select-input-content
- .icon.icon-copy
- .help-copy Copy to clipboard: Ctrl+C
+ fieldset
+ .select-input-text(tg-select-input-text)
+ div
+ label(for="payload-url", translate="ADMIN.THIRD_PARTIES.PAYLOAD_URL")
+ .field-with-option
+ input(type="text", ng-model="gitlab.webhooks_url", name="payload-url", readonly="readonly", placeholder="{{'ADMIN.THIRD_PARTIES.PAYLOAD_URL' | translate}}", id="payload-url")
+ .option-wrapper.select-input-content
+ .icon.icon-copy
+ .help-copy(translate="COMMON.COPY_TO_CLIPBOARD")
- fieldset
- label(for="valid-origin-ips") Valid origin ips (separated by ,)
- input(type="text", name="valid-origin-ips", tg-valid-origin-ips, ng-model="gitlab.valid_origin_ips", placeholder="Gitlab requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation.", id="valid-origin-ips")
+ fieldset
+ label(for="valid-origin-ips", translate="ADMIN.THIRD_PARTIES.VALID_IPS")
+ input(type="text", name="valid-origin-ips", tg-valid-origin-ips, ng-model="gitlab.valid_origin_ips", placeholder="{{'ADMIN.GITLAB.INFO_VERIFYING_IP' | translate}}", id="valid-origin-ips")
- button.button-green.submit-button(type="submit", title="Save") Save
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
- a.help-button(href="https://taiga.io/support/gitlab-integration/", target="_blank")
- span.icon.icon-help
- span Do you need help? Check out our support page!
+ a.help-button(href="https://taiga.io/support/gitlab-integration/", target="_blank")
+ span.icon.icon-help
+ span(translate="ADMIN.HELP")
diff --git a/app/partials/admin/admin-third-parties-webhooks.jade b/app/partials/admin/admin-third-parties-webhooks.jade
index 6ccf0e3d..2c75563d 100644
--- a/app/partials/admin/admin-third-parties-webhooks.jade
+++ b/app/partials/admin/admin-third-parties-webhooks.jade
@@ -1,99 +1,97 @@
-block head
- title Taiga Your agile, free, and open source project management tool
+doctype html
-block content
- div.wrapper.roles(ng-controller="WebhooksController as ctrl",
- ng-init="section='admin'")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
- include ../includes/modules/admin-menu
- sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-webhooks")
- include ../includes/modules/admin-submenu-third-parties
+div.wrapper.roles(ng-controller="WebhooksController as ctrl",
+ ng-init="section='admin'")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="third-parties")
+ include ../includes/modules/admin-menu
+ sidebar.menu-tertiary.sidebar(tg-admin-navigation="third-parties-webhooks")
+ include ../includes/modules/admin-submenu-third-parties
- section.main.admin-common.admin-webhooks(tg-new-webhook)
- include ../includes/components/mainTitle
+ section.main.admin-common.admin-webhooks(tg-new-webhook)
+ include ../includes/components/mainTitle
- p.admin-subtitle Webhooks notify external services about events in Taiga, like comments, user stories....
- div.webhooks-options
- a.button-green.hidden.add-webhook(href="",title="Add a New Webhook") Add Webhook
+ p.admin-subtitle(translate="ADMIN.WEBHOOKS.SUBTITLE")
+ div.webhooks-options
+ a.button-green.hidden.add-webhook(href="", title="{{'ADMIN.WEBHOOKS.ADD_NEW' | translate}}", translate="ADMIN.WEBHOOKS.ADD_NEW")
- section.webhooks-table.basic-table
- div.table-header
- div.row
- div.webhook-service Name
- div.webhook-url URL
- div.webhook-options
- div.table-body
- div.single-webhook-wrapper(tg-webhook="webhook", ng-repeat="webhook in webhooks")
- div.edition-mode.hidden
- form.row
- fieldset.webhook-service
- input(type="text", name="name", placeholder="Type the service name", data-required="true", ng-model="webhook.name")
- div.webhook-url
- div.webhook-url-inputs
- fieldset
- input(type="text", name="url", data-type="url", placeholder="Type the service payload url", data-required="true", ng-model="webhook.url")
- fieldset
- input(type="text", name="key", placeholder="Type the service secret key", data-required="true", ng-model="webhook.key")
- div.webhook-options
- a.edit-existing.icon.icon-floppy(href="", title="Save Webhook")
- a.cancel-existing.icon.icon-delete(href="", title="Cancel Webhook")
+ section.webhooks-table.basic-table
+ div.table-header
+ div.row
+ div.webhook-service(translate="COMMON.FIELDS.NAME")
+ div.webhook-url(translate="COMMON.FIELDS.URL")
+ div.webhook-options
+ div.table-body
+ div.single-webhook-wrapper(tg-webhook="webhook", ng-repeat="webhook in webhooks")
+ div.edition-mode.hidden
+ form.row
+ fieldset.webhook-service
+ input(type="text", name="name", placeholder="{{'ADMIN.WEBHOOKS.TYPE_NAME' | translate}}", data-required="true", ng-model="webhook.name")
+ div.webhook-url
+ div.webhook-url-inputs
+ fieldset
+ input(type="text", name="url", data-type="url", placeholder="{{'ADMIN.WEBHOOKS.TYPE_PAYLOAD_URL' | translate}}", data-required="true", ng-model="webhook.url")
+ fieldset
+ input(type="text", name="key", placeholder="{{'ADMIN.WEBHOOKS.TYPE_SERVICE_SECRET' | translate}}", data-required="true", ng-model="webhook.key")
+ div.webhook-options
+ a.edit-existing.icon.icon-floppy(href="", title="{{'ADMIN.WEBHOOKS.SAVE' | translate}}")
+ a.cancel-existing.icon.icon-delete(href="", title="{{'ADMIN.WEBHOOKS.CANCEL' | translate}}")
- div.visualization-mode
- div.row
- div.webhook-service
- span(ng-bind="webhook.name")
- div.webhook-url
- span(ng-bind="webhook.url")
- a.show-history.toggle-history(href="", title="Toggle history", ng-show="webhook.logs_counter") (Show history)
+ div.visualization-mode
+ div.row
+ div.webhook-service
+ span(ng-bind="webhook.name")
+ div.webhook-url
+ span(ng-bind="webhook.url")
+ a.show-history.toggle-history(href="", title="{{'ADMIN.WEBHOOKS.TOOGLE_HISTORY' | translate}}", ng-show="webhook.logs_counter", translate="ADMIN.WEBHOOKS.SHOW_HISTORY")
- div.webhook-options
- div.webhook-options-wrapper
- a.test-webhook.icon.icon-check-square(href="", title="Test Webhook")
- a.edit-webhook.icon.icon-edit(href="", title="Edit Webhook")
- a.delete-webhook.icon.icon-delete(href="", title="Delete Webhook")
+ div.webhook-options
+ div.webhook-options-wrapper
+ a.test-webhook.icon.icon-check-square(href="", title="{{'ADMIN.WEBHOOKS.TEST' | translate}}")
+ a.edit-webhook.icon.icon-edit(href="", title="{{'ADMIN.WEBHOOKS.EDIT' | translate}}")
+ a.delete-webhook.icon.icon-delete(href="", title="{{'ADMIN.WEBHOOKS.DELETE' | translate}}")
- div.webhooks-history(ng-show="webhook.logs")
- div.history-single-wrapper(ng-repeat="log in webhook.logs")
- div.history-single
- div
- span.history-response-icon(ng-class="log.validStatus ? 'history-success' : 'history-error'", title="{{log.status}}")
- span.history-date(ng-bind="log.prettyDate")
- span.toggle-log.icon.icon-arrow-bottom
+ div.webhooks-history(ng-show="webhook.logs")
+ div.history-single-wrapper(ng-repeat="log in webhook.logs")
+ div.history-single
+ div
+ span.history-response-icon(ng-class="log.validStatus ? 'history-success' : 'history-error'", title="{{log.status}}")
+ span.history-date(ng-bind="log.prettyDate")
+ span.toggle-log.icon.icon-arrow-bottom
- div.history-single-response
- div.history-single-request-header
- span Request
- a.resend-request(href="", title="Resend request", data-log="{{log.id}}")
- span.icon.icon-reload
- span Resend request
- div.history-single-request-body
- div.response-container
- span.response-title Headers
- textarea(name="headers", ng-bind="log.prettySentHeaders")
+ div.history-single-response
+ div.history-single-request-header
+ span(translate="ADMIN.WEBHOOKS.REQUEST")
+ a.resend-request(href="", title="{{'ADMIN.WEBHOOKS.RESEND_REQUEST' | translate}}", data-log="{{log.id}}")
+ span.icon.icon-reload
+ span(translate="ADMIN.WEBHOOKS.RESEND_REQUEST")
+ div.history-single-request-body
+ div.response-container
+ span.response-title(translate="ADMIN.WEBHOOKS.HEADERS")
+ textarea(name="headers", ng-bind="log.prettySentHeaders")
- div.response-container
- span.response-title Payload
- textarea(name="payload", ng-bind="log.prettySentData")
+ div.response-container
+ span.response-title(translate="ADMIN.WEBHOOKS.PAYLOAD")
+ textarea(name="payload", ng-bind="log.prettySentData")
- div.history-single-response-header
- span Response
- div.history-single-response-body
- div.response-container
- textarea(name="response-data", ng-bind="log.response_data")
+ div.history-single-response-header
+ span(translate="ADMIN.WEBHOOKS.RESPONSE")
+ div.history-single-response-body
+ div.response-container
+ textarea(name="response-data", ng-bind="log.response_data")
- form.new-webhook-form.row.hidden
- fieldset.webhook-service
- input(type="text", name="name", placeholder="Type the service name", data-required="true", ng-model="newValue.name")
- div.webhook-url
- div.webhook-url-inputs
- fieldset
- input(type="text", name="url", data-type="url", placeholder="Type the service payload url", data-required="true", ng-model="newValue.url")
- fieldset
- input(type="text", name="key", placeholder="Type the service secret key", data-required="true", ng-model="newValue.key")
- div.webhook-options
- a.add-new.icon.icon-floppy(href="", title="Save Webhook")
- a.cancel-new.icon.icon-delete(href="", title="Cancel Webhook")
+ form.new-webhook-form.row.hidden
+ fieldset.webhook-service
+ input(type="text", name="name", placeholder="{{'ADMIN.WEBHOOKS.TYPE_NAME' | translate}}", data-required="true", ng-model="newValue.name")
+ div.webhook-url
+ div.webhook-url-inputs
+ fieldset
+ input(type="text", name="url", data-type="url", placeholder="{{'ADMIN.WEBHOOKS.TYPE_PAYLOAD_URL' | translate}}", data-required="true", ng-model="newValue.url")
+ fieldset
+ input(type="text", name="key", placeholder="{{'ADMIN.WEBHOOKS.TYPE_SERVICE_SECRET' | translate}}", data-required="true", ng-model="newValue.key")
+ div.webhook-options
+ a.add-new.icon.icon-floppy(href="", title="{{'ADMIN.WEBHOOKS.SAVE' | translate}}")
+ a.cancel-new.icon.icon-delete(href="", title="{{'ADMIN.WEBHOOKS.CANCEL' | translate}}")
- a.help-button(href="https://taiga.io/support/webhooks/", target="_blank")
- span.icon.icon-help
- span Do you need help? Check out our support page!
+ a.help-button(href="https://taiga.io/support/webhooks/", target="_blank")
+ span.icon.icon-help
+ span(translate="ADMIN.HELP")
diff --git a/app/partials/admin/project-csv.jade b/app/partials/admin/project-csv.jade
new file mode 100644
index 00000000..15b7639e
--- /dev/null
+++ b/app/partials/admin/project-csv.jade
@@ -0,0 +1,16 @@
+section.project-csv(tg-select-input-text)
+ div.project-values-title
+ h2(translate="ADMIN.CSV.TITLE", translate-values='{ csvType: csvType}')
+ a.button.button-gray(title="{{'ADMIN.CSV.DOWNLOAD' | translate}}", ng-href="{{csvUrl}}", ng-show="csvUrl", target="_blank")
+ span(translate="ADMIN.CSV.DOWNLOAD")
+
+ div.csv-regenerate-field
+ .field-with-options
+ input(type="text", placeholder="{{'ADMIN.CSV.URL_FIELD_PLACEHOLDER' | translate}}", readonly, ng-model="csvUrl")
+ .option-wrapper.select-input-content
+ .icon.icon-copy
+ a(href="", title="{{'ADMIN.CSV.TITLE_REGENERATE_URL' | translate}}", ng-click="ctrl.regenerateUuid()")
+ span.icon.icon-plus(ng-hide="csvUrl")
+ span(ng-hide="csvUrl", translate="ADMIN.CSV.ACTION_GENERATE_URL")
+ span.icon.icon-reload(ng-Show="csvUrl")
+ span(ng-Show="csvUrl", translate="ADMIN.CSV.ACTION_REGENERATE")
diff --git a/app/partials/attachment/attachment-edit.jade b/app/partials/attachment/attachment-edit.jade
index 6c0f4ed8..6d810b52 100644
--- a/app/partials/attachment/attachment-edit.jade
+++ b/app/partials/attachment/attachment-edit.jade
@@ -1,19 +1,19 @@
.attachment-name
span.icon.icon-document
- a(href!="<%- url %>", title!="<%- name %> uploaded on <%- created_date %>", target="_blank")
+ a(href!="<%- url %>", title!="{{ 'ATTACHMENT.TITLE' | translate}}", target="_blank")
| <%- name %>
.attachment-size
span <%- size %>
.editable.editable-attachment-comment
input(type="text", name="description", maxlength="140",
- value!="<%- description %>", placeholder="Type a short description")
+ value!="<%- description %>", placeholder="{{'ATTACHMENT.DESCRIPTION' | translate}}")
.editable.editable-attachment-deprecated
input(type="checkbox", name="is-deprecated",
id!="attach-<%- id %>-is-deprecated")
- label(for!="attach-<%- id %>-is-deprecated") Deprecated?
+ label(for!="attach-<%- id %>-is-deprecated", translate="{{'ATTACHMENT.DEPRECATED_FILE' | translate}}")
.attachment-settings
- a.editable-settings.icon.icon-floppy(href="", title="Save")
- a.editable-settings.icon.icon-delete(href="", title="Cancel")
+ a.editable-settings.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
+ a.editable-settings.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
diff --git a/app/partials/attachment/attachment.jade b/app/partials/attachment/attachment.jade
index 840e0ac0..9c783580 100644
--- a/app/partials/attachment/attachment.jade
+++ b/app/partials/attachment/attachment.jade
@@ -1,5 +1,5 @@
.attachment-name
- a(href!="<%- url %>", title!="<%- name %> uploaded on <%- created_date %>", target="_blank")
+ a(href!="<%- url %>", title!="{{ 'ATTACHMENT.TITLE' | translate}}", target="_blank")
span.icon.icon-documents
span <%- name %>
.attachment-size
@@ -7,13 +7,13 @@
.attachment-comments
<% if (isDeprecated){ %>
- span.deprecated-file (deprecated)
+ span.deprecated-file {{ 'ATTACHMENT.DEPRECATED' | translate}}
<% } %>
span <%- description %>
<% if (modifyPermission) {%>
.attachment-settings
- a.settings.icon.icon-edit(href="", title="Edit")
- a.settings.icon.icon-delete(href="", title="Delete")
- a.settings.icon.icon-drag-v(href="", title="Drag")
+ a.settings.icon.icon-edit(href="", title="{{'COMMON.EDIT' | translate}}")
+ a.settings.icon.icon-delete(href="", title="{{'COMMON.DELETE' | translate}}")
+ a.settings.icon.icon-drag-v(href="", title="{{'COMMON.DRAG' | translate}}")
<% } %>
\ No newline at end of file
diff --git a/app/partials/attachment/attachments.jade b/app/partials/attachment/attachments.jade
index bc025b6c..64783c67 100644
--- a/app/partials/attachment/attachments.jade
+++ b/app/partials/attachment/attachments.jade
@@ -2,10 +2,10 @@ section.attachments
.attachments-header
h3.attachments-title
span.attachments-num(tg-bind-html="ctrl.attachmentsCount")
- span.attachments-text attachments
- .add-attach(tg-check-permission!="modify_<%- type %>", title!="Add new attachment. <%- maxFileSizeMsg %>")
+ span.attachments-text(translate="ATTACHMENT.SECTION_NAME")
+ .add-attach(tg-check-permission!="modify_<%- type %>", title!="{{'ATTACHMENT.ADD' | translate}}")
<% if (maxFileSize){ %>
- span.size-info.hidden [Max. size: <%- maxFileSize %>]
+ span.size-info.hidden(translate="ATTACHMENT.MAX_FILE_SIZE", translate-values!="{ 'maxFileSize': '<%- maxFileSize %>'}")
<% }; %>
label(for="add-attach", class="icon icon-plus related-tasks-buttons")
input(id="add-attach", type="file", multiple="multiple")
@@ -22,9 +22,7 @@ section.attachments
span(ng-bind="file.progressMessage")
.percentage(ng-style="{'width': file.progressPercent}")
- a.more-attachments(href="", title="show deprecated atachments", ng-if="ctrl.deprecatedAttachmentsCount > 0")
- span.text(data-type="show") + show deprecated atachments
- span.text.hidden(data-type="hide")
- | - hide deprecated atachments
- span.more-attachments-num
- | ({{ctrl.deprecatedAttachmentsCount }} deprecated)
+ a.more-attachments(href="", title="{{'ATTACHMENT.SHOW_DEPRECATED' | translate}}", ng-if="ctrl.deprecatedAttachmentsCount > 0")
+ span.text(data-type="show", translate="ATTACHMENT.SHOW_DEPRECATED")
+ span.text.hidden(data-type="hide", translate="ATTACHMENT.HIDE_DEPRECATED")
+ span.more-attachments-num(translate="ATTACHMENT.COUNT_DEPRECATED")
diff --git a/app/partials/auth/change-password-from-recovery.jade b/app/partials/auth/change-password-from-recovery.jade
index 19781326..0ab0cf39 100644
--- a/app/partials/auth/change-password-from-recovery.jade
+++ b/app/partials/auth/change-password-from-recovery.jade
@@ -1,8 +1,10 @@
+doctype html
+
div.wrapper
div.login-main
div.login-container
h1.logo
img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- p.tagline Your agile, free, and open source project management tool
+ p.tagline(translate="COMMON.TAG_LINE")
include ../includes/modules/change-password-from-recovery-form
diff --git a/app/partials/auth/forgot-password.jade b/app/partials/auth/forgot-password.jade
index b9e848cb..22dfd2a6 100644
--- a/app/partials/auth/forgot-password.jade
+++ b/app/partials/auth/forgot-password.jade
@@ -1,9 +1,11 @@
+doctype html
+
include ../includes/components/beta
div.wrapper
div.login-main
div.login-container
img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
h1.logo Taiga
- h2.tagline LOVE YOUR PROJECT
+ h2.tagline(translate="COMMON.TAG_LINE_2")
include ../includes/modules/forgot-form
diff --git a/app/partials/auth/invitation.jade b/app/partials/auth/invitation.jade
index 18270792..43088cc8 100644
--- a/app/partials/auth/invitation.jade
+++ b/app/partials/auth/invitation.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper
div.invitation-main
div.invitation-container(tg-invitation)
@@ -8,7 +10,7 @@ div.wrapper
span.person-name(tg-bo-bind="invitation.invited_by.full_name_display")
span.invitation-text
- p has invited you to join the project
+ p(translate="AUTH.INVITED_YOU")
p.project-name(tg-bo-bind="invitation.project_name")
div.invitation-form
diff --git a/app/partials/auth/login-text.jade b/app/partials/auth/login-text.jade
index 90007171..66ac4010 100644
--- a/app/partials/auth/login-text.jade
+++ b/app/partials/auth/login-text.jade
@@ -1,3 +1,3 @@
p.login-text
- span Not registered yet?
- a(href!='<%- url %>', tg-nav='register', title='Register') create your free account here
+ span(translate="AUTH.NOT_REGISTERED_YET")
+ a(href!='<%- url %>', tg-nav='register', title='{{"AUTH.REGISTER" | translate}}', translate="AUTH.CREATE_ACCOUNT")
diff --git a/app/partials/auth/login.jade b/app/partials/auth/login.jade
index 26ab4ac4..fadbd2f2 100644
--- a/app/partials/auth/login.jade
+++ b/app/partials/auth/login.jade
@@ -1,9 +1,11 @@
+doctype html
+
include ../includes/components/beta
div.wrapper
div.login-main
div.login-container
img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
h1.logo Taiga
- h2.tagline LOVE YOUR PROJECT
+ h2.tagline(translate="COMMON.TAG_LINE_2")
include ../includes/modules/login-form
diff --git a/app/partials/auth/register.jade b/app/partials/auth/register.jade
index 95eb00d2..1c658f36 100644
--- a/app/partials/auth/register.jade
+++ b/app/partials/auth/register.jade
@@ -1,8 +1,10 @@
+doctype html
+
div.wrapper
div.login-main
div.login-container
img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
h1.logo Taiga
- h2.tagline LOVE YOUR PROJECT
+ h2.tagline(translate="COMMON.TAG_LINE_2")
include ../includes/modules/register-form
diff --git a/app/partials/backlog/backlog.jade b/app/partials/backlog/backlog.jade
index 1b96fa32..4dfe864a 100644
--- a/app/partials/backlog/backlog.jade
+++ b/app/partials/backlog/backlog.jade
@@ -1,5 +1,8 @@
+doctype html
+
div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl",
ng-init="section='backlog'")
+
sidebar.menu-secondary.extrabar.filters-bar(tg-backlog-filters)
include ../includes/modules/backlog-filters
section.main.backlog
@@ -10,23 +13,22 @@ div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl",
include ../includes/modules/burndown
div.backlog-menu
div.backlog-table-options
- a.trans-button.move-to-current-sprint(href="", title="Move to Current Sprint",
- id="move-to-current-sprint")
+ a.trans-button.move-to-current-sprint(href="", title="{{'BACKLOG.MOVE_US_TO_CURRENT_SPRINT' | translate}}", id="move-to-current-sprint")
span.icon.icon-move
- span.text Move to current Sprint
- a.trans-button(href="", title="Show Filters", id="show-filters-button")
+ span.text(translate="BACKLOG.MOVE_US_TO_CURRENT_SPRINT")
+ a.trans-button(href="", title="{{'BACKLOG.SHOW_FILTERS' | translate}}", id="show-filters-button")
span.icon.icon-filter
- span.text Show Filters
- a.trans-button(href="", title="Show Tags", id="show-tags")
+ span.text(translate="BACKLOG.SHOW_FILTERS") Show Filters
+ a.trans-button(href="", title="{{'BACKLOG.SHOW_TAGS' | translate}}", id="show-tags")
span.icon.icon-tag
- span.text Show Tags
+ span.text(translate="BACKLOG.SHOW_TAGS")
include ../includes/components/addnewus
section.backlog-table(ng-class="{'hidden': !visibleUserstories.length}")
include ../includes/modules/backlog-table
div.empty.empty-backlog(ng-class="{'hidden': visibleUserstories.length}", tg-backlog-empty-sortable)
span.icon.icon-backlog
- span.title Your backlog is empty!
- a(href="", title+"Create a new US", ng-click="ctrl.addNewUs('standard')", tg-check-permission="add_us") You may want to create a new user story
+ span.title(translate="BACKLOG.EMPTY")
+ a(href="", title="{{'BACKLOG.CREATE_NEW_US' | translate}}", ng-click="ctrl.addNewUs('standard')", tg-check-permission="add_us", translate="BACKLOG.CREATE_NEW_US_EMPTY_HELP")
sidebar.menu-secondary.sidebar
include ../includes/modules/sprints
diff --git a/app/partials/backlog/progress-bar.jade b/app/partials/backlog/progress-bar.jade
index 1c0b0831..ef03cd96 100644
--- a/app/partials/backlog/progress-bar.jade
+++ b/app/partials/backlog/progress-bar.jade
@@ -1,3 +1,3 @@
-.defined-points(title="Excess of points")
-.project-points-progress(title="Pending Points", style!="width: <%- projectPointsPercentaje %>%")
-.closed-points-progress(title="Closed points", style!="width: <%- closedPointsPercentaje %>%")
\ No newline at end of file
+.defined-points(title="{{'BACKLOG.EXCESS_OF_POINTS' | translate}}")
+.project-points-progress(title="{{'BACKLOG.PENDING_POINTS' | translate}}", style!="width: <%- projectPointsPercentaje %>%")
+.closed-points-progress(title="{{'BACKLOG.CLOSED_POINTS' | translate}}", style!="width: <%- closedPointsPercentaje %>%")
\ No newline at end of file
diff --git a/app/partials/backlog/sprint-header.jade b/app/partials/backlog/sprint-header.jade
index 852c2ab1..cd0b85fd 100644
--- a/app/partials/backlog/sprint-header.jade
+++ b/app/partials/backlog/sprint-header.jade
@@ -1,20 +1,16 @@
.sprint-name
- a.icon.icon-arrow-up(href="", title="Compact Sprint")
- <% if(isVisible){ %>
- a(href!="<%- taskboardUrl %>", title!="'Go to the taskboard of '<%- name %>'")
- span <%- name %>
- <% } %>
+ a.icon.icon-arrow-up(href="", title="{{'BACKLOG.COMPACT_SPRINT' | translate}}")
+ a(ng-if="::isVisible", href="{{::taskboardUrl}}", title="{{'BACKLOG.GO_TO_TASKBOARD' | translate}}")
+ span {{::name}}
- <% if(isEditable){ %>
- a.icon.icon-edit(href="", title="Edit Sprint")
- <% } %>
+ a.icon.icon-edit(ng-if="::isEditable", href="", title="{{'BACKLOG.EDIT_SPRINT' | translate}}")
.sprint-summary
- .sprint-date <%- estimatedDateRange %>
+ .sprint-date {{::estimatedDateRange}}
ul
li
- span.number <%- closedPoints %>
- span.description closed
+ span.number {{::closedPoints}}
+ span.description(translate="BACKLOG.CLOSED_POINTS")
li
- span.number <%- totalPoints %>
- span.description total
+ span.number {{::totalPoints}}
+ span.description(translate="BACKLOG.TOTAL_POINTS")
diff --git a/app/partials/backlog/us-role-points-popover.jade b/app/partials/backlog/us-role-points-popover.jade
index 4fcc2f65..1b864ef4 100644
--- a/app/partials/backlog/us-role-points-popover.jade
+++ b/app/partials/backlog/us-role-points-popover.jade
@@ -1,6 +1,6 @@
ul.popover.pop-role
li
- a.clear-selection(href="", title="All") All
+ a.clear-selection(href="", title="{{'COMMON.ROLES.ALL' | translate}}", translate="COMMON.ROLES.ALL")
<% _.each(roles, function(role) { %>
li
a(href="", class="role", title!="<%- role.name %>", data-role-id!="<%- role.id %>")
diff --git a/app/partials/common/components/assigned-to.jade b/app/partials/common/components/assigned-to.jade
index be741f01..24e20859 100644
--- a/app/partials/common/components/assigned-to.jade
+++ b/app/partials/common/components/assigned-to.jade
@@ -4,18 +4,18 @@
<% } %>
.assigned-to
- span.assigned-title Assigned to
+ span.assigned-title(translate="COMMON.FIELDS.ASSIGNED_TO")
a(href="" title="edit assignment", class!="user-assigned <% if(isEditable){ %>editable<% }; %>")
span.assigned-name
<% if (assignedTo) { %>
<%- assignedTo.full_name_display %>
<% } else { %>
- | Not assigned
+ | {{'COMMON.FIELDS.ASSIGNED_TO' | translate}}
<% } %>
<% if(isEditable){ %>
span.icon.icon-arrow-bottom
<% }; %>
<% if (assignedTo!==null && isEditable) { %>
- a.icon.icon-delete(href="" title="delete assignment")
+ a.icon.icon-delete(href="" title="{{'COMMON.ASSIGNED_TO.DELETE_ASSIGNMENT' | translate}}")
<% } %>
diff --git a/app/partials/common/components/block-button.jade b/app/partials/common/components/block-button.jade
index 7e187687..8dc4e055 100644
--- a/app/partials/common/components/block-button.jade
+++ b/app/partials/common/components/block-button.jade
@@ -1,4 +1,4 @@
a(href="#", class="button button-gray item-block")
- span Block
+ span(translate="COMMON.BLOCK")
a(href="#", class="button button-red item-unblock")
- span Unblock
+ span(translate="COMMON.UNBLOCK")
diff --git a/app/partials/common/components/created-by.jade b/app/partials/common/components/created-by.jade
index 6f4eb960..e9f74f06 100644
--- a/app/partials/common/components/created-by.jade
+++ b/app/partials/common/components/created-by.jade
@@ -2,7 +2,6 @@
img(src!="<%- owner.photo %>", alt!="<%- owner.full_name_display %>")
.created-by
- span.created-title
- | Created by <%- owner.full_name_display %>
+ span.created-title(translate="COMMON.CREATED_BY", translate-values!="{ 'fullDisplayName': '<%- owner.full_name_display %>'}")
span.created-date
| <%- date %>
diff --git a/app/partials/common/components/delete-button.jade b/app/partials/common/components/delete-button.jade
index dc2f2065..205e4fb4 100644
--- a/app/partials/common/components/delete-button.jade
+++ b/app/partials/common/components/delete-button.jade
@@ -1,2 +1,2 @@
a(href="", class="button button-red")
- span Delete
+ span(translate="COMMON.DELETE")
diff --git a/app/partials/common/components/editable-description-msg-edit-mode.jade b/app/partials/common/components/editable-description-msg-edit-mode.jade
index 7b761cd9..264804ea 100644
--- a/app/partials/common/components/editable-description-msg-edit-mode.jade
+++ b/app/partials/common/components/editable-description-msg-edit-mode.jade
@@ -1,2 +1 @@
-p.no-description.editable
- | Empty space is so boring... go on be descriptive... A rose by any other name would smell as sweet...
\ No newline at end of file
+p.no-description.editable(translate="COMMON.DESCRIPTION.EMPTY")
diff --git a/app/partials/common/components/editable-description-msg-read-mode.jade b/app/partials/common/components/editable-description-msg-read-mode.jade
index 2ca9dae8..e67dca53 100644
--- a/app/partials/common/components/editable-description-msg-read-mode.jade
+++ b/app/partials/common/components/editable-description-msg-read-mode.jade
@@ -1 +1 @@
-p.no-description No description yet.
\ No newline at end of file
+p.no-description(translate="COMMON.NO_DESCRIPTION")
\ No newline at end of file
diff --git a/app/partials/common/components/editable-description.jade b/app/partials/common/components/editable-description.jade
index 41d3bcf2..cb5b107d 100644
--- a/app/partials/common/components/editable-description.jade
+++ b/app/partials/common/components/editable-description.jade
@@ -3,9 +3,9 @@
span.edit.icon.icon-edit
.edit-description
- textarea(placeholder="Empty space is so boring... go on be descriptive... A rose by any other name would smell as sweet...", ng-model="item.description", tg-markitup="tg-markitup")
- a.help-markdown(href="https://taiga.io/support/taiga-markdown-syntax/", target="_blank", title="Mardown syntax help")
+ textarea(placeholder="{{'COMMON.DESCRIPTION.EMPTY' | translate}}", ng-model="item.description", tg-markitup="tg-markitup")
+ a.help-markdown(href="https://taiga.io/support/taiga-markdown-syntax/", target="_blank", title="{{'COMMON.MARKDOWN_HELP' | translate}}")
span.icon.icon-help
- span Markdown syntax help
+ span(translate="COMMON.MARKDOWN_HELP")
span.save-container
- a.save.icon.icon-floppy(href="", title="Save")
+ a.save.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
diff --git a/app/partials/common/components/editable-subject.jade b/app/partials/common/components/editable-subject.jade
index 85958e88..f77ba862 100644
--- a/app/partials/common/components/editable-subject.jade
+++ b/app/partials/common/components/editable-subject.jade
@@ -1,7 +1,7 @@
.view-subject
| {{ item.subject }}
- a.edit.icon.icon-edit(href="" title="Edit")
+ a.edit.icon.icon-edit(href="" title="{{'COMMON.EDIT' | translate}}")
.edit-subject
input(type="text", ng-model="item.subject", data-required="true", data-maxlength="500")
span.save-container
- a.save.icon.icon-floppy(href="", title="Save")
+ a.save.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
diff --git a/app/partials/common/components/main-title.jade b/app/partials/common/components/main-title.jade
index 6b44ed63..b5b1756f 100644
--- a/app/partials/common/components/main-title.jade
+++ b/app/partials/common/components/main-title.jade
@@ -1,2 +1,4 @@
-span.project-name <%- projectName %>
-span.green <%- sectionName %>
\ No newline at end of file
+span.project-name
+ | {{ projectName }}
+span.green
+ | {{ sectionName }}
diff --git a/app/partials/common/components/status-display.jade b/app/partials/common/components/status-display.jade
index fd283835..90af915b 100644
--- a/app/partials/common/components/status-display.jade
+++ b/app/partials/common/components/status-display.jade
@@ -1,9 +1,5 @@
-span
- <% if (status.is_closed) { %>
- | Closed
- <% } else { %>
- | Open
- <% } %>
+span(translate="STATUS.OPEN", ng-if="status.is_closed")
+span(translate="STATUS.CLOSED", ng-if="!status.is_closed")
span(class="us-detail-status", style!="color:<%- status.color %>")
| <%- status.name %>
diff --git a/app/partials/common/components/watchers.jade b/app/partials/common/components/watchers.jade
index 8d5dac17..e83fc025 100644
--- a/app/partials/common/components/watchers.jade
+++ b/app/partials/common/components/watchers.jade
@@ -1,10 +1,10 @@
<% if(isEditable){ %>
.watchers-header
- span.title watchers
- a.icon.icon-plus.add-watcher(href="", title="Add watcher")
+ span.title(translate="COMMON.WATCHERS.TITLE")
+ a.icon.icon-plus.add-watcher(href="", title="{{'COMMON.WATCHERS.ADD' | translate}}")
<% } else if(watchers.length > 0){ %>
.watchers-header
- span.title watchers
+ span.title(translate="COMMON.WATCHERS.TITLE")
<% }; %>
<% _.each(watchers, function(watcher) { %>
@@ -16,7 +16,7 @@
span <%- watcher.full_name_display %>
<% if(isEditable){ %>
- a.icon.icon-delete(data-watcher-id!="<%- watcher.id %>" href="" title="delete-watcher")
+ a.icon.icon-delete(data-watcher-id!="<%- watcher.id %>" href="" title="{{'WATCHERS.DELETE' | translate}}")
<% }; %>
<% } %>
<% }); %>
diff --git a/app/partials/common/estimation/us-estimation-points-per-role.jade b/app/partials/common/estimation/us-estimation-points-per-role.jade
index 7491d5a8..8fd9ce85 100644
--- a/app/partials/common/estimation/us-estimation-points-per-role.jade
+++ b/app/partials/common/estimation/us-estimation-points-per-role.jade
@@ -1,7 +1,7 @@
ul.points-per-role
li.total
span.points <%- totalPoints %>
- span.role total
+ span.role(translate="US.TOTAL_POINTS")
<% _.each(roles, function(role) { %>
li(class!="total <% if(editable){ %>clickable<% } %>", data-role-id!="<%- role.id %>", title!="<%- role.name %>")
span.points <%- role.points %>
diff --git a/app/partials/common/history/history-activity.jade b/app/partials/common/history/history-activity.jade
index 83cdb260..cf39359d 100644
--- a/app/partials/common/history/history-activity.jade
+++ b/app/partials/common/history/history-activity.jade
@@ -12,8 +12,7 @@ div(class!="activity-single <%- mode %>")
<% if (comment.length > 0) { %>
<% if ((deleteCommentDate || deleteCommentUser)) { %>
.deleted-comment
- span
- | Comment deleted by <%- deleteCommentUser %> on <%- deleteCommentDate %>
+ span(translate="COMMENTS.DELETED_INFO", translate-values!="{ deleteCommentUser: '<%- deleteCommentUser %>', deleteCommentDate: '<% deleteCommentDate %>'}")
<% } %>
.comment.wysiwyg
| <%= comment %>
@@ -25,7 +24,7 @@ div(class!="activity-single <%- mode %>")
<% if(changes.length > 0) { %>
.changes
<% if (mode != "activity") { %>
- a.changes-title(href="", title="Show activity")
+ a.changes-title(href="", title="{{'ACTIVITY.SHOW_ACTIVITY' | translate}}")
span <%- changesText %>
span.icon.icon-arrow-up
<% } %>
diff --git a/app/partials/common/history/history-base-entries.jade b/app/partials/common/history/history-base-entries.jade
index c9f566da..fe662b98 100644
--- a/app/partials/common/history/history-base-entries.jade
+++ b/app/partials/common/history/history-base-entries.jade
@@ -1,6 +1,5 @@
<% if (showMore > 0) { %>
-a(href="" title="Show more" class="show-more show-more-comments")
- | + Show previous entries (<%- showMore %> more)
+a(href="" title="{{ 'ACTIVITY.SHOW_MORE' | translate}}" class="show-more show-more-comments", translate="ACTIVITY.SHOW_MORE", translate-values!="{showMore: '<%- showMore %>'}")
<% } %>
<% _.each(entries, function(entry) { %>
<%= entry %>
diff --git a/app/partials/common/history/history-base.jade b/app/partials/common/history/history-base.jade
index 383c21ab..4d2f4ed9 100644
--- a/app/partials/common/history/history-base.jade
+++ b/app/partials/common/history/history-base.jade
@@ -3,21 +3,21 @@ section.history
li
a(href="#", class="active")
span.icon.icon-comment
- span.tab-title Comments
+ span.tab-title(translate="COMMENTS.TITLE")
li
a(href="#")
span.icon.icon-issues
- span.tab-title Activity
+ span.tab-title(translate="ACTIVITY.TITLE")
section.history-comments
.comments-list
div(tg-check-permission!="modify_<%- type %>", tg-toggle-comment, class="add-comment")
- textarea(placeholder="Type a new comment here", ng-model!="<%- ngmodel %>.comment", tg-markitup="tg-markitup")
+ textarea(placeholder="{{'COMMENTS.TYPE_NEW_COMMENT' | translate}}", ng-model!="<%- ngmodel %>.comment", tg-markitup="tg-markitup")
<% if (mode !== "edit") { %>
- a(class="help-markdown", href="https://taiga.io/support/taiga-markdown-syntax/", target="_blank", title="Mardown syntax help")
+ a(class="help-markdown", href="https://taiga.io/support/taiga-markdown-syntax/", target="_blank", title="{{'COMMON.DESCRIPTION.MARKDOWN_HELP' | translate}}")
span.icon.icon-help
- span Markdown syntax help
- a(href="", title="Comment", class="button button-green save-comment")
- span Comment
+ span(translate="COMMON.DESCRIPTION.MARKDOWN_HELP")
+ a(href="", title="{{'COMMENTS.COMMENT' | translate}}", class="button button-green save-comment")
+ span(translate="COMMENTS.COMMENT")
<% } %>
section.history-activity.hidden
.changes-list
diff --git a/app/partials/common/history/history-change-generic.jade b/app/partials/common/history/history-change-generic.jade
index a5fbb73b..8c29b5c1 100644
--- a/app/partials/common/history/history-change-generic.jade
+++ b/app/partials/common/history/history-change-generic.jade
@@ -3,10 +3,10 @@
span <%- name %>
.activity-fromto
p
- strong from
+ strong(translate="COMMON.FROM")
br
span <%- from %>
p
- strong to
+ strong(translate="COMMON.TO")
br
span <%- to %>
diff --git a/app/partials/common/history/history-change-list.jade b/app/partials/common/history/history-change-list.jade
index f11c5fa0..038cfc88 100644
--- a/app/partials/common/history/history-change-list.jade
+++ b/app/partials/common/history/history-change-list.jade
@@ -4,14 +4,14 @@
.activity-fromto
<% if (removed.length > 0) { %>
p
- strong removed
+ strong(translate="ACTIVITY.REMOVED")
br
span <%- removed %>
<% } %>
<% if (added.length > 0) { %>
p
- strong added
+ strong(translate="ACTIVITY.ADDED")
br
span <%- added %>
<% } %>
diff --git a/app/partials/common/history/history-change-points.jade b/app/partials/common/history/history-change-points.jade
index d226cd79..1f4df3c6 100644
--- a/app/partials/common/history/history-change-points.jade
+++ b/app/partials/common/history/history-change-points.jade
@@ -1,14 +1,14 @@
<% _.each(points, function(point, name) { %>
.change-entry
.activity-changed
- span US points (<%- name.toLowerCase() %>)
+ span(translate="ACTIVITY.US_POINTS", translate-values!="<%- name.toLowerCase() %>")
.activity-fromto
p
- strong from
+ strong(translate="COMMON.FROM")
br
span <%- point[0] %>
p
- strong to
+ strong(translate="COMMON.TO")
br
span <%- point[1] %>
<% }); %>
\ No newline at end of file
diff --git a/app/partials/common/history/history-deleted-comment.jade b/app/partials/common/history/history-deleted-comment.jade
index 434a84c2..f4bc6c9d 100644
--- a/app/partials/common/history/history-deleted-comment.jade
+++ b/app/partials/common/history/history-deleted-comment.jade
@@ -1,11 +1,11 @@
.activity-single.comment.deleted-comment
div
- span Comment deleted by <%- deleteCommentUser %> on <%- deleteCommentDate %>
- a(href="", title="Show comment", class="show-deleted-comment") (Show deleted comment)
- a(href="", title="Show comment", class="hide-deleted-comment hidden") (Hide deleted comment)
+ span(translate="COMMENTS.DELETED_INFO", translate-values!="{deleteCommentUser: '<%- deleteCommentUser %>', deleteCommentDate: '<%- deleteCommentDate %>'}")
+ a(href="", title="{{'COMMENTS.SHOW_DELETED' | translate}}", class="show-deleted-comment", translate="COMMENTS.SHOW_DELETED")
+ a(href="", title="{{'COMMENTS.HIDE_DELETED' | translate}}", class="hide-deleted-comment hidden", translate="COMMENTS.HIDE_DELETED")
.comment-body.wysiwyg <%= deleteComment %>
<% if (canRestoreComment) { %>
a(href="", class="comment-restore", data-activity-id!="<%- activityId %>")
span.icon.icon-reload
- span Restore comment
+ span(translate="COMMENTS.RESTORE")
<% } %>
diff --git a/app/partials/common/lightbox/lightbox-assigned-to-users.jade b/app/partials/common/lightbox/lightbox-assigned-to-users.jade
index d734bc8a..f85d2df2 100644
--- a/app/partials/common/lightbox/lightbox-assigned-to-users.jade
+++ b/app/partials/common/lightbox/lightbox-assigned-to-users.jade
@@ -1,17 +1,17 @@
<% if (selected) { %>
.watcher-single.active
.watcher-avatar
- a(href="", title="Assigned to", class="avatar")
+ a(href="", title="{{'COMMON.ASSIGNED_TO' | translate}}", class="avatar")
img(src!="<%- selected.photo %>")
a(href="", title!="<%- selected.full_name_display %>", class="watcher-name")
| <%-selected.full_name_display %>
- a(href="", title="Remove assigned", class="icon icon-delete remove-assigned-to")
+ a(href="", title="{{'REMOVE_ASSIGNED' | translate}}", class="icon icon-delete remove-assigned-to")
<% } %>
<% _.each(users, function(user) { %>
.watcher-single(data-user-id!="<%- user.id %>")
.watcher-avatar
- a(href="#", title="Assigned to", class="avatar")
+ a(href="#", title="{{'COMMON.ASSIGNED_TO.TITLE' | translate}}", class="avatar")
img(src!="<%- user.photo %>")
a(href="", title!="<%- user.full_name_display %>", class="watcher-name")
| <%- user.full_name_display %>
@@ -19,5 +19,5 @@
<% if (showMore) { %>
div(ng-show="filteringUsers", class="more-watchers")
- span ...too many users, keep filtering
+ span(translate="COMMON.ASSIGNED_TO.TOO_MANY")
<% } %>
\ No newline at end of file
diff --git a/app/partials/common/lightbox/lightbox-assigned-to.jade b/app/partials/common/lightbox/lightbox-assigned-to.jade
index 97885e59..34e87b9a 100644
--- a/app/partials/common/lightbox/lightbox-assigned-to.jade
+++ b/app/partials/common/lightbox/lightbox-assigned-to.jade
@@ -1,9 +1,9 @@
a.close(href="", title="close")
span.icon.icon-delete
div.form
- h2.title Select assigned to
+ h2.title(translate="LIGHTBOX.ASSIGNED_TO.SELECT")
fieldset
- input(type="text", data-maxlength="500", placeholder="Search for users", ng-model="usersSearch")
+ input(type="text", data-maxlength="500", placeholder="{{'LIGHTBOX.ASSIGNED_TO.SEARCH' | translate}}", ng-model="usersSearch")
//-This block is rendered by the directive
div.watchers
diff --git a/app/partials/common/lightbox/lightbox-block.jade b/app/partials/common/lightbox/lightbox-block.jade
index a6290d16..f8c7ac18 100644
--- a/app/partials/common/lightbox/lightbox-block.jade
+++ b/app/partials/common/lightbox/lightbox-block.jade
@@ -1,9 +1,9 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
div.form
h2.title
fieldset
- textarea.reason(placeholder="Please explain the reason")
+ textarea.reason(placeholder="{{'COMMON.BLOCKED_REASON' | translate}}")
a.button-green(href="")
- span Save
+ span(translate="COMMON.SAVE")
diff --git a/app/partials/common/lightbox/lightbox-blocking-message-input.jade b/app/partials/common/lightbox/lightbox-blocking-message-input.jade
index 63c0b0a8..e3fb9d14 100644
--- a/app/partials/common/lightbox/lightbox-blocking-message-input.jade
+++ b/app/partials/common/lightbox/lightbox-blocking-message-input.jade
@@ -1,4 +1,4 @@
fieldset.blocked-note.hidden
textarea(name="blocked_note",
- placeholder="Why is this user story blocked?",
+ placeholder="{{'COMMON.BLOCKED_NOTE' | translate}}",
ng-model!="<%- ngmodel %>")
diff --git a/app/partials/common/lightbox/lightbox-users.jade b/app/partials/common/lightbox/lightbox-users.jade
index a4c3dfc0..90a1b369 100644
--- a/app/partials/common/lightbox/lightbox-users.jade
+++ b/app/partials/common/lightbox/lightbox-users.jade
@@ -1,7 +1,7 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
div.form
- h2.title Add watchers
+ h2.title(translate="COMMON.WATCHERS.ADD")
fieldset
- input(type="text", data-maxlength="500", placeholder="Search for users", ng-model="usersSearch")
+ input(type="text", data-maxlength="500", placeholder="{{'LIGHTBOX.ASSIGNED_TO.SEARCH' | translate}}", ng-model="usersSearch")
div.watchers //- The content of this is rendered by directive
diff --git a/app/partials/common/tag/lb-tag-line-tags.jade b/app/partials/common/tag/lb-tag-line-tags.jade
index 203e54bc..035c0335 100644
--- a/app/partials/common/tag/lb-tag-line-tags.jade
+++ b/app/partials/common/tag/lb-tag-line-tags.jade
@@ -1,5 +1,5 @@
<% _.each(tags, function(tag) { %>
span(class="tag", style!="<%- tag.style %>")
span.tag-name <%- tag.name %>
- a(href="", title="delete tag", class="icon icon-delete")
+ a(href="", title="{{'COMMON.TAGS.DELETE'}}", class="icon icon-delete")
<% }); %>
\ No newline at end of file
diff --git a/app/partials/common/tag/lb-tag-line.jade b/app/partials/common/tag/lb-tag-line.jade
index 22b8813b..1c06a23e 100644
--- a/app/partials/common/tag/lb-tag-line.jade
+++ b/app/partials/common/tag/lb-tag-line.jade
@@ -1,3 +1,3 @@
.tags-container
-input(type="text", placeholder="I'm it! Tag me...", class="tag-input")
-a(href="", title="Save", class="save icon icon-floppy hidden")
+input(type="text", placeholder="{{'COMMON.TAGS.PLACEHOLDER' | translate}}", class="tag-input")
+a(href="", title="{{'COMMON.SAVE' | translate}}", class="save icon icon-floppy hidden")
diff --git a/app/partials/common/tag/tag-line.jade b/app/partials/common/tag/tag-line.jade
index cdac294f..c7df1c3a 100644
--- a/app/partials/common/tag/tag-line.jade
+++ b/app/partials/common/tag/tag-line.jade
@@ -1,7 +1,7 @@
.tags-container
-a(href="#", class="add-tag hidden", title="Add tag")
+a(href="#", class="add-tag hidden", title="{{'COMMON.TAGS.ADD' | translate}}")
span.icon.icon-plus
- span.add-tag-text Add tag
+ span.add-tag-text(translate="COMMON.TAGS.ADD")
-input(type="text", placeholder="I'm it! Tag me...", class="tag-input hidden")
-a(href="", title="Save", class="save icon icon-floppy hidden")
\ No newline at end of file
+input(type="text", placeholder="{{'COMMON.TAGS.PLACEHOLDER' | translate}}", class="tag-input hidden")
+a(href="", title="{{'COMMON.SAVE' | translate}}", class="save icon icon-floppy hidden")
\ No newline at end of file
diff --git a/app/partials/common/wysiwyg/wysiwyg-markitup-preview.jade b/app/partials/common/wysiwyg/wysiwyg-markitup-preview.jade
index 814b728f..fbbb20d5 100644
--- a/app/partials/common/wysiwyg/wysiwyg-markitup-preview.jade
+++ b/app/partials/common/wysiwyg/wysiwyg-markitup-preview.jade
@@ -1,5 +1,5 @@
.preview
.actions
- a(href="#" title="Edit" class="icon icon-edit edit")
+ a(href="#" title="{{'COMMON.EDIT' | translate}}" class="icon icon-edit edit")
.content.wysiwyg
| <%= data %>
diff --git a/app/partials/contrib/main.jade b/app/partials/contrib/main.jade
index 80474817..cc9a2b5e 100644
--- a/app/partials/contrib/main.jade
+++ b/app/partials/contrib/main.jade
@@ -1,12 +1,10 @@
-block head
- title Taiga Your agile, free, and open source project management tool
+doctype html
-block content
- div.wrapper.roles(ng-init="section='admin'", ng-controller="ContribController as ctrl")
- sidebar.menu-secondary.sidebar(tg-admin-navigation="contrib")
- include ../includes/modules/admin-menu
+div.wrapper.roles(ng-init="section='admin'", ng-controller="ContribController as ctrl")
+ sidebar.menu-secondary.sidebar(tg-admin-navigation="contrib")
+ include ../includes/modules/admin-menu
- sidebar.menu-tertiary.sidebar
- include ../includes/modules/admin/admin-submenu-contrib
+ sidebar.menu-tertiary.sidebar
+ include ../includes/modules/admin/admin-submenu-contrib
- section.main.admin-common.admin-contrib(ng-include="pluginTemplate")
+ section.main.admin-common.admin-contrib(ng-include="pluginTemplate")
diff --git a/app/partials/custom-attributes/custom-attribute-value-edit.jade b/app/partials/custom-attributes/custom-attribute-value-edit.jade
index d3c3aabc..900518bb 100644
--- a/app/partials/custom-attributes/custom-attribute-value-edit.jade
+++ b/app/partials/custom-attributes/custom-attribute-value-edit.jade
@@ -11,4 +11,4 @@ form.custom-field-single.editable
input#custom-field-description(name="description", type="text", value!="<%- value %>")
div.custom-field-options
- a.icon.icon-floppy(href="", title="Save Custom Field")
+ a.icon.icon-floppy(href="", title="{{'COMMON.CUSTOM_ATTRIBUTES.SAVE' | translate}}")
diff --git a/app/partials/custom-attributes/custom-attribute-value.jade b/app/partials/custom-attributes/custom-attribute-value.jade
index b2502c04..499bce57 100644
--- a/app/partials/custom-attributes/custom-attribute-value.jade
+++ b/app/partials/custom-attributes/custom-attribute-value.jade
@@ -13,5 +13,5 @@ div.custom-field-single
<% if (isEditable) { %>
div.custom-field-options
- a.icon.icon-edit(href="", title="Edit Custom Field")
+ a.icon.icon-edit(href="", title="{{'COMMON.CUSTOM_ATTRIBUTES.EDIT' | translate}}")
<% } %>
diff --git a/app/partials/custom-attributes/custom-attributes-values.jade b/app/partials/custom-attributes/custom-attributes-values.jade
index cadbb100..3c34c6e1 100644
--- a/app/partials/custom-attributes/custom-attributes-values.jade
+++ b/app/partials/custom-attributes/custom-attributes-values.jade
@@ -1,6 +1,6 @@
section.duty-custom-fields(ng-show="ctrl.customAttributes.length")
div.custom-fields-header
- span Custom Fields
+ span(translate="COMMON.CUSTOM_ATTRIBUTES.CUSTOM_FIELDS")
// Remove .open class on click on this button in both .icon and .custom-fields-body to close
a.icon.icon-arrow-bottom(class!="<% if (!collapsed) { %>open<% } %>")
div.custom-fields-body(class!="<% if (!collapsed) { %>open<% } %>")
diff --git a/app/partials/error/error.jade b/app/partials/error/error.jade
index 5e3da8ed..356339f8 100644
--- a/app/partials/error/error.jade
+++ b/app/partials/error/error.jade
@@ -1,7 +1,10 @@
+doctype html
+
div.error-main
div.error-container
object.logo-svg(type="image/svg+xml", data="/svg/logo.svg")
img(src="/images/logo.png", alt="TAIGA")
h1.logo Taiga
- p.error-text Something happened and our Oompa Loompas are working on it. Try reloading again soon.
- a(href="/", title="") Take me home
+ p.error-text(translate="ERROR.TEXT1")
+ p.error-text(translate="ERROR.TEXT2")
+ a(href="/", title="", translate="COMMON.GO_HOME")
diff --git a/app/partials/error/not-found.jade b/app/partials/error/not-found.jade
index faf411b2..12172038 100644
--- a/app/partials/error/not-found.jade
+++ b/app/partials/error/not-found.jade
@@ -1,7 +1,9 @@
+doctype html
+
div.error-main
div.error-container
object.logo-svg(type="image/svg+xml", data="/svg/logo.svg")
img(src="/images/logo.png", alt="TAIGA")
- h1.logo Not found
- p.error-text Error 404. The page you are looking for no longer exists. Perhaps you can return back to TAIGA homepage and see if you can find what you are looking for.
- a(href="/", title="") Take me home
+ h1.logo(translate="ERROR.NOT_FOUND")
+ p.error-text(translate="ERROR.NOT_FOUND_TEXT")
+ a(href="/", title="", translate="COMMON.GO_HOME")
diff --git a/app/partials/error/permission-denied.jade b/app/partials/error/permission-denied.jade
index a855c2af..6f3b8efb 100644
--- a/app/partials/error/permission-denied.jade
+++ b/app/partials/error/permission-denied.jade
@@ -1,7 +1,9 @@
+doctype html
+
div.error-main
div.error-container
object.logo-svg(type="image/svg+xml", data="/svg/logo.svg")
img(src="/images/logo.png", alt="TAIGA")
- h1.logo Permission denied
- p.error-text Error 403.
- a(href="/", title="") Take me home
+ h1.logo(translate="ERROR.PERMISSION_DENIED")
+ p.error-text(translate="ERROR.PERMISSION_DENIED_CODE")
+ a(href="/", title="", translate="COMMON.GO_HOME")
diff --git a/app/partials/includes/components/addnewtask.jade b/app/partials/includes/components/addnewtask.jade
index 0ec02634..fd25ed2d 100644
--- a/app/partials/includes/components/addnewtask.jade
+++ b/app/partials/includes/components/addnewtask.jade
@@ -1,6 +1,6 @@
a.icon.icon-plus(tg-check-permission="add_task",
- href="", title="Add a new Task",
+ href="", title="{{'TASKBOARD.TITLE_ACTION_ADD' | translate}}",
ng-click="ctrl.addNewTask('standard', us)")
a.icon.icon-bulk(tg-check-permission="add_task",
- href="", title="Add some new Tasks in bulk",
+ href="", title="{{'TASKBOARD.TITLE_ACTION_ADD_BULK' | translate}}",
ng-click="ctrl.addNewTask('bulk', us)")
diff --git a/app/partials/includes/components/addnewus.jade b/app/partials/includes/components/addnewus.jade
index 403c271c..52f59b9a 100644
--- a/app/partials/includes/components/addnewus.jade
+++ b/app/partials/includes/components/addnewus.jade
@@ -1,9 +1,9 @@
div.new-us
- a.button-green(href="", title="Add a new User Story",
+ a.button-green(href="", title="{{'US.ADD' | translate}}",
ng-click="ctrl.addNewUs('standard')",
tg-check-permission="add_us")
- span.text + Add a new User Story
- a.button-bulk(href="", title="Add some new User Stories in bulk",
+ span.text {{'US.ADD' | translate}}
+ a.button-bulk(href="", title="{{'US.ADD_BULK' | translate}}",
ng-click="ctrl.addNewUs('bulk')",
tg-check-permission="add_us")
span.icon.icon-bulk
diff --git a/app/partials/includes/components/backlog-row.jade b/app/partials/includes/components/backlog-row.jade
index f1b39194..b342de08 100644
--- a/app/partials/includes/components/backlog-row.jade
+++ b/app/partials/includes/components/backlog-row.jade
@@ -9,16 +9,16 @@ div.row.us-item-row(ng-repeat="us in visibleUserstories track by us.id", tg-bind
span(ng-bind="us.subject")
div.us-settings
a.icon.icon-edit(tg-check-permission="modify_us", href="",
- ng-click="ctrl.editUserStory(us)", title="Edit")
+ ng-click="ctrl.editUserStory(us)", title="{{'COMMON.EDIT' | translate}}")
a.icon.icon-delete(tg-check-permission="delete_us", href="",
- ng-click="ctrl.deleteUserStory(us)", title="Delete")
+ ng-click="ctrl.deleteUserStory(us)", title="{{'COMMON.DELETE' | translate}}")
div.status(tg-us-status="us" on-update="ctrl.updateUserStoryStatus()")
- a.us-status(href="", title="Status Name")
+ a.us-status(href="", title="{{'BACKLOG.STATUS_NAME' | translate}}")
span.us-status-bind
span.icon.icon-arrow-bottom(tg-check-permission="modify_us")
div.points(tg-backlog-us-points="us")
- a.us-points(href="", title="Points")
+ a.us-points(href="", title="{{'COMMON.FIELDS.POINTS' | translate}}")
- a.icon.icon-drag-v(tg-check-permission="modify_us", href="", title="Drag")
+ a.icon.icon-drag-v(tg-check-permission="modify_us", href="", title="{{'COMMON.DRAG' | translate}}")
diff --git a/app/partials/includes/components/beta.jade b/app/partials/includes/components/beta.jade
index 08f38297..a82f61ed 100644
--- a/app/partials/includes/components/beta.jade
+++ b/app/partials/includes/components/beta.jade
@@ -1 +1 @@
-img.beta(src="/images/beta.png", title="We are on beta!")
+img.beta(src="/images/beta.png", title="{{'COMMON.BETA' | translate}}")
diff --git a/app/partials/includes/components/filter.jade b/app/partials/includes/components/filter.jade
deleted file mode 100644
index 19d8392f..00000000
--- a/app/partials/includes/components/filter.jade
+++ /dev/null
@@ -1,5 +0,0 @@
-// Depreacted, should be removed when any
-// other static template not need it.
-a.single-filter(href="", title="filter")
- span.name filter
- span.number 23
diff --git a/app/partials/includes/components/large-summary.jade b/app/partials/includes/components/large-summary.jade
deleted file mode 100644
index ef20c24f..00000000
--- a/app/partials/includes/components/large-summary.jade
+++ /dev/null
@@ -1,36 +0,0 @@
-div.summary.large-summary
- div.large-summary-wrapper
- div
- div.summary-progress-bar
- div.current-progress
- div.data
- span.number 30%
- span.description completed
- div.summary-stats
- span.number 12
- span.description project
points
- div.summary-stats
- span.number 23
- span.description defined
points
- div.summary-stats
- span.number 12
- span.description assigned
points
- div.summary-stats.summary-stats-divider
- span.number 23
- span.description closed
points
-
- div.summary-stats
- span.icon.icon-bulk
- span.number 73
- span.description created
tasks
- div.summary-stats
- span.number 72
- span.description closed
tasks
- div.summary-stats
- span.number 18
- span.description remaining
tasks
- div.summary-stats
- span.icon.icon-iocaine
- span.number 10
- span.description iocaine
doses
- a.icon.icon-stats.toggle-analytics-visibility(href="", title="Show statistics")
diff --git a/app/partials/includes/components/mainTitle.jade b/app/partials/includes/components/mainTitle.jade
index 9e15a6bb..8e7fa75d 100644
--- a/app/partials/includes/components/mainTitle.jade
+++ b/app/partials/includes/components/mainTitle.jade
@@ -1,2 +1,2 @@
header
- h1(tg-main-title)
+ h1(tg-main-title, project-name="project.name", i18n-section-name="{{ sectionName }}")
diff --git a/app/partials/includes/components/notification-message.jade b/app/partials/includes/components/notification-message.jade
index cb227eaa..64bbe5fb 100644
--- a/app/partials/includes/components/notification-message.jade
+++ b/app/partials/includes/components/notification-message.jade
@@ -12,19 +12,19 @@
div.notification-message.notification-message-success
div.icon.icon-notification-success
div.text
- h4.warning Everything is ok
- p Our oompa Loompas saved all your changes!
- a.icon.icon-delete(href="", title="Close notification")
+ h4.warning(translate="NOTIFICATION.OK")
+ p(translate="NOTIFICAION.SAVED")
+ a.icon.icon-delete(href="", title="{{'NOTIFICATION.CLOSE' | translate}}")
div.notification-message.notification-message-error
div.icon.icon-notification-error
div.text
- h4.warning Oops, something happened...
- p Our oompa Loompas are sad, your changes were not saved!
- a.icon.icon-delete(href="", title="Close notification")
+ h4.warning(translate="NOTIFICATION.WARNING")
+ p(translate="NOTIFICATION.WARNING_TEXT")
+ a.icon.icon-delete(href="", title="{{'NOTIFICATION.CLOSE' | translate}}")
div.notification-light.notification-message-light-error
div.text
- h4.warning Oops, something happened...
- p Our oompa Loompas are sad, your changes were not saved!
- a.icon.icon-delete(href="", title="Close notification")
+ h4.warning(translate="NOTIFICATION.WARNING")
+ p(translate="NOTIFICATION.WARNING_TEXT")
+ a.icon.icon-delete(href="", title="{{'NOTIFICATION.CLOSE' | translate}}")
diff --git a/app/partials/includes/components/sprint-summary.jade b/app/partials/includes/components/sprint-summary.jade
index 64d6bdbb..caa16ba2 100644
--- a/app/partials/includes/components/sprint-summary.jade
+++ b/app/partials/includes/components/sprint-summary.jade
@@ -7,22 +7,22 @@ div.summary.large-summary
div.summary-stats
span.number(ng-bind="stats.totalPointsSum|default:'--'")
- span.description total
points
+ span.description(translate="BACKLOG.SPRINT_SUMMARY.TOTAL_POINTS")
div.summary-stats
span.number(ng-bind="stats.completedPointsSum|default:'--'")
- span.description completed
points
+ span.description(translate="BACKLOG.SPRINT_SUMMARY.COMPLETED_POINTS")
div.summary-stats
span.icon.icon-bulk
span.number(ng-bind="stats.openTasks|default:'--'")
- span.description open
tasks
+ span.description(translate="BACKLOG.SPRINT_SUMMARY.OPEN_TASKS")
div.summary-stats
span.number(ng-bind="stats.completed_tasks|default:'--'")
- span.description closed
tasks
+ span.description(translate="BACKLOG.SPRINT_SUMMARY.CLOSED_TASKS")
- div.summary-stats(title="Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!")
+ div.summary-stats(title="{{'COMMON.IOCAINE_TEXT' | translate}}")
span.icon.icon-iocaine
span.number(ng-bind="stats.iocaine_doses|default:'--'")
- span.description iocaine
doses
+ span.description(translate="BACKLOG.SPRINT_SUMMARY.IOCAINE_DOSES")
- a.icon.icon-stats.toggle-analytics-visibility(href="", title="Show statistics")
+ a.icon.icon-stats.toggle-analytics-visibility(href="", title="{{'BACKLOG.SPRINT_SUMMARY.SHOW_STATISTICS_TITLE' | translate}}")
diff --git a/app/partials/includes/components/summary.jade b/app/partials/includes/components/summary.jade
index 11624d8d..1b29810d 100644
--- a/app/partials/includes/components/summary.jade
+++ b/app/partials/includes/components/summary.jade
@@ -6,13 +6,13 @@ div.summary
div.summary-stats
span.number(ng-bind="stats.total_points") --
- span.description project
points
+ span.description(translate="BACKLOG.SUMMARY.PROJECT_POINTS")
div.summary-stats
span.number(ng-bind="stats.defined_points") --
- span.description defined
points
+ span.description(translate="BACKLOG.SUMMARY.DEFINED_POINTS")
div.summary-stats
span.number(ng-bind="stats.closed_points") --
- span.description closed
points
+ span.description(translate="BACKLOG.SUMMARY.CLOSED_POINTS")
div.summary-stats
span.number(ng-bind="stats.speed | number:0") --
- span.description points /
sprint
+ span.description(translate="BACKLOG.SUMMARY.POINTS_PER_SPRINT")
diff --git a/app/partials/includes/components/taskboard-task.jade b/app/partials/includes/components/taskboard-task.jade
index 7460a74f..dd34369e 100644
--- a/app/partials/includes/components/taskboard-task.jade
+++ b/app/partials/includes/components/taskboard-task.jade
@@ -1,11 +1,11 @@
div.taskboard-tagline(tg-colorize-tags="task.tags", tg-colorize-tags-type="taskboard")
div.taskboard-task-inner
div.taskboard-user-avatar(tg-taskboard-user-avatar, users="usersById", task="task", project="project", ng-class="{iocaine: task.is_iocaine}")
- span.icon.icon-iocaine(ng-if="task.is_iocaine", title="Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!")
+ span.icon.icon-iocaine(ng-if="task.is_iocaine", title="{{'COMMON.IOCAINE_TEXT' | translate}}")
p.taskboard-text
- a.task-assigned(href="", title="Assign task")
+ a.task-assigned(href="", title="{{'TASKBOARD.TITLE_ACTION_ASSIGN' | translate}}")
span.task-num(tg-bo-ref="task.ref")
a.task-name(href="", title="#{{ ::task.ref }} {{ ::task.subject }}", ng-bind="task.subject",
tg-nav="project-tasks-detail:project=project.slug,ref=task.ref")
a.icon.icon-edit(tg-check-permission="modify_task",
- href="", title="Edit task")
+ href="", title="{{'TASKBOARD.TITLE_ACTION_EDIT' | translate}}")
diff --git a/app/partials/includes/components/watchers.jade b/app/partials/includes/components/watchers.jade
deleted file mode 100644
index cbc03c5b..00000000
--- a/app/partials/includes/components/watchers.jade
+++ /dev/null
@@ -1,13 +0,0 @@
-//- Father [section.watchers] should be out of the template
-div.watchers-header
- span.title watchers
- a.icon.icon-plus(href="", title="Add watcher")
-div.watchers-content
- - for(var y=0; y<5; y++)
- div.watcher-single
- div.watcher-avatar
- a.avatar(href="", title="Assigned to")
- img(src="http://thecodeplayer.com/u/uifaces/32.jpg", alt="username")
- div.watcher-name
- a(href="", title="Jesús Espino") Jesús
- a.icon.icon-delete(href="", title="delete-watcher")
diff --git a/app/partials/includes/modules/admin-menu.jade b/app/partials/includes/modules/admin-menu.jade
index 0a4cb08e..8bb34529 100644
--- a/app/partials/includes/modules/admin-menu.jade
+++ b/app/partials/includes/modules/admin-menu.jade
@@ -1,30 +1,30 @@
section.admin-menu
header
- h1 Admin
+ h1(translate="ADMIN.MENU.TITLE")
nav
ul
li#adminmenu-project-profile
a(href="", tg-nav="project-admin-project-profile-details:project=project.slug")
- span.title Project
+ span.title(translate="ADMIN.MENU.PROJECT")
span.icon.icon-arrow-right
li#adminmenu-project-values
a(href="", tg-nav="project-admin-project-values-status:project=project.slug")
- span.title Attributes
+ span.title(translate="ADMIN.MENU.ATTRIBUTES")
span.icon.icon-arrow-right
li#adminmenu-memberships
a(href="" tg-nav="project-admin-memberships:project=project.slug")
- span.title Members
+ span.title(translate="ADMIN.MENU.MEMBERS")
span.icon.icon-arrow-right
li#adminmenu-roles
a(href="" tg-nav="project-admin-roles:project=project.slug")
- span.title Permissions
+ span.title(translate="ADMIN.MENU.PERMISSIONS")
span.icon.icon-arrow-right
li#adminmenu-third-parties
a(href="" tg-nav="project-admin-third-parties-webhooks:project=project.slug")
- span.title Integrations
+ span.title(translate="ADMIN.MENU.INTEGRATIONS")
span.icon.icon-arrow-right
li#adminmenu-contrib(ng-show="contribPlugins.length > 0")
a(href="" tg-nav="project-admin-contrib:project=project.slug,plugin=contribPlugins[0].slug")
- span.title Plugins
+ span.title(translate="COMMON.PLUGINS")
span.icon.icon-arrow-right
diff --git a/app/partials/includes/modules/admin-submenu-project-profile.jade b/app/partials/includes/modules/admin-submenu-project-profile.jade
index 30be41da..404b6d52 100644
--- a/app/partials/includes/modules/admin-submenu-project-profile.jade
+++ b/app/partials/includes/modules/admin-submenu-project-profile.jade
@@ -1,26 +1,26 @@
section.admin-submenu
header
- h1 Project Profile
+ h1(translate="ADMIN.SUBMENU_PROJECT_PROFILE.TITLE")
nav
ul
li#adminmenu-details
a(href="", tg-nav="project-admin-project-profile-details:project=project.slug")
- span.title Project Details
+ span.title(translate="ADMIN.PROJECT_PROFILE.PROJECT_DETAILS")
span.icon.icon-arrow-right
li#adminmenu-default-values
a(href="", tg-nav="project-admin-project-profile-default-values:project=project.slug")
- span.title Default Values
+ span.title(translate="ADMIN.PROJECT_DEFAULT_VALUES.TITLE")
span.icon.icon-arrow-right
li#adminmenu-modules
a(href="", tg-nav="project-admin-project-profile-modules:project=project.slug")
- span.title Modules
+ span.title(translate="ADMIN.MODULES.TITLE")
span.icon.icon-arrow-right
li#adminmenu-export
a(href="", tg-nav="project-admin-project-profile-export:project=project.slug")
- span.title Export
+ span.title(translate="ADMIN.PROJECT_EXPORT.TITLE")
span.icon.icon-arrow-right
li#adminmenu-reports
a(href="", tg-nav="project-admin-project-profile-reports:project=project.slug")
- span.title Reports
+ span.title(translate="ADMIN.REPORTS.TITLE")
span.icon.icon-arrow-right
diff --git a/app/partials/includes/modules/admin-submenu-project-values.jade b/app/partials/includes/modules/admin-submenu-project-values.jade
index 57df5300..d81e8e1e 100644
--- a/app/partials/includes/modules/admin-submenu-project-values.jade
+++ b/app/partials/includes/modules/admin-submenu-project-values.jade
@@ -1,35 +1,35 @@
section.admin-submenu
header
- h1 Attributes
+ h1(translate) Attributes
nav
ul
li#adminmenu-values-status
a(href="", tg-nav="project-admin-project-values-status:project=project.slug")
- span.title Status
+ span.title(translate="ADMIN.SUBMENU_PROJECT_VALUES.STATUS")
span.icon.icon-arrow-right
li#adminmenu-values-points
a(href="", tg-nav="project-admin-project-values-points:project=project.slug")
- span.title Points
+ span.title(translate="ADMIN.SUBMENU_PROJECT_VALUES.POINTS")
span.icon.icon-arrow-right
li#adminmenu-values-priorities
a(href="", tg-nav="project-admin-project-values-priorities:project=project.slug")
- span.title Priorities
+ span.title(translate="ADMIN.SUBMENU_PROJECT_VALUES.PRIORITIES")
span.icon.icon-arrow-right
li#adminmenu-values-severities
a(href="", tg-nav="project-admin-project-values-severities:project=project.slug")
- span.title Severities
+ span.title(translate="ADMIN.SUBMENU_PROJECT_VALUES.SEVERITIES")
span.icon.icon-arrow-right
li#adminmenu-values-types
a(href="", tg-nav="project-admin-project-values-types:project=project.slug")
- span.title Types
+ span.title(translate="ADMIN.SUBMENU_PROJECT_VALUES.TYPES")
span.icon.icon-arrow-right
li#adminmenu-values-custom-fields
a(href="", tg-nav="project-admin-project-values-custom-fields:project=project.slug")
- span.title Custom fields
+ span.title(translate="ADMIN.SUBMENU_PROJECT_VALUES.CUSTOM_FIELDS")
span.icon.icon-arrow-right
diff --git a/app/partials/includes/modules/admin-submenu-roles.jade b/app/partials/includes/modules/admin-submenu-roles.jade
index 3b5b12e0..20e9fd80 100644
--- a/app/partials/includes/modules/admin-submenu-roles.jade
+++ b/app/partials/includes/modules/admin-submenu-roles.jade
@@ -1,6 +1,6 @@
section.admin-submenu-roles
header
- h1 Roles
+ h1(translate="ADMIN.SUBMENU_ROLES.TITLE")
nav
ul
@@ -10,6 +10,6 @@ section.admin-submenu-roles
span.icon.icon-arrow-right
div(tg-new-role)
- a.button-gray.add-button(href="", title="Add New Role")
- span.text + New role
+ a.button-gray.add-button(href="", title="{{'ADMIN.SUBMENU.TITLE_ACTION_NEW_ROLE' | translate}}")
+ span.text(translate="ADMIN.SUBMENU.ACTION_NEW_ROLE")
input(type="text", class="hidden new")
diff --git a/app/partials/includes/modules/admin-submenu-third-parties.jade b/app/partials/includes/modules/admin-submenu-third-parties.jade
index 2e30e607..b045c4ee 100644
--- a/app/partials/includes/modules/admin-submenu-third-parties.jade
+++ b/app/partials/includes/modules/admin-submenu-third-parties.jade
@@ -1,6 +1,6 @@
section.admin-submenu
header
- h1 Services
+ h1(translate="ADMIN.SUBMENU_THIDPARTIES.TITLE")
nav
ul
diff --git a/app/partials/includes/modules/admin-submenu.jade b/app/partials/includes/modules/admin-submenu.jade
index ecd19c37..edfe0a88 100644
--- a/app/partials/includes/modules/admin-submenu.jade
+++ b/app/partials/includes/modules/admin-submenu.jade
@@ -1,24 +1,24 @@
section.admin-submenu
header
- h1 Roles
+ h1(translate) Roles
nav
ul
li
- a(href="") UX
+ a(href="", translate="ADMIN.SUBMENU.ROLE_UX")
span.icon.icon-arrow-right
li
- a(href="") Product Owner
+ a(href="", translate="ADMIN.SUBMENU.ROLE_PRODUCT_OWNER")
span.icon.icon-arrow-right
li
- a(href="") Designer
+ a(href="", translate="ADMIN.SUBMENU.ROLE_DESIGNER")
span.icon.icon-arrow-right
li
- a(href="") Back
+ a(href="", translate="ADMIN.SUBMENU.ROLE_BACK")
span.icon.icon-arrow-right
li
- a(href="") Front
+ a(href="", translate="ADMIN.SUBMENU.ROLE_FRONT")
span.icon.icon-arrow-right
- a.button-gray(href="", title="Add New role")
- span.text + New role
+ a.button-gray(href="", title="{{'ADMIN.SUBMENU.TITLE_ACTION_NEW_ROLE' | translate}}")
+ span.text(translate="ADMIN.SUBMENU.ACTION_NEW_ROLE")
diff --git a/app/partials/includes/modules/admin/admin-custom-attributes.jade b/app/partials/includes/modules/admin/admin-custom-attributes.jade
index 09186600..43615cb2 100644
--- a/app/partials/includes/modules/admin/admin-custom-attributes.jade
+++ b/app/partials/includes/modules/admin/admin-custom-attributes.jade
@@ -1,15 +1,15 @@
section.custom-fields-table.basic-table
div.project-values-title
- h2 #{customFieldSectionTitle}
- a.button.button-gray.show-add-new.js-add-custom-field-button(href="", title="#{customFieldButtonTitle}")
- span Add custom field
+ h2 {{ customFieldSectionTitle | translate }}
+ a.button.button-gray.show-add-new.js-add-custom-field-button(href="", title="{{ customFieldButtonTitle | translate }}")
+ span(translate="ADMIN.CUSTOM_ATTRIBUTES.ADD")
div.table-header
div.row
div.custom-name
- span Name
+ span(translate="ADMIN.FIELDS.NAME")
div.custom-description
- span Description
+ span(translate="ADMIN.FIELDS.DESCRIPTION")
div.custom-options
div.table-body
@@ -23,31 +23,31 @@ section.custom-fields-table.basic-table
span {{ attr.description }}
div.custom-options
div.custom-options-wrapper
- a.js-edit-custom-field-button.icon.icon-edit(href="", title="Edit Custom Field")
- a.js-delete-custom-field-button.icon.icon-delete(href="", title="Delete Custom Field")
+ a.js-edit-custom-field-button.icon.icon-edit(href="", title="{{'ADMIN.CUSTOM_ATTRIBUTES.EDIT' | translate}}")
+ a.js-delete-custom-field-button.icon.icon-delete(href="", title="{{'ADMIN.CUSTOM_ATTRIBUTES.DELETE' | translate}}")
div.row.single-custom-field.js-edit-custom-field.hidden
fieldset.custom-name
- input(type="text", name="name", placeholder="Set your custom field name",
+ input(type="text", name="name", placeholder="{{'ADMIN.CUSTOM_ATTRIBUTES.SET_FIELD_NAME' | translate}}",
ng-model="attr.name", data-required="true" data-maxlength="64")
fieldset.custom-description
- input(type="text", name="description", placeholder="Set your custom field description",
+ input(type="text", name="description", placeholder="{{'ADMIN.CUSTOM_ATTRIBUTES.SET_FIELD_DESCRIPTION' | translate}}",
ng-model="attr.description")
fieldset.custom-options
div.custom-options-wrapper
- a.js-update-custom-field-button.icon.icon-floppy(href="", title="Update Custom Field")
- a.js-cancel-edit-custom-field-button.icon.icon-delete(href="", title="Cancel edition")
+ a.js-update-custom-field-button.icon.icon-floppy(href="", title="{{'ADMIN.CUSTOM_ATTRIBUTES.ACTION_UPDATE' | translate}}")
+ a.js-cancel-edit-custom-field-button.icon.icon-delete(href="", title="{{'ADMIN.CUSTOM_ATTRIBUTES.ACTION_CANCEL_EDITION' | translate}}")
form.row.single-custom-field.js-new-custom-field.hidden
fieldset.custom-name
- input(type="text", name="name", placeholder="Set your custom field name",
+ input(type="text", name="name", placeholder="{{'ADMIN.CUSTOM_ATTRIBUTES.SET_FIELD_NAME' | translate}}",
ng-model="newAttr.name", data-required="true", data-maxlength="64")
fieldset.custom-description
- input(type="text", name="description", placeholder="Set your custom field description",
+ input(type="text", name="description", placeholder="{{'ADMIN.CUSTOM_ATTRIBUTES.SET_FIELD_DESCRIPTION' | translate}}",
ng-model="newAttr.description")
fieldset.custom-options
div.custom-options-wrapper
- a.js-create-custom-field-button.icon.icon-floppy(href="", title="Save Custom Field")
- a.js-cancel-new-custom-field-button.icon.icon-delete(href="", title="Cancel creation")
+ a.js-create-custom-field-button.icon.icon-floppy(href="", title="{{'ADMIN.CUSTOM_ATTRIBUTES.SAVE_TITLE' | translate}}")
+ a.js-cancel-new-custom-field-button.icon.icon-delete(href="", title="{{'ADMIN.CUSTOM_ATTRIBUTES.CANCEL_TITLE' | translate}}")
diff --git a/app/partials/includes/modules/admin/admin-membership-table.jade b/app/partials/includes/modules/admin/admin-membership-table.jade
index 490c5cf0..8ddb19f5 100644
--- a/app/partials/includes/modules/admin/admin-membership-table.jade
+++ b/app/partials/includes/modules/admin/admin-membership-table.jade
@@ -1,9 +1,9 @@
section.admin-membership-table.basic-table
div.row.title
- div.header-member Member
- div.header-admin Admin
- div.header-role Role
- div.header-status Status
+ div.header-member(translate="ADMIN.MEMBERSHIP.COLUMN_MEMBER")
+ div.header-admin(translate="ADMIN.MEMBERSHIP.COLUMN_ADMIN")
+ div.header-role(translate="ADMIN.MEMBERSHIP.COLUMN_ROLE")
+ div.header-status(translate="ADMIN.MEMBERSHIP.COLUMN_STATUS")
div.row(ng-repeat="member in memberships")
div.row-member(tg-memberships-row-avatar="member")
diff --git a/app/partials/includes/modules/admin/admin-submenu-contrib.jade b/app/partials/includes/modules/admin/admin-submenu-contrib.jade
index c4e429e4..d3ee28ec 100644
--- a/app/partials/includes/modules/admin/admin-submenu-contrib.jade
+++ b/app/partials/includes/modules/admin/admin-submenu-contrib.jade
@@ -1,6 +1,6 @@
section.admin-submenu
header
- h1 Plugins
+ h1(translate="COMMON.PLUGINS")
nav
ul
diff --git a/app/partials/includes/modules/admin/default-values.jade b/app/partials/includes/modules/admin/default-values.jade
index 6cff329a..a8ab9e6e 100644
--- a/app/partials/includes/modules/admin/default-values.jade
+++ b/app/partials/includes/modules/admin/default-values.jade
@@ -1,40 +1,40 @@
section.default-values
form
fieldset
- label(for="default-points") Default value for points selector
+ label(for="default-points", translate="ADMIN.DEFAULT_VALUES.LABEL_POINTS")
select(id="default-points", ng-model="project.default_points",
ng-options="s.id as s.name for s in pointsList")
fieldset
- label(for="default-value-us") Default value for US status selector
+ label(for="default-value-us", translate="ADMIN.DEFAULT_VALUES.LABEL_US")
select(id="default-value-us", ng-model="project.default_us_status",
ng-options="s.id as s.name for s in usStatusList")
fieldset
- label(for="default-value-task") Default value for task status selector
+ label(for="default-value-task", translate="ADMIN.DEFAULT_VALUES.LABEL_TASK_STATUS")
select(id="default-value-task", ng-model="project.default_task_status",
ng-options="s.id as s.name for s in taskStatusList")
fieldset
- label(for="default-value-priority") Default value for priority selector
+ label(for="default-value-priority", translate="ADMIN.DEFAULT_VALUES.LABEL_PRIORITY")
select(id="default-value-priority", ng-model="project.default_priority",
ng-options="s.id as s.name for s in prioritiesList")
fieldset
- label(for="default-value-severity") Default value for severity selector
+ label(for="default-value-severity", translate="ADMIN.DEFAULT_VALUES.LABEL_SEVERITY")
select(id="default-value-severity", ng-model="project.default_severity",
ng-options="s.id as s.name for s in severitiesList")
fieldset
- label(for="default-value-issue-type") Default value for issue type selector
+ label(for="default-value-issue-type", translate="ADMIN.DEFAULT_VALUES.LABEL_ISSUE_TYPE")
select(id="default-value-issue-type", ng-model="project.default_issue_type",
ng-options="s.id as s.name for s in issueTypesList")
fieldset
- label(for="default-value-issue-status") Default value for issue status selector
+ label(for="default-value-issue-status", translate="ADMIN.DEFAULT_VALUES.LABEL_ISSUE_STATUS")
select(id="default-value-issue-status", ng-model="project.default_issue_status",
ng-options="s.id as s.name for s in issueStatusList")
fieldset
- button.button-green.submit-button(type="submit", title="Save")
- span Save
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}")
+ span(translate="COMMON.SAVE")
diff --git a/app/partials/includes/modules/admin/project-csv.jade b/app/partials/includes/modules/admin/project-csv.jade
index 07254021..d3a1f632 100644
--- a/app/partials/includes/modules/admin/project-csv.jade
+++ b/app/partials/includes/modules/admin/project-csv.jade
@@ -1,16 +1,17 @@
-section.project-csv(ng-controller='#{controller} as ctrl', tg-select-input-text)
+section.project-csv(tg-select-input-text)
div.project-values-title
- h2 #{csvType} reports
- a.button.button-gray(title="Download #{csvType} CSV", ng-href="{{csvUrl}}", ng-show="csvUrl", target="_blank")
- span Download CSV
+ h2 {{csvType}} sdfdsf
+ h2(translate="ADMIN.CSV.TITLE")
+ a.button.button-gray(title="{{'ADMIN.CSV.DOWNLOAD' | translate}}", ng-href="{{csvUrl}}", ng-show="csvUrl", target="_blank")
+ span(translate="ADMIN.CSV.DOWNLOAD")
div.csv-regenerate-field
.field-with-options
- input(type="text", placeholder="Please regenerate CSV url", readonly, ng-model="csvUrl")
+ input(type="text", placeholder="{{'ADMIN.CSV.URL_FIELD_PLACEHOLDER' | translate}}", readonly, ng-model="csvUrl")
.option-wrapper.select-input-content
.icon.icon-copy
- a(href="", title="Regenerate CSV url", ng-click="ctrl.regenerateUuid()")
+ a(href="", title="{{'ADMIN.CSV.TITLE_REGENERATE_URL' | translate}}", ng-click="ctrl.regenerateUuid()")
span.icon.icon-plus(ng-hide="csvUrl")
- span(ng-hide="csvUrl") Generate URL
+ span(ng-hide="csvUrl", translate="ADMIN.CSV.ACTION_GENERATE_URL")
span.icon.icon-reload(ng-Show="csvUrl")
- span(ng-Show="csvUrl") Regenerate
+ span(ng-Show="csvUrl", translate="ADMIN.CSV.ACTION_REGENERATE")
diff --git a/app/partials/includes/modules/admin/project-points.jade b/app/partials/includes/modules/admin/project-points.jade
index 70ecb29c..ce42b043 100644
--- a/app/partials/includes/modules/admin/project-points.jade
+++ b/app/partials/includes/modules/admin/project-points.jade
@@ -1,16 +1,16 @@
section.project-values-table
div.project-values-title
- h2(ng-bind="sectionName")
- a.button.button-gray.show-add-new(href="", title="Add New")
- span Add new point
+ h2 {{sectionName | translate}}
+ a.button.button-gray.show-add-new(href="", title="{{'ADMIN.PROJECT_VALUES_POINTS.ACTION_ADD' | translate}}")
+ span(translate="ADMIN.PROJECT_VALUES_POINTS.ACTION_ADD")
div.project-values-header
div.project-values-row
div.project-values-name
- span Name
+ span(translate="COMMON.FIELDS.NAME")
div.project-values-value
- span Value
+ span(translate="COMMON.FIELDS.VALUE")
div.project-values-settings
div.project-values-body
@@ -26,32 +26,32 @@ section.project-values-table
span {{ value.value }}
div.project-values-settings
- a.edit-value.icon.icon-edit(href="", title="Edit value")
- a.delete-value.icon.icon-delete(href="", title="Delete value")
+ a.edit-value.icon.icon-edit(href="", title="{{'ADMIN.POINTS.TITLE_ACTION_EDIT_VALUE' | translate}}")
+ a.delete-value.icon.icon-delete(href="", title="{{'ADMIN.POINTS.TITLE_ACTION_DELETE_VALUE' | translate}}")
div.project-values-row.row.table-main.edition.hidden
div.project-values-name
- input(name="name", type="text", placeholder="Name", ng-model="value.name",
+ input(name="name", type="text", placeholder="{{'COMMON.FIELDS.NAME' | translate}}", ng-model="value.name",
data-required="true")
div.project-values-value
- input(name="value", type="text", placeholder="Value", ng-model="value.value",
+ input(name="value", type="text", placeholder="{{'COMMON.FIELDS.VALUE' | translate}}", ng-model="value.value",
data-type="number")
div.project-values-settings
- a.save.icon.icon-floppy(href="", title="Save changes")
- a.cancel.icon.icon-delete(href="", title="Cancel")
+ a.save.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
+ a.cancel.icon.icon-delete(href="", title="{{'COMON.CANCEL' | translate}}")
form
div.project-values-row.new-value.hidden
div.project-values-name
- input(name="name", type="text", placeholder="Name", ng-model="newValue.name",
+ input(name="name", type="text", placeholder="{{'COMMON.FIELDS.NAME' | translate}}", ng-model="newValue.name",
data-required="true")
div.project-values-value
- input("name=value", type="text", placeholder="Value", ng-model="newValue.value",
+ input("name=value", type="text", placeholder="{{'COMMON.FIELDS.VALUE' | translate}}", ng-model="newValue.value",
data-type="number")
div.project-values-settings
- a.add-new.icon.icon-floppy(href="", title="Add")
- a.delete-new.icon.icon-delete(href="", title="Cancel")
+ a.add-new.icon.icon-floppy(href="", title="{{'COMMON.ADD' | translate}}")
+ a.delete-new.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
diff --git a/app/partials/includes/modules/admin/project-status.jade b/app/partials/includes/modules/admin/project-status.jade
index 4e90d97d..c7824865 100644
--- a/app/partials/includes/modules/admin/project-status.jade
+++ b/app/partials/includes/modules/admin/project-status.jade
@@ -1,15 +1,15 @@
section.colors-table.admin-status-table
div.project-values-title
- h2(ng-bind="sectionName")
- a.button.button-gray.show-add-new(href="", title="Add New")
- span Add new status
+ h2 {{ sectionName | translate }}
+ a.button.button-gray.show-add-new(href="", title="{{'ADMIN.US_STATUS.ACTION_ADD_STATUS' | translate}}")
+ span(translate="ADMIN.US_STATUS.ACTION_ADD_STATUS")
div.table-header
div.row
- div.color-column Color
- div.status-name Name
- div.status-slug Slug
- div.is-closed-column Is closed?
+ div.color-column(translate="COMMON.FIELDS.COLOR")
+ div.status-name(translate="COMMON.FIELDS.NAME")
+ div.status-slug(translate="COMMON.FIELDS.SLUG")
+ div.is-closed-column(translate="COMMON.FIELDS.IS_CLOSED")
div.options-column
div.table-main
@@ -30,8 +30,8 @@ section.colors-table.admin-status-table
div.icon.icon-check-square(ng-show="value.is_closed")
div.options-column
- a.edit-value.icon.icon-edit(href="", title="Edit value")
- a.delete-value.icon.icon-delete(href="", title="Delete value")
+ a.edit-value.icon.icon-edit(href="", title="{{'ADMIN.COMMON.TITLE_ACTION_EDIT_VALUE' | translate}}")
+ a.delete-value.icon.icon-delete(href="", title="{{'ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE' | translate}}")
div.row.table-main.edition.hidden
div.color-column(tg-color-selection, ng-model="value")
@@ -39,16 +39,16 @@ section.colors-table.admin-status-table
include ../../components/select-color
div.status-name
- input(name="name", type="text", placeholder="Write a name for the new status",
+ input(name="name", type="text", placeholder="{{'ADMIN.STATUS.PLACEHOLDER_WRITE_STATUS_NAME' | translate}}",
ng-model="value.name", data-required="true", data-maxlength="255")
div.is-closed-column
select(name="is_closed", ng-model="value.is_closed", data-required="true",
- ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]")
+ ng-options="e.id as e.name | translate for e in [{'id':true, 'name':'COMMON.YES'},{'id':false, 'name': 'COMMON.NO'}]")
div.options-column
- a.save.icon.icon-floppy(href="", title="Save changes")
- a.cancel.icon.icon-delete(href="", title="Cancel")
+ a.save.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
+ a.cancel.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
form
div.row.table-main.new-value.hidden
@@ -57,13 +57,13 @@ section.colors-table.admin-status-table
include ../../components/select-color
div.status-name
- input(name="name", type="text", placeholder="Write a name for the new status",
+ input(name="name", type="text", placeholder="{{'ADMIN.STATUS.PLACEHOLDER_WRITE_STATUS_NAME' | translate}}",
ng-model="newValue.name", data-required="true", data-maxlength="255")
div.is-closed-column
select(name="is_closed", ng-model="newValue.is_closed", data-required="true",
- ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]")
+ ng-options="e.id as e.name | translate for e in [{'id':true, 'name': 'COMMON.YES'},{'id':false, 'name': 'COMMON.NO'}]")
div.options-column
- a.add-new.icon.icon-floppy(href="", title="Add")
- a.delete-new.icon.icon-delete(href="", title="Cancel")
+ a.add-new.icon.icon-floppy(href="", title="{{'COMMON.ADD' | translate}}")
+ a.delete-new.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
diff --git a/app/partials/includes/modules/admin/project-types.jade b/app/partials/includes/modules/admin/project-types.jade
index 6d02b520..ff7a083b 100644
--- a/app/partials/includes/modules/admin/project-types.jade
+++ b/app/partials/includes/modules/admin/project-types.jade
@@ -1,14 +1,14 @@
section.colors-table
div.project-values-title
- h2 {{ sectionName }}
- a.button.button-gray.show-add-new(href="", title="Add New")
- span Add new {{ objName }}
+ h2 {{ sectionName | translate }}
+ a.button.button-gray.show-add-new(href="")
+ span(translate="ADMIN.PROJECT_VALUES_TYPES.ACTION_ADD", translate-values="{ objName: objName }")
div.table-header
div.row
- div.color-column Color
- div.status-name Name
+ div.color-column(translate="COMMON.FIELDS.COLOR")
+ div.status-name(translate="COMMON.FIELDS.NAME")
div.options-column
div.table-main
@@ -24,8 +24,8 @@ section.colors-table
span {{ value.name }}
div.options-column
- a.edit-value.icon.icon-edit(href="", title="Edit value")
- a.delete-value.icon.icon-delete(href="", title="Delete value")
+ a.edit-value.icon.icon-edit(href="", title="{{'ADMIN.COMMON.TITLE_ACTION_EDIT_VALUE' | translate}}")
+ a.delete-value.icon.icon-delete(href="", title="{{'ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE' | translate}}")
div.row.table-main.edition.hidden
div.color-column(tg-color-selection, ng-model="value")
@@ -33,12 +33,12 @@ section.colors-table
include ../../components/select-color
div.status-name
- input(name="name", type="text", placeholder="Write a name for the new element",
+ input(name="name", type="text", placeholder="{{'ADMIN.TYPES.PLACEHOLDER_WRITE_NAME' | translate}}",
ng-model="value.name", data-required="true", data-maxlength="255")
div.options-column
- a.save.icon.icon-floppy(href="", title="Save changes")
- a.cancel.icon.icon-delete(href="", title="Cancel")
+ a.save.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
+ a.cancel.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
form
div.row.table-main.new-value.hidden
@@ -47,9 +47,9 @@ section.colors-table
include ../../components/select-color
div.status-name
- input(name="name", type="text", placeholder="Write a name for the new element",
+ input(name="name", type="text", placeholder="{{'ADMIN.TYPES.PLACEHOLDER_WRITE_NAME' | translate}}",
ng-model="newValue.name", data-required="true", data-maxlength="255")
div.options-column
- a.add-new.icon.icon-floppy(href="", title="Add")
- a.delete-new.icon.icon-delete(href="", title="Cancel")
+ a.add-new.icon.icon-floppy(href="", title="{{'COMMON.ADD' | translate}}")
+ a.delete-new.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
diff --git a/app/partials/includes/modules/admin/project-us-status.jade b/app/partials/includes/modules/admin/project-us-status.jade
index f9f2a8ba..7d7273cd 100644
--- a/app/partials/includes/modules/admin/project-us-status.jade
+++ b/app/partials/includes/modules/admin/project-us-status.jade
@@ -1,19 +1,19 @@
section.project-us-status
div.project-values-title
- h2(ng-bind="sectionName")
- a.button.button-gray.show-add-new(href="", title="Add New")
- span Add new status
+ h2 {{ sectionName | translate }}
+ a.button.button-gray.show-add-new(href="", title="{{'ADMIN.US_STATUS.ACTION_ADD_STATUS' | translate}}")
+ span(translate="ADMIN.US_STATUS.ACTION_ADD_STATUS")
div.colors-table
div.table-header
div.row
- div.color-column Color
- div.status-name Name
- div.status-slug Slug
- div.is-closed-column Is closed?
- div.is-archived-column Is archived?
- div.status-wip-limit WIP Limit
+ div.color-column(translate="COMMON.FIELDS.COLOR")
+ div.status-name(translate="COMMON.FIELDS.NAME")
+ div.status-slug(translate="COMMON.FIELDS.SLUG")
+ div.is-closed-column(translate="COMMON.FIELDS.IS_CLOSED")
+ div.is-archived-column(translate="ADMIN.US_STATUS.IS_ARCHIVED_COLUMN")
+ div.status-wip-limit(translate="ADMIN.US_STATUS.WIP_LIMIT_COLUMN")
div.options-column
div.table-main
@@ -41,33 +41,34 @@ section.project-us-status
span {{ value.wip_limit }}
div.options-column
- a.edit-value.icon.icon-edit(href="", title="Edit value")
- a.delete-value.icon.icon-delete(href="", title="Delete value")
+ a.edit-value.icon.icon-edit(href="", title="{{'ADMIN.COMMON.TITLE_ACTION_EDIT_VALUE' | translate}}")
+ a.delete-value.icon.icon-delete(href="", title="{{'ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE' | translate}}")
div.row.table-main.edition.hidden
div.color-column(tg-color-selection, ng-model="value")
div.current-color(style="background: {{ value.color }}")
include ../../components/select-color
+
div.status-name
- input(name="name", type="text", placeholder="Write a name for the new status",
+ input(name="name", type="text", placeholder="{{'ADMIN.US_STATUS.PLACEHOLDER_WRITE_NAME' | translate}}",
ng-model="value.name", data-required="true", data-maxlength="255")
div.is-closed-column
select(name="is_closed", ng-model="value.is_closed", data-required="true",
- ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]")
+ ng-options="e.id as e.name | translate for e in [{'id':true, 'name':'COMMON.YES'},{'id':false, 'name': 'COMMON.NO'}]")
div.is-archived-column
select(name="is_archived", ng-model="value.is_archived", data-required="true",
- ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]")
+ ng-options="e.id as e.name | translate for e in [{'id':true, 'name':'COMMON.YES'},{'id':false, 'name': 'COMMON.NO'}]")
div.status-wip-limit
- input(name="wip_limit", type="number", placeholder="WIP Limit",
+ input(name="wip_limit", type="number", placeholder="{{'ADMIN.US_STATUS.WIP_LIMIT_COLUMN' | translate}}",
ng-model="value.wip_limit", data-type="digits")
div.options-column
- a.save.icon.icon-floppy(href="", title="Save changes")
- a.cancel.icon.icon-delete(href="", title="Cancel")
+ a.save.icon.icon-floppy(href="", title="{{'COMMON.SAVE' | translate}}")
+ a.cancel.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
form
div.row.table-main.new-value.hidden
@@ -76,21 +77,21 @@ section.project-us-status
include ../../components/select-color
div.status-name
- input(name="name", type="text", placeholder="Write a name for the new status",
+ input(name="name", type="text", placeholder="{{'ADMIN.US_STATUS.PLACEHOLDER_WRITE_NAME' | translate}}",
ng-model="newValue.name", data-required="true", data-maxlength="255")
div.is-closed-column
select(name="is_closed", ng-model="newValue.is_closed", data-required="true",
- ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]")
+ ng-options="e.id as e.name | translate for e in [{'id':true, 'name':'COMMON.YES'},{'id':false, 'name': 'COMMON.NO'}]")
div.is-archived-column
select(name="is_archived", ng-model="newValue.is_archived", data-required="true",
- ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]")
+ ng-options="e.id as e.name | translate for e in [{'id':true, 'name':'COMMON.YES'},{'id':false, 'name': 'COMMON.NO'}]")
div.status-wip-limit
- input(name="wip_limit", type="number", placeholder="WIP Limit",
+ input(name="wip_limit", type="number", placeholder="{{'ADMIN.US_STATUS.WIP_LIMIT_COLUMN' | translate}}",
ng-model="newValue.wip_limit", data-type="digits")
div.options-column
- a.add-new.icon.icon-floppy(href="", title="Add")
- a.delete-new.icon.icon-delete(href="", title="Cancel")
+ a.add-new.icon.icon-floppy(href="", title="{{'COMMON.ADD' | translate}}")
+ a.delete-new.icon.icon-delete(href="", title="{{'COMMON.CANCEL' | translate}}")
diff --git a/app/partials/includes/modules/backlog-filters.jade b/app/partials/includes/modules/backlog-filters.jade
index 4008631b..5533851d 100644
--- a/app/partials/includes/modules/backlog-filters.jade
+++ b/app/partials/includes/modules/backlog-filters.jade
@@ -1,29 +1,29 @@
section.filters
div.filters-inner
h1
- span.title filters
+ span.title(translate="COMMON.FILTERS.TITLE")
form
fieldset
- input(type="text", placeholder="Subject or reference", ng-model="filtersQ")
- a.icon.icon-search(href="", title="search")
+ input(type="text", placeholder="{{'COMMON.FILTERS.INPUT_PLACEHOLDER' | translate}}", ng-model="filtersQ")
+ a.icon.icon-search(href="", title="{{'COMMON.FILTERS.TITLE_ACTION_FILTER_BUTTON' | translate}}")
div.filters-step-cat
div.filters-applied
h2.hidden.breadcrumb
- a.back(href="", title="back to categories") Filters
+ a.back(href="", title="{{'COMMON.FILTERS.BREADCRUMB_TITLE' | translate}}", translate="BACKLOG.FILTERS.TITLE")
span.icon-arrow-right
- a.subfilter(href="", title="cat-name")
- span.title status
+ a.subfilter(href="")
+ span.title(translate="COMMON.FILTERS.BREADCRUMB_STATUS")
div.filters-cats
ul
li
- a(href="", title="Status", data-type="statuses")
- span.title Status
+ a(href="", title="{{'BACKLOG.FILTERS.FILTER_CATEGORY_STATUS' | translate}}", data-type="statuses")
+ span.title(translate="BACKLOG.FILTERS.FILTER_CATEGORY_STATUS")
span.icon.icon-arrow-right
li
- a(href="", title="Tags", data-type="tags")
- span.title Tags
+ a(href="", title="{{'BACKLOG.FILTERS.FILTER_CATEGORY_TAGS' | translate}}", data-type="tags")
+ span.title(translate="BACKLOG.FILTERS.FILTER_CATEGORY_TAGS")
span.icon.icon-arrow-right
div.filter-list.hidden
diff --git a/app/partials/includes/modules/backlog-table.jade b/app/partials/includes/modules/backlog-table.jade
index 95375e3c..ce2c5439 100644
--- a/app/partials/includes/modules/backlog-table.jade
+++ b/app/partials/includes/modules/backlog-table.jade
@@ -1,9 +1,9 @@
div.backlog-table-header
div.row.backlog-table-title
- div.user-stories User Stories
- div.status Status
- div.points(tg-us-role-points-selector, title="Select view per Role")
- span.header-points Points
+ div.user-stories(translate="BACKLOG.TABLE.COLUMN_US")
+ div.status(translate="COMMON.FIELDS.STATUS")
+ div.points(tg-us-role-points-selector, title="{{'BACKLOG.TABLE.TITLE_COLUMN_POINTS' | translate}}")
+ span.header-points(translate="COMMON.FIELDS.POINTS")
span.icon.icon-arrow-bottom
div.backlog-table-body(tg-backlog-sortable, ng-class="{'show-tags': ctrl.showTags, 'active-filters': ctrl.activeFilters}" )
diff --git a/app/partials/includes/modules/cancel-account-form.jade b/app/partials/includes/modules/cancel-account-form.jade
index 979dc25a..cfd79196 100644
--- a/app/partials/includes/modules/cancel-account-form.jade
+++ b/app/partials/includes/modules/cancel-account-form.jade
@@ -1,11 +1,12 @@
-div.change-email-form-container(tg-cancel-account)
- p.change-password-text
- strong Cancel your account
- span We're sorry you are leaving the taiga, we hope you enjoyed your stay :)
+div.cancel-account(tg-cancel-account)
+ p
+ strong(translate="CANCEL_ACCOUNT.TITLE")
+ p
+ span(translate="CANCEL_ACCOUNT.SUBTITLE")
form
fieldset
input(type="hidden", name="cancel_token", ng-model="data.cancel_token", data-required="true",
- placeholder="cancel account token")
+ placeholder="{{'CANCEL_ACCOUNT.PLACEHOLDER_INPUT_TOKEN' | translate}}")
- button.button-cancel-account.button-gray(type="submit", title="Yes, I'm leaving!") Yes, I'm leaving!
+ button.button-cancel-account.button-gray(type="submit", title="{{'CANCEL_ACCOUNT.ACTION_LEAVING' | translate}}", translate="CANCEL_ACCOUNT.ACTION_LEAVING")
diff --git a/app/partials/includes/modules/category-config.jade b/app/partials/includes/modules/category-config.jade
deleted file mode 100644
index 24a8fe44..00000000
--- a/app/partials/includes/modules/category-config.jade
+++ /dev/null
@@ -1,75 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Included in the admin-roles.jade and in the RolePermissionsDirective //
-// in the modules/admin/roles.coffee file. //
-/////////////////////////////////////////////////////////////////////////////
-div.general-category
- | Can do estimations?
- div.check
- input(type="checkbox", checked)
- div
-div.category-config-list
- div.category-config
- div.resume
- div.resume-title Attachments
- div.count 2/7
- div.summary-role
- div.role-summary-single.active
- div.role-summary-single.inactive
- div.role-summary-single.inactive
- div.role-summary-single.active
- div.role-summary-single.inactive
- div.role-summary-single.inactive
- div.icon.icon-arrow-bottom
-
- div.category-config
- div.resume
- div.resume-title User stories
- div.count 2/7
- div.summary-role
- div.role-summary-single.active
- div.role-summary-single.inactive
- div.icon.icon-arrow-bottom
-
- div.category-config
- div.resume
- div.resume-title Issues
- div.count 2/7
- div.summary-role
- div.role-summary-single.active
- div.role-summary-single.inactive
- div.icon.icon-arrow-up
- div.category-items
- div.category-item
- | Can modify owned user stories
- div.check
- input(type="checkbox")
- div
- div.category-item
- | Can delete user story status
- div.check
- input(type="checkbox", checked)
- div
- div.category-item
- | Can delete user story status
- div.check.enabled
- input(type="checkbox")
- div
- div.category-item
- | Can delete user story statsu
- div.check
- input(type="checkbox", checked)
- div
- div.category-item
- | Can delete user story status
- div.check
- input(type="checkbox")
- div
-
- div.category-config
- div.resume
- div.resume-title User stories
- div.count 2/7
- div.summary-role
- div.role-summary-single.active
- div.role-summary-single.inactive
- div.icon.icon-arrow-bottom
diff --git a/app/partials/includes/modules/change-email-form.jade b/app/partials/includes/modules/change-email-form.jade
index bd980f8b..74d15ad6 100644
--- a/app/partials/includes/modules/change-email-form.jade
+++ b/app/partials/includes/modules/change-email-form.jade
@@ -1,12 +1,13 @@
-div.change-email-form-container(tg-change-email)
- p.change-password-text
- strong Change your email
- span One click more and your email will be updated!
+div.change-email-form(tg-change-email)
+ p
+ strong(translate="CHANGE_EMAIL_FORM.TITLE")
+ p
+ span(translate="CHANGE_EMAIL_FORM.SUBTITLE")
form
fieldset
input(type="hidden", name="email_token", ng-model="data.email_token", data-required="true",
- placeholder="change email token")
+ placeholder="{{'CHANGE_EMAIL_FORM.PLACEHOLDER_INPUT_TOKEN' | translate}}")
- a.button-change-email.button-gray(href="", title="Change email") Change email
+ a.button-change-email.button-gray(href="", title="{{'CHANGE_EMAIL_FORM.ACTION_CHANGE_EMAIL' | translate}}", translate="CHANGE_EMAIL_FORM.ACTION_CHANGE_EMAIL")
button(type="submit", class="hidden")
diff --git a/app/partials/includes/modules/change-password-from-recovery-form.jade b/app/partials/includes/modules/change-password-from-recovery-form.jade
index 22f527df..3c64b179 100644
--- a/app/partials/includes/modules/change-password-from-recovery-form.jade
+++ b/app/partials/includes/modules/change-password-from-recovery-form.jade
@@ -1,19 +1,20 @@
div.change-password-form-container(tg-change-password-from-recovery)
p.change-password-text
- strong Create a new Taiga pass
- span And hey, you may want to eat some more iron-rich food, it's good for your brain :P
+ strong(translate="CHANGE_PASSWORD_RECOVERY_FORM.TITLE")
+ br
+ span(translate="CHANGE_PASSWORD_RECOVERY_FORM.SUBTITLE")
form
fieldset.token-change-password(ng-hide="tokenInParams")
input(type="text", name="token", ng-model="data.token", data-required="true",
- placeholder="Recover password token")
+ placeholder="{{'CHANGE_PASSWORD_RECOVERY_FORM.PLACEHOLDER_RECOVER_PASSWORD_TOKEN' | translate}}")
a.get-token(href="", tg-nav="forgot-password",
- title="Did you need a token to recover your password because you forgot it?") Need one?
+ title="{{'CHANGE_PASSWORD_RECOVERY_FORM.TITLE_LINK_NEED_TOKEN' | translate}}", translate="CHANGE_PASSWORD_RECOVERY_FORM.LINK_NEED_TOKEN")
fieldset
input(type="password", name="password", id="password", ng-model="data.password",
- data-required="true", placeholder="New password")
+ data-required="true", placeholder="{{'CHANGE_PASSWORD_RECOVERY_FORM.PLACEHOLDER_NEW_PASSWORD' | translate}}")
fieldset
input(type="password", name="password2", id="password2", ng-model="data.password2",
- data-required="true", data-equalto="#password", placeholder="Re-type new password")
+ data-required="true", data-equalto="#password", placeholder="{{'CHANGE_PASSWORD_RECOVERY_FORM.PLACEHOLDER_RE_TYPE_NEW_PASSWORD' | translate}}")
fieldset
- button.button-change-password.button-gray.submit-button(type="submit", title="Reset Password") Reset Password
+ button.button-change-password.button-gray.submit-button(type="submit", title="{{'CHANGE_PASSWORD_RECOVERY_FORM.ACTION_RESET_PASSWORD' | translate}}", translate="CHANGE_PASSWORD_RECOVERY_FORM.ACTION_RESET_PASSWORD")
diff --git a/app/partials/includes/modules/colors-table.jade b/app/partials/includes/modules/colors-table.jade
index 6eb9c4fc..b989422c 100644
--- a/app/partials/includes/modules/colors-table.jade
+++ b/app/partials/includes/modules/colors-table.jade
@@ -1,9 +1,9 @@
section.colors-table
div.table-header
div.row
- div.color-column Color
- div.status-name Name
- div.is-closed-column Is closed?
+ div.color-column(translate="COMMON.FIELDS.COLOR")
+ div.status-name(translate="COMMON.FIELDS.NAME")
+ div.is-closed-column(translate="COMMON.IS_CLOSED")
div.options-column
div.table-main
@@ -19,16 +19,3 @@ section.colors-table
div.options-column
a.icon.icon-floppy(href="#")
a.icon.icon-delete(href="#")
-
- - for (var x = 0; x < 50; x++)
- div.row.table-main
- div.color-column
- div.current-color
- include ../components/select-color
-
- div.status-name Ready for test
- div.is-closed-column
- div.icon.icon-check-square
- div.options-column
- a.icon.icon-edit(href="#")
- a.icon.icon-delete(href="#")
diff --git a/app/partials/includes/modules/comment-activity.jade b/app/partials/includes/modules/comment-activity.jade
index 352c1669..86eb047d 100644
--- a/app/partials/includes/modules/comment-activity.jade
+++ b/app/partials/includes/modules/comment-activity.jade
@@ -1,5 +1,5 @@
div.us-activity
- a.activity-title(ng-show="ctrl.countChanges(comment)", href="", title="Show activity")
+ a.activity-title(ng-show="ctrl.countChanges(comment)", href="", title="{{'ACTIVITY.SHOW_ACTIVITY' | translate}}")
span(tg-bo-bind="ctrl.buildChangesText(comment)")
span.icon.icon-arrow-up
@@ -8,8 +8,10 @@ div.us-activity
span(tg-bo-bind="key")
div.activity-fromto
p
- strong from
+ strong(translate="COMMON.FROM")
+ br
span(tg-bo-bind="ctrl.getChangeText(change[0])")
p
- strong to
+ strong(translate="COMMON.TO")
+ br
span(tg-bo-bind="ctrl.getChangeText(change[1])")
diff --git a/app/partials/includes/modules/filter-tags.jade b/app/partials/includes/modules/filter-tags.jade
deleted file mode 100644
index 8f4ac66f..00000000
--- a/app/partials/includes/modules/filter-tags.jade
+++ /dev/null
@@ -1,12 +0,0 @@
-section.filter-tags
- div.filter-tag.active(style="background-color: red")
- div.tag-name Tagname
- div.tag-count 4
-
- div.filter-tag(style="background-color: blue")
- div.tag-name Tagname
- div.tag-count 4
-
- div.filter-tag(style="background-color: green")
- div.tag-name Tagname
- div.tag-count 4
\ No newline at end of file
diff --git a/app/partials/includes/modules/filters.jade b/app/partials/includes/modules/filters.jade
deleted file mode 100644
index 7f3bcde2..00000000
--- a/app/partials/includes/modules/filters.jade
+++ /dev/null
@@ -1,41 +0,0 @@
-// This template is now not used. It is replaced with
-// issues-filters.jade and filters-backlog.jade.
-
-section.filters
- div.filters-inner
- h1
- span.title filters
-
- form
- fieldset
- input(type="text", placeholder="Subject or reference", ng-model="filtersQ")
- a.icon.icon-search(href="", title="search")
- h2
- a.hidden(href="", title="cat-name")
- span.title status
- div.filters-step-cat
- div.filters-applied
- div.filters-cats
- ul
- li
- a(href="", title="Status", data-type="statuses")
- span.title Status
- span.icon.icon-arrow-right
- li
- a(href="", title="Severity", data-type="severities")
- span.title Severity
- span.icon.icon-arrow-right
- li
- a(href="", title="Priorities", data-type="priorities")
- span.title Priorities
- span.icon.icon-arrow-right
- li
- a(href="", title="Tags", data-type="tags")
- span.title Tags
- span.icon.icon-arrow-right
- li
- a(href="", title="Assigned to", data-type="assignedTo")
- span.title Assigned to
- span.icon.icon-arrow-right
-
- div.filter-list.hidden
diff --git a/app/partials/includes/modules/forgot-form.jade b/app/partials/includes/modules/forgot-form.jade
index fe7b595f..ce276287 100644
--- a/app/partials/includes/modules/forgot-form.jade
+++ b/app/partials/includes/modules/forgot-form.jade
@@ -1,15 +1,14 @@
div.forgot-form-container(tg-forgot-password)
p.forgot-text
- strong
- | Oops, did you forget your password?
+ strong(translate="FORGOT_PASSWORD_FORM.TITLE")
br
- | Enter your username or email to get a new one
+ strong(translate="FORGOT_PASSWORD_FORM.SUBTITLE")
form(ng-submit="ctrl.submit()")
fieldset
input(type="text", name="username", ng-model="data.username", data-required="true",
- placeholder="Username or email")
+ placeholder="{{'FORGOT_PASSWORD_FORM.PLACEHOLDER_FIELD' | translate}}")
fieldset
- button.button-gray.submit-button.button-forgot(type="submit", title="Reset Password") Reset Password
+ button.button-gray.submit-button.button-forgot(type="submit", title="{{'FORGOT_PASSWORD_FORM.ACTION_RESET_PASSWORD' | translate}}", translate="FORGOT_PASSWORD_FORM.ACTION_RESET_PASSWORD")
- a(href="", title="Login", tg-nav="login") Nah, take me back. I think I remember it.
+ a(href="", tg-nav="login", translate="FORGOT_PASSWORD_FORM.LINK_CANCEL")
diff --git a/app/partials/includes/modules/invitation-login-form.jade b/app/partials/includes/modules/invitation-login-form.jade
index ebdd4bbc..c3c251f1 100644
--- a/app/partials/includes/modules/invitation-login-form.jade
+++ b/app/partials/includes/modules/invitation-login-form.jade
@@ -1,13 +1,13 @@
form.login-form
- p.form-header I already have a Taiga login
+ p.form-header(translate="LOGIN_COMMON.HEADER")
fieldset
input(type="text", name="username", ng-model="dataLogin.username", data-required="true",
- placeholder="Username or email (case sensitive)")
+ placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_NAME' | translate}}")
fieldset.login-password
input(type="password", name="password", ng-model="dataLogin.password", data-required="true",
- placeholder="Password")
- a.forgot-pass(href="", tg-nav="forgot-password", title="Did you forgot your password?") Forgot it?
+ placeholder="{{''LOGIN_COMMON.PLACEHOLDER_AUTH_PASSWORD' | translate}}")
+ a.forgot-pass(href="", tg-nav="forgot-password", title="{{'LOGIN_COMMON.TITLE_LINK_FORGOT_PASSWORD' | translate}}", translate="LOGIN_COMMON.LINK_FORGOT_PASSWORD")
fieldset
- button.button-login.button-gray.submit-button(type="submit", title="Enter") Enter
+ button.button-login.button-gray.submit-button(type="submit", title="{{'LOGIN_COMMON.ACTION_ENTER' | translate}}", translate="LOGIN_COMMON.ACTION_ENTER")
fieldset(ng-repeat="plugin in contribPlugins|filter:{type: 'auth'}", ng-include="plugin.template")
diff --git a/app/partials/includes/modules/invitation-register-form.jade b/app/partials/includes/modules/invitation-register-form.jade
index 04ef0fbb..59964d4d 100644
--- a/app/partials/includes/modules/invitation-register-form.jade
+++ b/app/partials/includes/modules/invitation-register-form.jade
@@ -1,25 +1,25 @@
form.register-form
- p.form-header Register a new Taiga account (free)
+ p.form-header(translate) Register a new Taiga account (free)
fieldset
input(type="text", name="username", ng-model="dataRegister.username",
data-required="true", data-maxlength="255", data-regexp="^[\\w.-]+$",
- placeholder="Pick a username (case sensitive)")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_NAME' | translate}}")
fieldset
input(type="text", name="full_name", ng-model="dataRegister.full_name",
data-required="true", data-maxlength="256",
- placeholder="Pick your full name")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_FULL_NAME' | translate}}")
fieldset
input(type="text", name="email", ng-model="dataRegister.email",
data-required="true", data-maxlength="255",
- placeholder="Your email")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_EMAIL' | translate}}")
fieldset
input(type="password", name="password", ng-model="dataRegister.password", data-required="true",
- placeholder="Set a password")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_PASSWORD' | translate}}")
fieldset
- button.button-register.button-gray.submit-button(type="submit", title="Sign up") Sign up
+ button.button-register.button-gray.submit-button(type="submit", title="{{'REGISTER_FORM.ACTION_SIGN_UP' | translate}}", translate="REGISTER_FORM.ACTION_SIGN_UP")
tg-terms-notice
diff --git a/app/partials/includes/modules/issues-filters.jade b/app/partials/includes/modules/issues-filters.jade
index 0de01d96..58e3e202 100644
--- a/app/partials/includes/modules/issues-filters.jade
+++ b/app/partials/includes/modules/issues-filters.jade
@@ -1,52 +1,52 @@
section.filters
div.filters-inner
h1
- span.title filters
+ span.title(translate="COMMON.FILTERS.TITLE")
form
fieldset
- input(type="text", placeholder="Subject or reference", ng-model="filtersQ")
- a.icon.icon-search(href="", title="search")
+ input(type="text", placeholder="{{'COMMON.FILTERS.INPUT_PLACEHOLDER' | translate}}", ng-model="filtersQ")
+ a.icon.icon-search(href="", title="{{'COMMON.FILTERS.TITLE_ACTION_FILTER_BUTTON' | translate}}")
div.filters-step-cat
div.filters-applied
- a.hide.button.button-gray.save-filters(href="", title="save", ng-class="{hide: filters.length}") save as custom filter
+ a.hide.button.button-gray.save-filters(href="", title="{{'COMMON.SAVE' | translate}}", ng-class="{hide: filters.length}", translate="ISSUES.FILTERS.ACTION_SAVE_CUSTOM_FILTER")
h2.hidden.breadcrumb
- a.back(href="", title="back to categories") Filters
+ a.back(href="", title="{{'COMMON.FILTERS.BREADCRUB_TITLE' | translate}}", translate="COMMON.FILTERS.BREADCRUMB_FILTERS")
span.icon-arrow-right
a.subfilter(href="", title="cat-name")
- span.title status
+ span.title(translate="COMMON.FILTERS.BREADCRUMB_STATUS")
div.filters-cats
ul
li
a(href="", title="Type", data-type="types")
- span.title Type
+ span.title(translate="ISSUES.FILTERS.FILTER_CATEGORY_TYPE")
span.icon.icon-arrow-right
li
a(href="", title="Status", data-type="statuses")
- span.title Status
+ span.title(translate="ISSUES.FILTERS.FILTER_CATEGORY_STATUS")
span.icon.icon-arrow-right
li
a(href="", title="Severity", data-type="severities")
- span.title Severity
+ span.title(translate="ISSUES.FILTERS.FILTER_CATEGORY_SEVERITY")
span.icon.icon-arrow-right
li
a(href="", title="Priorities", data-type="priorities")
- span.title Priorities
+ span.title(translate="ISSUES.FILTERS.FILTER_CATEGORY_PRIORITIES")
span.icon.icon-arrow-right
li
a(href="", title="Tags", data-type="tags")
- span.title Tags
+ span.title(translate="ISSUES.FILTERS.FILTER_CATEGORY_TAGS")
span.icon.icon-arrow-right
li
a(href="", title="Assigned to", data-type="assignedTo")
- span.title Assigned to
+ span.title(translate="ISSUES.FILTERS.FILTER_CATEGORY_ASSIGNED_TO")
span.icon.icon-arrow-right
li
a(href="", title="Created by", data-type="createdBy")
- span.title Created by
+ span.title(translate="ISSUES.FILTERS.FILTER_CATEGORY_CREATED_BY")
span.icon.icon-arrow-right
li.custom-filters(ng-if="filters.myFilters.length")
- a(href="", title="Custom filters", data-type="myFilters")
- span.title Custom filters
+ a(href="", title="{{'ISSUES.FILTERS.CUSTOM_FILTERS' | translate}}", data-type="myFilters")
+ span.title(translate="ISSUES.FILTERS.CUSTOM_FILTERS")
span.icon.icon-arrow-right
div.filter-list.hidden
diff --git a/app/partials/includes/modules/issues-table.jade b/app/partials/includes/modules/issues-table.jade
index 0c75f311..4523e9ff 100644
--- a/app/partials/includes/modules/issues-table.jade
+++ b/app/partials/includes/modules/issues-table.jade
@@ -1,12 +1,12 @@
section.issues-table.basic-table(ng-class="{empty: !issues.length}")
div.row.title
- div.level-field(data-fieldname="type") Type
- div.level-field(data-fieldname="severity") Severity
- div.level-field(data-fieldname="priority") Priority
- div.subject(data-fieldname="subject") Subject
- div.issue-field(data-fieldname="status") Status
- div.created-field(data-fieldname="created_date") Created
- div.assigned-field(data-fieldname="assigned_to") Assigned to
+ div.level-field(data-fieldname="type", translate="ISSUES.FIELDS.TYPE")
+ div.level-field(data-fieldname="severity", translate="ISSUES.FIELDS.SEVERITY")
+ div.level-field(data-fieldname="priority", translate="ISSUES.FIELDS.PRIORITY")
+ div.subject(data-fieldname="subject", translate="COMMON.FIELDS.SUBJECT")
+ div.issue-field(data-fieldname="status", translate="COMMON.FIELDS.STATUS")
+ div.created-field(data-fieldname="created_date", translate="ISSUES.TABLE.COLUMN_CREATED")
+ div.assigned-field(data-fieldname="assigned_to", translate="COMMON.FIELDS.ASSIGNED_TO")
div.row.table-main(ng-repeat="issue in issues track by issue.id")
div.level-field(tg-listitem-type="issue")
div.level-field(tg-listitem-severity="issue")
@@ -17,19 +17,19 @@ section.issues-table.basic-table(ng-class="{empty: !issues.length}")
span(ng-bind="issue.subject")
div.issue-field(tg-issue-status-inline-edition="issue")
- a.issue-status(href="", title="Change status")
+ a.issue-status(href="", title="{{'ISSUES.TABLE.TITLE_ACTION_CHANGE_STATUS' | translate}}")
span.issue-status-bind
span.icon.icon-arrow-bottom(tg-check-permission="modify_issue")
div.created-field(tg-bo-bind="issue.created_date|momentFormat:'DD MMM YYYY HH:mm'")
div.assigned-field(tg-issue-assigned-to-inline-edition="issue")
- div.issue-assignedto(title="Assigned to")
+ div.issue-assignedto(title="{{'COMMON.FIELDS.ASSIGNED_TO' | translate}}")
figure.avatar
span.icon.icon-arrow-bottom(tg-check-permission="modify_issue")
section.empty.empty-issues(ng-class="{hidden: issues.length}")
span.icon.icon-issues
- span.title There are no issues to report :-)
- span Did you find an issue?
- a(href="", title+"Create a new US", ng-click="ctrl.addNewIssue()") Create a new Issue
+ span.title(translate="ISSUES.TABLE.EMPTY.TITLE")
+ span(translate="ISSUES.TABLE.EMPTY.SUBTITLE")
+ a(href="", title="{{'ISSUES.TABLE.EMPTY.ACTION_CREATE_ISSUE' | translate}}", ng-click="ctrl.addNewIssue()", translate="ISSUES.TABLE.EMPTY.ACTION_CREATE_ISSUE")
diff --git a/app/partials/includes/modules/kanban-table.jade b/app/partials/includes/modules/kanban-table.jade
index 4152d5f6..1e29a995 100644
--- a/app/partials/includes/modules/kanban-table.jade
+++ b/app/partials/includes/modules/kanban-table.jade
@@ -5,22 +5,22 @@ div.kanban-table(tg-kanban-squish-column)
span(tg-bo-bind="s.name")
div.options
- a.icon.icon-vfold.hfold(href="", ng-click='foldStatus(s)' title="Fold Column", ng-class='{hidden:folds[s.id]}')
- a.icon.icon-vunfold.hunfold(href="", ng-click='foldStatus(s)', title="Unfold Column", ng-class='{hidden:!folds[s.id]}')
+ a.icon.icon-vfold.hfold(href="", ng-click='foldStatus(s)' title="{{'KANBAN.TITLE_ACTION_FOLD' | translate}}", ng-class='{hidden:folds[s.id]}')
+ a.icon.icon-vunfold.hunfold(href="", ng-click='foldStatus(s)', title="{{'KANBAN.TITLE_ACTION_UNFOLD' | translate}}", ng-class='{hidden:!folds[s.id]}')
- a.icon.icon-vfold(href="", title="Fold Cards",
+ a.icon.icon-vfold(href="", title="{{'KANBAN.TITLE_ACTION_FOLD_CARDS' | translate}}",
ng-class="{hidden:statusViewModes[s.id] == 'minimized'}",
ng-click="ctrl.updateStatusViewMode(s.id, 'minimized')")
- a.icon.icon-vunfold(href="", title="Unfold Cards",
+ a.icon.icon-vunfold(href="", title="{{'KANBAN.TITLE_ACTION_UNFOLD_CARDS' | translate}}",
ng-class="{hidden:statusViewModes[s.id] == 'maximized'}",
ng-click="ctrl.updateStatusViewMode(s.id, 'maximized')")
- a.icon.icon-plus(href="", title="Add New User Story",
+ a.icon.icon-plus(href="", title="{{'KANBAN.TITLE_ACTION_ADD_US' | translate}}",
ng-click="ctrl.addNewUs('standard', s.id)",
tg-check-permission="add_us",
ng-hide="s.is_archived")
- a.icon.icon-bulk(href="", title="Add New bulk",
+ a.icon.icon-bulk(href="", title="{{'KANBAN.TITLE_ACTION_ADD_BULK' | translate}}",
ng-click="ctrl.addNewUs('bulk', s.id)",
tg-check-permission="add_us",
ng-hide="s.is_archived")
diff --git a/app/partials/includes/modules/lightbox-add-member.jade b/app/partials/includes/modules/lightbox-add-member.jade
index dfb3d4eb..624af87f 100644
--- a/app/partials/includes/modules/lightbox-add-member.jade
+++ b/app/partials/includes/modules/lightbox-add-member.jade
@@ -1,11 +1,11 @@
a.close(href="", title="close")
span.icon.icon-delete
form
- h2.title New Member
+ h2.title(translate="LIGHTBOX.ADD_MEMBER.TITLE")
//- Form is set in a directive
.add-member-forms
- button.button-green.submit-button(type="submit", title="Create") Create
+ button.button-green.submit-button(type="submit", title="{{'COMMON.CREATE' | translate}}", translate="COMMON.CREATE")
- p.help-text If users are already registered on Taiga, they will be added automatically. Otherwise they will receive an invitation.
+ p.help-text(translate="LIGHTBOX.ADD_MEMBER.HELP_TEXT")
diff --git a/app/partials/includes/modules/lightbox-ask-choice.jade b/app/partials/includes/modules/lightbox-ask-choice.jade
index 815c1076..cc7336a0 100644
--- a/app/partials/includes/modules/lightbox-ask-choice.jade
+++ b/app/partials/includes/modules/lightbox-ask-choice.jade
@@ -1,4 +1,4 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
h2.title
@@ -9,7 +9,7 @@ form
p.warning
div.options
- a.button-green(href="", title="Accept")
- span Accept
- a.button-red(href="", title="Delete")
- span Cancel
+ a.button-green(href="", title="{{'COMMON.ACCEPT' | translate}}")
+ span(translate="COMMON.ACCEPT")
+ a.button-red(href="", title="{{'COMMON.CANCEL' | translate}}")
+ span(translate="COMMON.CANCEL")
diff --git a/app/partials/includes/modules/lightbox-attachments.jade b/app/partials/includes/modules/lightbox-attachments.jade
deleted file mode 100644
index 8e86d3d5..00000000
--- a/app/partials/includes/modules/lightbox-attachments.jade
+++ /dev/null
@@ -1,17 +0,0 @@
-fieldset.attachments
- div.attachments-header
- h3.attachments-title
- span.icon.icon-attachment
- span.attachments-num 1
- span.attachments-text attachment
- a.button-gray(href="", title="Add new attachment")
- span + add attachment
- div.attachment-body
- - for(var x = 0; x < 1; x++)
- div.single-attachment
- div.attachment-name
- span.icon.icon-document
- a(href="", title="Attachment pefildeusuario.png") pefildeusuariopefildeusuariopefildeusuario.png
- div.attachment-comment
- span Comentario sobre el contenido
- span.attachment-size (125kb.)
diff --git a/app/partials/includes/modules/lightbox-create-issue.jade b/app/partials/includes/modules/lightbox-create-issue.jade
index cf36de34..92c01e3e 100644
--- a/app/partials/includes/modules/lightbox-create-issue.jade
+++ b/app/partials/includes/modules/lightbox-create-issue.jade
@@ -1,9 +1,9 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title Add Issue
+ h2.title(translate="LIGHTBOX.CREATE_ISSUE.TITLE")
fieldset
- input(type="text", ng-model="issue.subject", placeholder="Subject",
+ input(type="text", ng-model="issue.subject", placeholder="{{'COMMON.FIELDS.SUBJECT' | translate}}",
data-required="true", data-maxlength="500")
div.fieldset-row
fieldset
@@ -17,7 +17,7 @@ form
div.tags-block(tg-lb-tag-line, ng-model="issue.tags")
fieldset
- textarea.description(placeholder="Description", ng-model="issue.description")
+ textarea.description(placeholder="{{'COMMON.FIELDS.DESCRIPTION' | translate}}", ng-model="issue.description")
// include lightbox-attachments
- button.button-green.submit-button(type="submit", title="Create") Create
+ button.button-green.submit-button(type="submit", title="{{'COMMON.CREATE' | translate}}", translate="COMMON.CREATE")
diff --git a/app/partials/includes/modules/lightbox-delete-project.jade b/app/partials/includes/modules/lightbox-delete-project.jade
index 843f80f7..0ae8f2ad 100644
--- a/app/partials/includes/modules/lightbox-delete-project.jade
+++ b/app/partials/includes/modules/lightbox-delete-project.jade
@@ -1,12 +1,12 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'close' | translate}}")
span.icon.icon-delete
form
- h2.title Delete project
+ h2.title(translate="LIGHTBOX.DELETE_PROJECT.TITLE")
p
- span.question Are you sure you want to delete this project?
- span.subtitle All project data US/Tasks/Issues/Sprints/WikiPages will be lost! :-(
+ span.question(translate="LIGHTBOX.DELETE_PROJECT.QUESTION")
+ span.subtitle(translate="LIGHTBOX.DELETE_PROJECT.SUBTITLE")
div.options
- a.button-green(href="", title="Yes, I'm really sure")
- span Yes, I'm really sure
- a.button-red(href="", title="Cancel")
- span Cancel
+ a.button-green(href="", title="{{'LIGHTBOX.DELETE_PROJECT.CONFIRM' | translate}}")
+ span(translate="LIGHTBOX.DELETE_PROJECT.CONFIRM")
+ a.button-red(href="", title="{{'COMMON.CANCEL' | translate}}")
+ span(translate="COMMON.CANCEL")
diff --git a/app/partials/includes/modules/lightbox-feedback.jade b/app/partials/includes/modules/lightbox-feedback.jade
index 1aa22336..1153a831 100644
--- a/app/partials/includes/modules/lightbox-feedback.jade
+++ b/app/partials/includes/modules/lightbox-feedback.jade
@@ -1,9 +1,9 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title Tell us something...
+ h2.title(translate="LIGHTBOX.FEEDBACK.TITLE")
fieldset
textarea(ng-model="feedback.comment", data-required="true",
- placeholder="...a bug, some suggestions, something cool... or even your worst nightmare with Taiga")
+ placeholder="{{'LIGHTBOX.FEEDBACK.COMMENT' | translate}}")
fieldset
- button.button-green.submit-button(type="submit", title="Send feedback") Send feedback
+ button.button-green.submit-button(type="submit", title="{{'LIGHTBOX.FEEDBACK.ACTION_SEND' | translate}}", translate="LIGHTBOX.FEEDBACK.ACTION_SEND")
diff --git a/app/partials/includes/modules/lightbox-generic-ask.jade b/app/partials/includes/modules/lightbox-generic-ask.jade
index e09ef2ae..c51ba250 100644
--- a/app/partials/includes/modules/lightbox-generic-ask.jade
+++ b/app/partials/includes/modules/lightbox-generic-ask.jade
@@ -1,4 +1,4 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
h2.title
@@ -6,7 +6,7 @@ form
span.subtitle
span.message
div.options
- a.button-green(href="", title="Accept")
- span Accept
- a.button-red(href="", title="Delete")
- span Cancel
+ a.button-green(href="", title="{{'COMMON.ACCEPT' | translate}}")
+ span(translate="COMMON.ACCEPT")
+ a.button-red(href="", title="{{'COMMON.CANCEL' | translate}}")
+ span(translate="COMMON.CANCEL")
diff --git a/app/partials/includes/modules/lightbox-generic-error.jade b/app/partials/includes/modules/lightbox-generic-error.jade
index 75fc6022..ca06f309 100644
--- a/app/partials/includes/modules/lightbox-generic-error.jade
+++ b/app/partials/includes/modules/lightbox-generic-error.jade
@@ -1,7 +1,7 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
section
h2.title
div.options
- a.button-green(href="", title="Accept")
- span Accept
+ a.button-green(href="", title="{{'COMMON.ACCEPT' | translate}}")
+ span(translate="COMMON.ACCEPT")
diff --git a/app/partials/includes/modules/lightbox-generic-loading.jade b/app/partials/includes/modules/lightbox-generic-loading.jade
index d4bb9f06..95d01cac 100644
--- a/app/partials/includes/modules/lightbox-generic-loading.jade
+++ b/app/partials/includes/modules/lightbox-generic-loading.jade
@@ -2,7 +2,7 @@
section
div.spin.hidden
- img(src="/svg/spinner-circle.svg", alt="loading...")
+ img(src="/svg/spinner-circle.svg", alt="{{'COMMON.LOADING' | translate}}")
div.progress-bar-wrapper.hidden
div.bar
diff --git a/app/partials/includes/modules/lightbox-generic-success.jade b/app/partials/includes/modules/lightbox-generic-success.jade
index 1fd9208b..35828685 100644
--- a/app/partials/includes/modules/lightbox-generic-success.jade
+++ b/app/partials/includes/modules/lightbox-generic-success.jade
@@ -1,8 +1,8 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
section
h2.title
p.message
div.options
- a.button-green(href="", title="Accept")
- span Accept
+ a.button-green(href="", title="{{'COMMON.ACCEPT' | translate}}")
+ span(translate="COMMON.ACCEPT")
diff --git a/app/partials/includes/modules/lightbox-issue-bulk.jade b/app/partials/includes/modules/lightbox-issue-bulk.jade
index a3d70883..63ff4bcf 100644
--- a/app/partials/includes/modules/lightbox-issue-bulk.jade
+++ b/app/partials/includes/modules/lightbox-issue-bulk.jade
@@ -1,8 +1,8 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title(tr="common.new-bulk")
+ h2.title(translate="COMMON.NEW_BULK")
fieldset
- textarea(cols="200", wrap="off", tg-limit-line-length, tr="placeholder:common.one-item-line", ng-model="new.bulk", data-required="true", data-linewidth="200")
+ textarea(cols="200", wrap="off", tg-limit-line-length, placeholder="{{'COMMON.ONE_ITEM_LINE' | translate}}", ng-model="new.bulk", data-required="true", data-linewidth="200")
- button.button-green.submit-button(type="submit", title="Save") Save
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
diff --git a/app/partials/includes/modules/lightbox-search.jade b/app/partials/includes/modules/lightbox-search.jade
index 09ef479f..189c4890 100644
--- a/app/partials/includes/modules/lightbox-search.jade
+++ b/app/partials/includes/modules/lightbox-search.jade
@@ -1,8 +1,8 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title Search
+ h2.title(translate="LIGHTBOX.SEARCH.TITLE")
fieldset
- input(type="text", name="text", id="search-text", placeholder="What are you looking for?", data-required="true")
+ input(type="text", name="text", id="search-text", placeholder="{{'LIGHTBOX.SEARCH.PLACEHOLDER_SEARCH' | translate}}", data-required="true")
fieldset
- button.button-green.submit-button(type="submit", title="Search") Search
\ No newline at end of file
+ button.button-green.submit-button(type="submit", title="{{' LIGHTBOX.SEARCH.TITLE' | translate}}", translate="LIGHTBOX.SEARCH.TITLE")
\ No newline at end of file
diff --git a/app/partials/includes/modules/lightbox-sprint-add-edit.jade b/app/partials/includes/modules/lightbox-sprint-add-edit.jade
index 61ab85ad..a02fc2ac 100644
--- a/app/partials/includes/modules/lightbox-sprint-add-edit.jade
+++ b/app/partials/includes/modules/lightbox-sprint-add-edit.jade
@@ -1,22 +1,23 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title New Sprint
+ h2.title(translate="LIGHTBOX.ADD_EDIT_SPRINT.TITLE")
fieldset
- input.sprint-name(type="text", name="name", placeholder="sprint name", ng-model="sprint.name",
+ input.sprint-name(type="text", name="name", placeholder="{{'LIGHTBOX.ADD_EDIT_SPRINT.PLACEHOLDER_SPRINT_NAME' | translate}}", ng-model="sprint.name",
data-required="true", data-maxlength="500")
label.last-sprint-name
fieldset.dates
div
- input.date-start(type="text", name="estimated_start", placeholder="Estimated Start",
+ input.date-start(type="text", name="estimated_start", placeholder="{{'LIGHTBOX.ADD_EDIT_SPRINT.PLACEHOLDER_SPRINT_START' | translate}}",
ng-model="sprint.estimated_start", data-required="true", tg-date-selector)
div
- input.date-end(type="text", name="estimated_finish", placeholder="Estimated End",
+ input.date-end(type="text", name="estimated_finish", placeholder="{{'LIGHTBOX.ADD_EDIT_SPRINT.PLACEHOLDER_SPRINT_END' | translate}}",
ng-model="sprint.estimated_finish", data-required="true", tg-date-selector)
- button.button-green.submit-button(type="submit", title="Create") Create
+ button.button-green.submit-button(type="submit", title="{{'COMMON.CREATE' | translate}}", translate="COMMON.CREATE")
div(tg-check-permission="delete_milestone")
- span.delete-sprint.hidden Do you want to delete this sprint?
- a.icon.icon-delete(href="", title="delete sprint")
+ span.delete-sprint.hidden(translate)
+ span(tranlsate="LIGHTBOX.ADD_EDIT_SPRINT.ACTION_DELETE_SPRINT")
+ a.icon.icon-delete(href="", title="{{'LIGHTBOX.ADD_EDIT_SPRINT.TITLE_ACTION_DELETE_SPRINT' | translate}}")
diff --git a/app/partials/includes/modules/lightbox-task-bulk.jade b/app/partials/includes/modules/lightbox-task-bulk.jade
index 8b1ef334..140187ed 100644
--- a/app/partials/includes/modules/lightbox-task-bulk.jade
+++ b/app/partials/includes/modules/lightbox-task-bulk.jade
@@ -1,8 +1,8 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title(tr="common.new-bulk")
+ h2.title(translate="COMMON.NEW_BULK")
fieldset
- textarea(cols="200", wrap="off", tg-limit-line-length, tr="placeholder:common.one-item-line", ng-model="form.data", data-required="true")
+ textarea(cols="200", wrap="off", tg-limit-line-length, placeholder="{{'COMMON.ONE_ITEM_LINE' | translate}}", ng-model="form.data", data-required="true")
- button.button-green.submit-button(type="submit", title="Save") Save
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
diff --git a/app/partials/includes/modules/lightbox-task-create-edit.jade b/app/partials/includes/modules/lightbox-task-create-edit.jade
index 4541d3a4..592c7bf0 100644
--- a/app/partials/includes/modules/lightbox-task-create-edit.jade
+++ b/app/partials/includes/modules/lightbox-task-create-edit.jade
@@ -1,28 +1,28 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title(tr="task.title-new")
+ h2.title(translate="LIGHTBOX.CREATE_EDIT_TASK.TITLE")
fieldset
- input(type="text", ng-model="task.subject", placeholder="A task subject",
+ input(type="text", ng-model="task.subject", placeholder="{{'LIGHTBOX.CREATE_EDIT_TASK.PLACEHOLDER_SUBJECT' | translate}}",
data-required="true", data-maxlength="500")
fieldset
select(ng-model="task.status", ng-options="s.id as s.name for s in taskStatusList",
- placeholder="Task status")
+ placeholder="{{'LIGHTBOX.CREATE_EDIT_TASK.PLACEHOLDER_STATUS' | translate}}")
fieldset
select(ng-model="task.assigned_to", ng-options="s.id as s.full_name_display for s in users",
- placeholder="Assigned to")
- option(value="") Unassigned
+ placeholder="{{'Assigned to'}}")
+ option(value="", translate="LIGHTBOX.CREATE_EDIT_TASK.OPTION_UNASSIGNED")
fieldset
div.tags-block(tg-lb-tag-line, ng-model="task.tags")
fieldset
- textarea.description(placeholder="Type a short description", ng-model="task.description")
+ textarea.description(placeholder="{{'LIGHTBOX.CREATE_EDIT_TASK.PLACEHOLDER_SHORT_DESCRIPTION' | translate}}", ng-model="task.description")
div.settings
- fieldset.iocaine-flag(title="Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!")
+ fieldset.iocaine-flag(title="{{'COMMON.IOCAINE_TEXT' | translate}}")
input(type="checkbox", ng-model="task.is_iocaine", name="iocaine-task", id="iocaine-task", ng-value="true")
label.iocaine.trans-button(for="iocaine-task")
span.icon.icon-iocaine(for="iocaine-task icon-iocaine")
@@ -30,8 +30,8 @@ form
fieldset.blocking-flag
input(type="checkbox", ng-model="task.is_blocked", name="blocked-task", id="blocked-task", ng-value="true")
- label.blocked.trans-button(for="blocked-task", tr="common.blocked")
+ label.blocked.trans-button(for="blocked-task", translate="COMMON.BLOCKED")
tg-blocking-message-input(watch="task.is_blocked", ng-model="task.blocked_note")
- button.button-green.submit-button(type="submit", title="Create") Create
+ button.button-green.submit-button(type="submit", title="{{'COMMON.CREATE' | translate}}", translate="COMMON.CREATE")
diff --git a/app/partials/includes/modules/lightbox-us-bulk.jade b/app/partials/includes/modules/lightbox-us-bulk.jade
index 45fe85e0..2a06e59b 100644
--- a/app/partials/includes/modules/lightbox-us-bulk.jade
+++ b/app/partials/includes/modules/lightbox-us-bulk.jade
@@ -1,8 +1,8 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title(tr="common.new-bulk")
+ h2.title(translate="COMMON.NEW_BULK")
fieldset
- textarea(cols="200", wrap="off", tg-limit-line-length, tr="placeholder:common.one-item-line", ng-model="new.bulk", data-required="true", data-linewidth="200")
+ textarea(cols="200", wrap="off", tg-limit-line-length, placeholder="{{'COMMON.ONE_ITEM_LINE' | translate}}", ng-model="new.bulk", data-required="true", data-linewidth="200")
- button.button-green.submit-button(type="submit", title="Save") Save
\ No newline at end of file
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
\ No newline at end of file
diff --git a/app/partials/includes/modules/lightbox-us-create-edit.jade b/app/partials/includes/modules/lightbox-us-create-edit.jade
index bbeb8962..a3a1fd2f 100644
--- a/app/partials/includes/modules/lightbox-us-create-edit.jade
+++ b/app/partials/includes/modules/lightbox-us-create-edit.jade
@@ -1,39 +1,38 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
form
- h2.title(tr="us.title-new")
+ h2.title(translate="LIGHTBOX.CREATE_EDIT_US.TITLE")
fieldset
- input(type="text", name="subject", ng-model="us.subject", tr="placeholder:common.subject",
+ input(type="text", name="subject", ng-model="us.subject", placeholder="{{'COMMON.FIELDS.SUBJECT' | translate}}",
data-required="true", data-maxlength="500")
fieldset.estimation
tg-lb-us-estimation(ng-model="us")
fieldset
- select(name="status", ng-model="us.status", ng-options="s.id as s.name for s in usStatusList",
- tr="placeholder:common.status")
+ select(name="status", ng-model="us.status", ng-options="s.id as s.name for s in usStatusList")
fieldset
div.tags-block(tg-lb-tag-line, ng-model="us.tags")
fieldset
textarea.description(name="description", ng-model="us.description",
- placeholder="Please add descriptive text to help others better understand this US")
+ placeholder="{{'LIGHTBOX.CREATE_EDIT_US.PLACEHOLDER_DESCRIPTION' | translate}}")
div.settings
fieldset.team-requirement
input(type="checkbox", name="team_requirement", ng-model="us.team_requirement",
id="team-requirement", ng-value="true")
- label.requirement.trans-button(for="team-requirement", tr="us.team-requirement")
+ label.requirement.trans-button(for="team-requirement", translate="US.FIELDS.TEAM_REQUIREMENT")
fieldset.client-requirement
input(type="checkbox", name="client_requirement", ng-model="us.client_requirement",
id="client-requirement", ng-value="true")
- label.requirement.trans-button(for="client-requirement", tr="us.client-requirement")
+ label.requirement.trans-button(for="client-requirement", translate="US.FIELDS.CLIENT_REQUIREMENT")
fieldset.blocking-flag
input(type="checkbox", name="is_blocked", ng-model="us.is_blocked", id="blocked-us" ng-value="true")
- label.blocked.trans-button(for="blocked-us", tr="common.blocked")
+ label.blocked.trans-button(for="blocked-us", translate="COMMON.BLOCKED")
tg-blocking-message-input(watch="us.is_blocked", ng-model="us.blocked_note")
- button.button-green.submit-button(type="submit", title="Create") Create
+ button.button-green.submit-button(type="submit", title="{{'COMMON.CREATE' | translate}}", translate="COMMON.CREATE")
diff --git a/app/partials/includes/modules/list-filters-kanban.jade b/app/partials/includes/modules/list-filters-kanban.jade
deleted file mode 100644
index 75151fb0..00000000
--- a/app/partials/includes/modules/list-filters-kanban.jade
+++ /dev/null
@@ -1,12 +0,0 @@
-section.list-filters
- ul
- li
- a.trans-button(href="#")
- span.icon.icon-filter
- | SHOW FILTERS
-
- div.new-issue
- a.button-green(href="")
- span.text + NEW TASK
- a.button-bulk(href="")
- span.icon.icon-bulk
diff --git a/app/partials/includes/modules/list-filters.jade b/app/partials/includes/modules/list-filters.jade
index 459540c9..5ebb73a8 100644
--- a/app/partials/includes/modules/list-filters.jade
+++ b/app/partials/includes/modules/list-filters.jade
@@ -1,7 +1,6 @@
section.list-filters(tg-check-permission="add_issue")
div.new-issue
a.button-green(href="", ng-click="ctrl.addNewIssue()")
- span.text
- | + NEW ISSUE
+ span.text(translate="ISSUES.ACTION_NEW_ISSUE")
a.button-bulk(href="", ng-click="ctrl.addIssuesInBulk()")
span.icon.icon-bulk
diff --git a/app/partials/includes/modules/loader.jade b/app/partials/includes/modules/loader.jade
index 957ff663..f818d738 100644
--- a/app/partials/includes/modules/loader.jade
+++ b/app/partials/includes/modules/loader.jade
@@ -1,4 +1,4 @@
.loader(tg-loader)
include ../components/loading-bar
div.container
- p Loading...
+ p(translate="COMMON.LOADING")
diff --git a/app/partials/includes/modules/login-form.jade b/app/partials/includes/modules/login-form.jade
index 3517cbde..18bfa351 100644
--- a/app/partials/includes/modules/login-form.jade
+++ b/app/partials/includes/modules/login-form.jade
@@ -2,15 +2,15 @@ div.login-form-container(tg-login)
form.login-form
fieldset
input(type="text", name="username", data-required="true",
- placeholder="Username or Email (case sensitive)")
+ placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_NAME' | translate}}")
fieldset.login-password
input(type="password", name="password", data-required="true",
- placeholder="Password (case sensitive)")
+ placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_PASSWORD' | translate}}")
// This should be hidden when focus on pass
- a.forgot-pass(href="", tg-nav="forgot-password", title="Did you forgot your password?") Forgot it?
+ a.forgot-pass(href="", tg-nav="forgot-password", title="{{'LOGIN_COMMON.TITLE_LINK_FORGOT_PASSWORD' | translate}}", translate="LOGIN_COMMON.LINK_FORGOT_PASSWORD")
fieldset
- button.button-green.submit-button(type="submit", title="Sign in") Sign in
+ button.button-green.submit-button(type="submit", title="{{'LOGIN_COMMON.ACTION_SIGN_IN' | translate}}", translate="LOGIN_COMMON.ACTION_SIGN_IN")
fieldset(ng-repeat="plugin in contribPlugins|filter:{type: 'auth'}", ng-include="plugin.template")
diff --git a/app/partials/includes/modules/projects-nav.jade b/app/partials/includes/modules/projects-nav.jade
index c3d23e0d..2a26f099 100644
--- a/app/partials/includes/modules/projects-nav.jade
+++ b/app/partials/includes/modules/projects-nav.jade
@@ -1,6 +1,6 @@
.projects-nav-overlay
div.container
- p Loading project...
+ p(translate="COMMON.LOADING_PROJECT")
div.wizard-create-project(tg-lb-create-project)
include wizard-create-project
diff --git a/app/partials/includes/modules/register-form.jade b/app/partials/includes/modules/register-form.jade
index 5341588a..0b955507 100644
--- a/app/partials/includes/modules/register-form.jade
+++ b/app/partials/includes/modules/register-form.jade
@@ -3,29 +3,29 @@ div.register-form-container(tg-register)
fieldset
input(type="text", name="username", ng-model="data.username",
data-required="true", data-maxlength="255", data-regexp="^[\\w.-]+$",
- placeholder="Pick a username (case sensitive)")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_NAME' | translate}}")
fieldset
input(type="text", name="full_name", ng-model="data.full_name",
data-required="true", data-maxlength="256",
- placeholder="Pick your full name")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_FULL_NAME' | translate}}")
fieldset
input(type="text", name="email", ng-model="data.email",
data-required="true", data-maxlength="255",
- placeholder="Your email")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_EMAIL' | translate}}")
fieldset
input(type="password", name="password", ng-model="data.password",
data-required="true", data-minlength="4",
- placeholder="Set a password (case sensitive)")
+ placeholder="{{'REGISTER_FORM.PLACEHOLDER_PASSWORD' | translate}}")
fieldset
- button.button-register.button-gray.submit-button(type="submit", title="Sign up") Sign up
+ button.button-register.button-gray.submit-button(type="submit", title="{{'REGISTER_FORM.ACTION_SIGN_UP' | translate}}", translate="REGISTER_FORM.ACTION_SIGN_UP")
fieldset(tg-github-login-button)
// Only displays terms notice when terms plugin is loaded.
tg-terms-notice
- a.register-text-top(href="", title="Login", tg-nav="login") Are you already registered? Log in
+ a.register-text-top(href="", title="{{'REGISTER_FORM.TITLE_LINK_LOGIN' | translate}}", tg-nav="login", translate="REGISTER_FORM.LINK_LOGIN")
diff --git a/app/partials/includes/modules/related-tasks.jade b/app/partials/includes/modules/related-tasks.jade
index fae17e69..37efe89c 100644
--- a/app/partials/includes/modules/related-tasks.jade
+++ b/app/partials/includes/modules/related-tasks.jade
@@ -1,6 +1,6 @@
section.related-tasks(tg-related-tasks)
div.related-tasks-header
- span.related-tasks-title Related tasks
+ span.related-tasks-title(translate="COMMON.RELATED_TASKS")
div(tg-related-task-create-button)
div.related-tasks-body
div.row.single-related-task(ng-repeat="task in tasks", ng-class="{closed: task.is_closed, blocked: task.is_blocked, iocaine: task.is_iocaine}",
diff --git a/app/partials/includes/modules/search-filter.jade b/app/partials/includes/modules/search-filter.jade
index d2d447fe..22cb8f89 100644
--- a/app/partials/includes/modules/search-filter.jade
+++ b/app/partials/includes/modules/search-filter.jade
@@ -4,25 +4,25 @@ section.search-filter
a.active(href="#")
span.icon.icon-bulk
span.num 0
- span.name User Stories
+ span.name(translate="SEARCH.FILTER_USER_STORIES")
li.issues(data-name="issues")
a(href="#")
span.icon.icon-issues
span.num 0
- span.name Issues
+ span.name(translate="SEARCH.FILTER_ISSUES")
li.tasks(data-name="tasks")
a(href="#")
span.icon.icon-bulk
span.num 0
- span.name Task
+ span.name(translate="SEARCH.FILTER_TASKS")
li.wikipages(data-name="wikipages")
a(href="#")
span.icon.icon-wiki
span.num 0
- span.name Wiki Pages
+ span.name(translate="SEARCH.FILTER_WIKI")
//- li
//- a(href="#")
diff --git a/app/partials/includes/modules/search-in.jade b/app/partials/includes/modules/search-in.jade
index ab323a37..f121ff1e 100644
--- a/app/partials/includes/modules/search-in.jade
+++ b/app/partials/includes/modules/search-in.jade
@@ -1,5 +1,5 @@
section.search-in
header
fieldset
- input(type="text", placeholder="Search in...", ng-model="searchTerm")
- a.icon.icon-search(href="", title="search")
+ input(type="text", placeholder="{{'SEARCH.PLACEHOLDER_SEARCH' | translate}}", ng-model="searchTerm")
+ a.icon.icon-search(href="", title="{{'SEARCH.TITLE_ACTION_SEARCH' | translate}}")
diff --git a/app/partials/includes/modules/search-result-table.jade b/app/partials/includes/modules/search-result-table.jade
index c22f92a5..aaebd465 100644
--- a/app/partials/includes/modules/search-result-table.jade
+++ b/app/partials/includes/modules/search-result-table.jade
@@ -4,9 +4,9 @@ script(type="text/ng-template", id="search-issues")
div.search-result-table-container(ng-class="{'hidden': !issues.length}", tg-bind-scope)
div.search-result-table-header
div.row.title
- div.user-stories Issues
- div.status Status
- div.assigned-to Assigned to
+ div.user-stories(translate="SEARCH.FILTER_ISSUES")
+ div.status(translate="COMMON.FIELDS.STATUS")
+ div.assigned-to(translate="COMMON.FIELDS.ASSIGNED_TO")
div.search-result-table-body
div.row.table-main(ng-repeat="issue in issues track by issue.id")
div.user-stories
@@ -18,17 +18,17 @@ script(type="text/ng-template", id="search-issues")
div.empty.empty-search-results(ng-class="{'hidden': issues.length}")
span.icon.icon-issues
- span.title It looks like nothing was found with your search criteria.
- span Maybe try one of the tabs above or search again
+ span.title(translate="SEARCH.EMPTY_TITLE")
+ span(translate="SEARCH.EMPTY_DESCRIPTION")
script(type="text/ng-template", id="search-userstories")
div.search-result-table-container(ng-class="{'hidden': !userstories.length}", tg-bind-scope)
div.search-result-table-header
div.row.title
- div.user-stories User Stories
- div.status Status
- div.points Points
+ div.user-stories(translate="SEARCH.FILTER_USER_STORIES")
+ div.status(translate="COMMON.FIELDS.STATUS")
+ div.points(translate="COMMON.FIELDS.POINTS")
div.search-result-table-body
div.row.table-main(ng-repeat="us in userstories track by us.id")
div.user-stories
@@ -40,16 +40,16 @@ script(type="text/ng-template", id="search-userstories")
div.empty.empty-search-results(ng-class="{'hidden': userstories.length}")
span.icon.icon-issues
- span.title It looks like nothing was found with your search criteria.
- span Maybe try one of the tabs above or search again
+ span.title(translate="SEARCH.EMPTY_TITLE")
+ span(translate="SEARCH.EMPTY_DESCRIPTION")
script(type="text/ng-template", id="search-tasks")
div.search-result-table-container(ng-class="{'hidden': !tasks.length}", tg-bind-scope)
div.search-result-table-header
div.row.title
- div.user-stories Task
- div.status Status
- div.assigned-to Assigned to
+ div.user-stories(translate="SEARCH.FILTER_TASKS")
+ div.status(translate="COMMON.FIELDS.STATUS")
+ div.assigned-to(translate="COMMON.FIELDS.ASSIGNED_TO")
div.search-result-table-body
div.row.table-main(ng-repeat="task in tasks track by task.id")
div.user-stories
@@ -61,14 +61,14 @@ script(type="text/ng-template", id="search-tasks")
div.empty.empty-search-results(ng-class="{'hidden': tasks.length}")
span.icon.icon-issues
- span.title It looks like nothing was found with your search criteria.
- span Maybe try one of the tabs above or search again
+ span.title(translate="SEARCH.EMPTY_TITLE")
+ span(translate="SEARCH.EMPTY_DESCRIPTION")
script(type="text/ng-template", id="search-wikipages")
div.search-result-table-container(ng-class="{'hidden': !wikipages.length}", tg-bind-scope)
div.search-result-table-header
div.row.title
- div.user-stories Wiki page
+ div.user-stories(translate="SEARCH.FILTER_WIKI")
div.search-result-table-body
div.row.table-main(ng-repeat="wikipage in wikipages track by wikipage.id")
div.user-stories
@@ -78,5 +78,5 @@ script(type="text/ng-template", id="search-wikipages")
div.empty.empty-search-results(ng-class="{'hidden': wikipages.length}")
span.icon.icon-issues
- span.title It looks like nothing was found with your search criteria.
- span Maybe try one of the tabs above or search again
+ span.title(translate="SEARCH.EMPTY_TITLE")
+ span(translate="SEARCH.EMPTY_DESCRIPTION")
diff --git a/app/partials/includes/modules/sprint.jade b/app/partials/includes/modules/sprint.jade
index 80b1e024..52c1b605 100644
--- a/app/partials/includes/modules/sprint.jade
+++ b/app/partials/includes/modules/sprint.jade
@@ -12,8 +12,8 @@ div.sprint-table
span(tg-bo-bind="us.subject")
div.column-points.width-1(tg-bo-bind="us.total_points", ng-class="{closed: us.is_closed, blocked: us.is_blocked}")
-a.button-gray(tg-bo-title="'Go to Taskboard of ' + sprint.name",
+a.button-gray(title="{{'SPRINTS.TITLE_LINK_TASKBOARD' | translate}}",
tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
tg-check-permission="view_milestones")
- span Sprint Taskboard
+ span(translate="BACKLOG.SPRINTS.LINK_TASKBOARD")
diff --git a/app/partials/includes/modules/sprints.jade b/app/partials/includes/modules/sprints.jade
index 2974915a..8273fd26 100644
--- a/app/partials/includes/modules/sprints.jade
+++ b/app/partials/includes/modules/sprints.jade
@@ -1,19 +1,19 @@
section.sprints
header
- h1 SPRINTS
+ h1(translate="BACKLOG.SPRINTS.TITLE")
div.summary
div.total-sprints
span.number(ng-bind="project.total_milestones") --
- span.description
sprints
- a.button-green.add-sprint(href="", title="Add New sprint", ng-click="ctrl.addNewSprint()", tg-check-permission="add_milestone")
- span.text + New sprint
+ span.description(translate="BACKLOG.SPRINTS.NUMBER_SPRINTS")
+ a.button-green.add-sprint(href="", title="{{'BACKLOG.TITLE_ACTION_NEW_SPRINT' | translate}}", ng-click="ctrl.addNewSprint()", tg-check-permission="add_milestone")
+ span.text(translate="BACKLOG.SPRINTS.ACTION_NEW_SPRINT")
div.sprint.sprint-open(ng-repeat="sprint in openSprints track by sprint.id", tg-backlog-sprint="sprint", tg-sprint-sortable)
include sprint
a.filter-closed-sprints(tg-backlog-toggle-closed-sprints-visualization, href="", ng-show="totalClosedMilestones")
span.icon.icon-archive
- span.text Show closed sprints
+ span.text(translate="BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS")
div.sprint.sprint-closed(ng-repeat="sprint in closedSprints track by sprint.id" tg-backlog-sprint="sprint", tg-sprint-sortable)
include sprint
diff --git a/app/partials/includes/modules/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade
index 17478b62..6b0c3a6b 100644
--- a/app/partials/includes/modules/taskboard-table.jade
+++ b/app/partials/includes/modules/taskboard-table.jade
@@ -1,18 +1,18 @@
div.taskboard-table(tg-taskboard-squish-column)
div.taskboard-table-header
div.taskboard-table-inner
- h2.task-colum-name "User story"
+ h2.task-colum-name(translate="TASKBOARD.TABLE.COLUMN")
h2.task-colum-name(ng-repeat="s in taskStatusList track by s.id", ng-style="{'border-top-color':s.color}", ng-class="{'column-fold':statusesFolded[s.id]}", class="squish-status-{{s.id}}", tg-bo-title="s.name")
span(tg-bo-bind="s.name")
- a.icon.icon-vfold.hfold(href="", ng-click='foldStatus(s)', title="Fold Column", ng-class='{hidden:statusesFolded[s.id]}')
- a.icon.icon-vunfold.hunfold(href="", title="Unfold Column", ng-click='foldStatus(s)', ng-class='{hidden:!statusesFolded[s.id]}')
+ a.icon.icon-vfold.hfold(href="", ng-click='foldStatus(s)', title="{{'TASKBOARD.TABLE.TITLE_ACTION_FOLD' | translate}}", ng-class='{hidden:statusesFolded[s.id]}')
+ a.icon.icon-vunfold.hunfold(href="", title="{{'TASKBOARD.TABLE.TITLE_ACTION_UNFOLD' | translate}}", ng-click='foldStatus(s)', ng-class='{hidden:!statusesFolded[s.id]}')
div.taskboard-table-body(tg-taskboard-table-height-fixer)
div.taskboard-table-inner
div.task-row(ng-repeat="us in userstories track by us.id", ng-class="{blocked: us.is_blocked, 'row-fold':usFolded[us.id]}")
div.taskboard-userstory-box.task-column(tg-bo-title="us.blocked_note")
- a.icon.icon-vfold.vfold(href="", title="Fold Row", ng-click='foldUs(us)', ng-class='{hidden:usFolded[us.id]}')
- a.icon.icon-vunfold.vunfold(href="", title="Unfold Row", ng-click='foldUs(us)', ng-class='{hidden:!usFolded[us.id]}')
+ a.icon.icon-vfold.vfold(href="", title="{{'TASKBOARD.TABLE.TITLE_ACTION_FOLD_ROW' | translate}}", ng-click='foldUs(us)', ng-class='{hidden:usFolded[us.id]}')
+ a.icon.icon-vunfold.vunfold(href="", title="{{'TASKBOARD.TABLE.TITLE_ACTION_UNFOLD_ROW' | translate}}", ng-click='foldUs(us)', ng-class='{hidden:!usFolded[us.id]}')
h3.us-title
a(href="", tg-nav="project-userstories-detail:project=project.slug,ref=us.ref",
tg-bo-title="'#' + us.ref + ' ' + us.subject")
@@ -20,7 +20,7 @@ div.taskboard-table(tg-taskboard-squish-column)
span(ng-bind="us.subject")
p.points-value
span(ng-bind="us.total_points")
- span points
+ span(translate="TASKBOARD.TABLE.FIELD_POINTS")
include ../components/addnewtask
div.taskboard-tasks-box.task-column(ng-repeat="st in taskStatusList track by st.id", tg-taskboard-sortable, class="squish-status-{{st.id}}", ng-class="{'column-fold':statusesFolded[st.id]}", tg-bind-scope)
div.taskboard-task(ng-repeat="task in usTasks[us.id][st.id] track by task.id",
@@ -29,10 +29,10 @@ div.taskboard-table(tg-taskboard-squish-column)
div.task-row(ng-init="us = null", ng-class="{'row-fold':usFolded[null]}")
div.taskboard-userstory-box.task-column
- a.icon.icon-vfold.vfold(href="", title="Fold Row", ng-click='foldUs()', ng-class="{hidden:usFolded[null]}")
- a.icon.icon-vunfold.vunfold(href="", title="Unfold Row", ng-click='foldUs()', ng-class="{hidden:!usFolded[null]}")
+ a.icon.icon-vfold.vfold(href="", title="{{'TASKBOARD.TABLE.TITLE_ACTION_FOLD_ROW' | translate}}", ng-click='foldUs()', ng-class="{hidden:usFolded[null]}")
+ a.icon.icon-vunfold.vunfold(href="", title="{{'TASKBOARD.TABLE.TITLE_ACTION_UNFOLD_ROW' | translate}}", ng-click='foldUs()', ng-class="{hidden:!usFolded[null]}")
h3.us-title
- span Unassigned tasks
+ span(translate="TASKBOARD.TABLE.ROW_UNASSIGED_TASKS_TITLE")
include ../components/addnewtask.jade
div.taskboard-tasks-box.task-column(ng-repeat="st in taskStatusList track by st.id", tg-taskboard-sortable, class="squish-status-{{st.id}}", ng-class="{'column-fold':statusesFolded[st.id]}", tg-bind-scope)
div.taskboard-task(ng-repeat="task in usTasks[null][st.id] track by task.id",
diff --git a/app/partials/includes/modules/team/team-filters.jade b/app/partials/includes/modules/team/team-filters.jade
index 27e2942e..bd0fe677 100644
--- a/app/partials/includes/modules/team/team-filters.jade
+++ b/app/partials/includes/modules/team/team-filters.jade
@@ -1,11 +1,11 @@
section.team-filters
div.team-filters-inner
header
- h1 filters
+ h1(translate="COMMON.FILTERS.TITLE")
form.search-in
fieldset
- input(type="text", placeholder="Search by username or role...", ng-model="filtersQ")
- a.icon.icon-search(href="", title="search")
+ input(type="text", placeholder="{{'TEAM.PLACEHOLDER_INPUT_SEARCH' | translate}}", ng-model="filtersQ")
+ a.icon.icon-search(href="", title="{{'COMMON.FILTERS.TITLE_ACTION_FILTER_BUTTON' | translate}}")
nav(tg-team-filters)
\ No newline at end of file
diff --git a/app/partials/includes/modules/team/team-table.jade b/app/partials/includes/modules/team/team-table.jade
index f4e0c739..f2a2e3a2 100644
--- a/app/partials/includes/modules/team/team-table.jade
+++ b/app/partials/includes/modules/team/team-table.jade
@@ -3,34 +3,34 @@ section.table-team.basic-table
div.username
div.member-stats
div.attribute.attribute-name(ng-if="issuesEnabled")
- span Mr. Wolf
+ span(translate="TEAM.COLUMN_MR_WOLF")
div.popover.attribute-explanation
- span Closed issues
+ span(translate="TEAM.EXPLANATION_COLUMN_MR_WOLF")
div.attribute(ng-if="tasksEnabled")
- span Iocaine Drinker
+ span(translate="TEAM.COLUMN_IOCAINE")
div.popover.attribute-explanation
- span Iocaine doses ingested
+ span(translate="TEAM.EXPLANATION_COLUMN_IOCAINE")
div.attribute(ng-if="wikiEnabled")
- span Cervantes
+ span(translate="TEAM.COLUMN_CERVANTES")
div.popover.attribute-explanation
- span Wiki pages edited
+ span(translate="TEAM.EXPLANATION_COLUMN_CERVANTES")
div.attribute(ng-if="issuesEnabled")
- Total Bug Hunter
+ span(translate="TEAM.COLUMN_BUG_HUNTER")
div.popover.attribute-explanation
- span Bugs reported
+ span(translate="TEAM.EXPLANATION_COLUMN_BUG_HUNTER")
div.attribute(ng-if="tasksEnabled")
- span Night Shift
+ span(translate="TEAM.COLUMN_NIGHT_SHIFT")
div.popover.attribute-explanation
- span Tasks closed
+ span(translate="TEAM.EXPLANATION_COLUMN_NIGHT_SHIFT")
div.attribute
- Total Power
+ span(translate="TEAM.COLUMN_TOTAL_POWER")
div.popover.attribute-explanation
- span Total Points
+ span(translate="TEAM.EXPLANATION_COLUMN_TOTAL_POWER")
div.hero(tg-team-current-user, stats="stats", currentuser="currentUser", projectid="projectId", issuesEnabled="issuesEnabled", tasksenabled="tasksEnabled", wikienabled="wikiEnabled", ng-if="::currentUser")
h2(ng-show="memberships.length")
- span Team >
- span {{filtersRole.name || "All"}}
+ span(translate="TEAM.SECTION_TITLE_TEAM")
+ span {{filtersRole.name || ("TEAM.SECTION_FILTER_ALL" | translate)}}
section.table-team.basic-table(tg-team-members, memberships="memberships", stats="stats", filtersq="filtersQ", filtersrole="filtersRole", issuesEnabled="issuesEnabled", tasksenabled="tasksEnabled", wikienabled="wikiEnabled")
diff --git a/app/partials/includes/modules/user-settings-menu.jade b/app/partials/includes/modules/user-settings-menu.jade
index a388e367..e93963a4 100644
--- a/app/partials/includes/modules/user-settings-menu.jade
+++ b/app/partials/includes/modules/user-settings-menu.jade
@@ -1,18 +1,18 @@
section.admin-menu
header
- h1 User Settings
+ h1(translate="USER_SETTINGS.MENU.SECTION_TITLE")
nav
ul
li#usersettingsmenu-user-profile
a(href="", tg-nav="user-settings-user-profile:project=project.slug")
- span.title User profile
+ span.title(translate="USER_SETTINGS.MENU.USER_PROFILE")
span.icon.icon-arrow-right
li#usersettingsmenu-change-password
a(href="" tg-nav="user-settings-user-change-password:project=project.slug")
- span.title Change password
+ span.title(translate="USER_SETTINGS.MENU.CHANGE_PASSWORD")
span.icon.icon-arrow-right
li#usersettingsmenu-mail-notifications
a(href="", tg-nav="user-settings-mail-notifications:project=project.slug")
- span.title Email notifications
+ span.title(translate="USER_SETTINGS.MENU.EMAIL_NOTIFICATIONS")
span.icon.icon-arrow-right
diff --git a/app/partials/includes/modules/user-settings/mail-notifications-table.jade b/app/partials/includes/modules/user-settings/mail-notifications-table.jade
index 56c0af7d..f444d758 100644
--- a/app/partials/includes/modules/user-settings/mail-notifications-table.jade
+++ b/app/partials/includes/modules/user-settings/mail-notifications-table.jade
@@ -2,11 +2,11 @@ section.policy-table
div.policy-table-header
div.policy-table-row
div.policy-table-project
- span Project
+ span(translate="USER_SETTINGS.NOTIFICATIONS.COLUMN_PROJECT")
div.policy-table-all
- span Receive All
+ span(translate="USER_SETTINGS.NOTIFICATIONS.COLUMN_RECEIVE_ALL")
div.policy-table-involved
- span Only Involved
+ span(translate="USER_SETTINGS.NOTIFICATIONS.COLUMN_ONLY_INVOLVED")
div.policy-table-none
- span No notifications
+ span(translate="USER_SETTINGS.NOTIFICATIONS.COLUMN_NO_NOTIFICATIONS")
div.policy-table-body(tg-user-notifications-list, ng-model="notifyPolicies")
diff --git a/app/partials/includes/modules/wiki-nav.jade b/app/partials/includes/modules/wiki-nav.jade
deleted file mode 100644
index e69de29b..00000000
diff --git a/app/partials/includes/modules/wizard-create-project.jade b/app/partials/includes/modules/wizard-create-project.jade
index 52075256..17edc38e 100644
--- a/app/partials/includes/modules/wizard-create-project.jade
+++ b/app/partials/includes/modules/wizard-create-project.jade
@@ -1,8 +1,8 @@
form
section.wizard-step.create-step1(data-step="step1")
div.title
- h1 Choose a template
- p Which template would fit better in your project?
+ h1(translate="WIZARD.SECTION_TITLE_CHOOSE_TEMPLATE")
+ p(translate="WIZARD.CHOOSE_TEMPLATE_TEXT")
div.template-wrapper
div.template-inner
fieldset(ng-repeat="template in templates")
@@ -15,32 +15,32 @@ form
p {{ template.description }}
fieldset
- a.button-next.button.button-green(href="", title="Next") Next
+ a.button-next.button.button-green(href="", title="{{'PAGINATION.NEXT' | translate}}", translate="PAGINATION.NEXT")
section.wizard-step.create-step2.active(data-step="step2")
div.title
- h1 Create Project
- p Fresh and clean. So exciting!
+ h1(translate="WIZARD.SECTION_TITLE_CREATE_PROJECT")
+ p(translate="WIZARD.CREATE_PROJECT_TEXT")
div.template-wrapper
div.template-inner
fieldset
- input(type="text", name="name", ng-model="data.name", data-required="true", placeholder="Name", maxlength="45")
+ input(type="text", name="name", ng-model="data.name", data-required="true", placeholder="{{'COMMON.FIELD.NAME' | translate}}", maxlength="45")
fieldset
- textarea(name="description", ng-model="data.description", data-required="true", placeholder="Description")
+ textarea(name="description", ng-model="data.description", data-required="true", placeholder="{{'COMMON.FIELD.DESCRIPTION' | translate}}")
fieldset.wizard-action
div
- a.button-prev.button.button-gray(href="", title="Prev") Prev
- button.button-green.submit-button(type="submit", title="Create") Create
+ a.button-prev.button.button-gray(href="", title="{{'PAGINATION.PREVIOUS' | translate}}", translate="PAGINATION.PREVIOUS")
+ button.button-green.submit-button(type="submit", title="{{'COMMON.CREATE' | translate}}", translate="COMMON.CREATE")
button(type="submit", class="hidden")
div.progress-bar
div.progress-state
- span Template selection
- span Name and description
+ span(translate="WIZARD.PROGRESS_TEMPLATE_SELECTION")
+ span(translate="WIZARD.PROGRESS_NAME_DESCRIPTION")
// span Final touches
div.progress-bar-wrapper
div.bar
-a.close(href="" title="close")
+a.close(href="" title="{{'COMMON.CLOSE' | translate}}")
span.icon.icon-delete
diff --git a/app/partials/issue/issue-paginator.jade b/app/partials/issue/issue-paginator.jade
index 618dd768..4e7271e7 100644
--- a/app/partials/issue/issue-paginator.jade
+++ b/app/partials/issue/issue-paginator.jade
@@ -2,7 +2,7 @@ ul(class="paginator")
<% if (showPrevious) { %>
li(class="previous")
a(href="", class="previous next_prev_button", class="disabled")
- span(i18next="pagination.prev") Prev
+ span(translate="PAGINATION.PREVIOUS")
<% } %>
<% _.each(pages, function(item) { %>
li(class!="<%- item.classes %>")
@@ -18,5 +18,5 @@ ul(class="paginator")
<% if (showNext) { %>
li(class="next")
a(href="", class="next next_prev_button", class="disabled")
- span(i18next="pagination.next") Next
+ span(translate="PAGINATION.NEXT")
<% } %>
diff --git a/app/partials/issue/issue-priority-button.jade b/app/partials/issue/issue-priority-button.jade
index d990b27e..6ebdd6bb 100644
--- a/app/partials/issue/issue-priority-button.jade
+++ b/app/partials/issue/issue-priority-button.jade
@@ -4,7 +4,7 @@ div(class!="priority-data <% if(editable){ %>clickable<% }%>")
<% if(editable){ %>
span(class="icon icon-arrow-bottom")
<% }%>
- span(class="level-name") priority
+ span(class="level-name", translate="ISSUES.FIELDS.PRIORITY")
ul(class="popover pop-priority")
<% _.each(priorityes, function(pr) { %>
li
diff --git a/app/partials/issue/issue-severity-button.jade b/app/partials/issue/issue-severity-button.jade
index ec114ab4..72568662 100644
--- a/app/partials/issue/issue-severity-button.jade
+++ b/app/partials/issue/issue-severity-button.jade
@@ -4,7 +4,7 @@ div(class!="severity-data <% if(editable){ %>clickable<% }%>")
<% if(editable){ %>
span(class="icon icon-arrow-bottom")
<% }%>
- span(class="level-name") severity
+ span(class="level-name", translate="ISSUES.FIELDS.SEVERITY")
ul(class="popover pop-severity")
<% _.each(severityes, function(sv) { %>
diff --git a/app/partials/issue/issue-type-button.jade b/app/partials/issue/issue-type-button.jade
index 64db0363..4e4db6dc 100644
--- a/app/partials/issue/issue-type-button.jade
+++ b/app/partials/issue/issue-type-button.jade
@@ -4,7 +4,7 @@ div(class!="type-data <% if(editable){ %>clickable<% }%>")
<% if(editable){ %>
span(class="icon icon-arrow-bottom")
<% }%>
- span(class="level-name") type
+ span(class="level-name", translate="ISSUES.FIELDS.TYPE")
ul(class="popover pop-type")
<% _.each(typees, function(tp) { %>
diff --git a/app/partials/issue/issues-detail.jade b/app/partials/issue/issues-detail.jade
index ab528bc9..820cf3b7 100644
--- a/app/partials/issue/issues-detail.jade
+++ b/app/partials/issue/issues-detail.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="IssueDetailController as ctrl",
ng-init="section='issues'")
div.main.us-detail
@@ -10,26 +12,26 @@ div.wrapper(ng-controller="IssueDetailController as ctrl",
span.us-number(tg-bo-ref="issue.ref")
span.us-name(tg-editable-subject, ng-model="issue", required-perm="modify_issue")
- p.us-related-task(ng-if="issue.generated_user_stories.length") This issue has been promoted to US:
+ p.us-related-task(ng-if="issue.generated_user_stories.length", translate="ISSUES.PROMOTED")
a(ng-repeat="us in issue.generated_user_stories",
tg-check-permission="view_us", href="",
tg-bo-title="'#' + us.ref + ' ' + us.subject",
tg-nav="project-userstories-detail:project=project.slug, ref=us.ref")
span(tg-bo-ref="us.ref")
- p.external-reference(ng-if="issue.external_reference") This issue has been created from
- a(target="_blank", tg-bo-href="issue.external_reference[1]", title="Go to origin")
+ p.external-reference(ng-if="issue.external_reference", translate="ISSUES.EXTERNAL_REFERENCE")
+ a(target="_blank", tg-bo-href="issue.external_reference[1]", title="{{'ISSUES.GO_TO_EXTERNAL_REFERENCE' | translate}}")
span {{ issue.external_reference[1] }}
p.block-desc-container(ng-show="issue.is_blocked")
- span.block-description-title Blocked
- span.block-description(ng-bind="issue.blocked_note || 'This issue is blocked'")
+ span.block-description-title(translate="COMMON.BLOCKED")
+ span.block-description(ng-bind="issue.blocked_note || ('ISSUES.BLOCKED' | translate)")
div.issue-nav
a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
- title="previous issue")
+ title="{{'ISSUES.TITLE_PREVIOUS_ISSUE' | translate}}")
a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
- title="next issue")
+ title="{{'ISSUES.TITLE_NEXT_ISSUE' | translate}}")
div.tags-block(tg-tag-line, ng-model="issue", required-perm="modify_issue")
@@ -59,10 +61,10 @@ div.wrapper(ng-controller="IssueDetailController as ctrl",
tg-promote-issue-to-us-button(tg-check-permission="add_us", ng-model="issue")
tg-block-button(tg-check-permission="modify_issue", ng-model="issue")
tg-delete-button(tg-check-permission="delete_issue",
- on-delete-title="'Delete issue'",
+ on-delete-title="{{'ISSUES.ACTION_DELETE' | translate}}",
on-delete-go-to-url="onDeleteGoToUrl",
ng-model="issue")
- div.lightbox.lightbox-block(tg-lb-block, title="Blocking issue", ng-model="issue")
+ div.lightbox.lightbox-block(tg-lb-block, title="ISSUES.LIGHTBOX_TITLE_BLOKING_ISSUE", ng-model="issue")
div.lightbox.lightbox-select-user(tg-lb-assignedto)
div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/issue/issues-filters.jade b/app/partials/issue/issues-filters.jade
index a15c3269..8738bc6a 100644
--- a/app/partials/issue/issues-filters.jade
+++ b/app/partials/issue/issues-filters.jade
@@ -13,4 +13,4 @@ a(class="single-filter", data-type!="<%- f.type %>", data-id!="<%- f.id %>")
<% }) %>
span(class="new")
input(class="hidden my-filter-name", type="text",
- placeholder="Write the filter name and press enter")
+ placeholder="{{'ISSUES.PLACEHOLDER_FILTER_NAME' | translate}}")
diff --git a/app/partials/issue/issues-status-button.jade b/app/partials/issue/issues-status-button.jade
index d901bf10..6d56fae8 100644
--- a/app/partials/issue/issues-status-button.jade
+++ b/app/partials/issue/issues-status-button.jade
@@ -4,7 +4,7 @@ div(class!="status-data <% if(editable){ %>clickable<% }%>")
<% if(editable){ %>
span(class="icon icon-arrow-bottom")
<% } %>
- span(class="level-name") status
+ span(class="level-name", translate="COMMON.FIELDS.STATUS")
ul(class="popover pop-status")
<% _.each(statuses, function(st) { %>
diff --git a/app/partials/issue/issues.jade b/app/partials/issue/issues.jade
index be94a680..ed8f5ff0 100644
--- a/app/partials/issue/issues.jade
+++ b/app/partials/issue/issues.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper.issues(tg-issues, ng-controller="IssuesController as ctrl", ng-init="section='issues'")
sidebar.menu-secondary.extrabar.filters-bar(tg-issues-filters)
include ../includes/modules/issues-filters
diff --git a/app/partials/issue/promote-issue-to-us-button.jade b/app/partials/issue/promote-issue-to-us-button.jade
index 6bbd17c5..6d56172b 100644
--- a/app/partials/issue/promote-issue-to-us-button.jade
+++ b/app/partials/issue/promote-issue-to-us-button.jade
@@ -1,2 +1,2 @@
a(class="button button-gray editable", tg-check-permission="add_us")
- span Promote to User Story
+ span(translate="ISSUES.ACTION_PROMOTE_TO_US")
diff --git a/app/partials/kanban/kanban-task.jade b/app/partials/kanban/kanban-task.jade
index 68d2fd19..8a6d2a7e 100644
--- a/app/partials/kanban/kanban-task.jade
+++ b/app/partials/kanban/kanban-task.jade
@@ -2,21 +2,21 @@ div.kanban-tagline(tg-colorize-tags="us.tags", tg-colorize-tags-type="kanban", n
div.kanban-task-inner(ng-class="{'task-archived': us.isArchived}")
div.avatar-wrapper(tg-kanban-user-avatar="us.assigned_to", ng-model="us", ng-hide="us.isArchived")
div.task-text(ng-hide="us.isArchived")
- a.task-assigned(href="", title="Assign User Story")
+ a.task-assigned(href="", title="{{'US.ASSIGN' | translate}}")
span.task-num(tg-bo-ref="us.ref")
a.task-name(href="", title="#{{ ::us.ref }} {{ us.subject }}", ng-bind="us.subject",
tg-nav="project-userstories-detail:project=project.slug,ref=us.ref")
- p.task-points(href="", title="Total Us points")
+ p.task-points(href="", title="{{'US.TOTAL_US_POINTS' | translate}}")
span(ng-if="us.total_points !== null", ng-bind="us.total_points")
- span(ng-if="us.total_points !== null") points
- span(ng-if="us.total_points === null") Not estimated
+ span.points-text(ng-if="us.total_points !== null", translate="COMMON.FIELDS.POINTS")
+ span(ng-if="us.total_points === null", translate="US.NOT_ESTIMATED")
div.task-archived-text(ng-show="us.isArchived")
- p You have archived
+ p(translate="KANBAN.ARCHIVED")
p
span.task-num(tg-bo-ref="us.ref")
span.task-name(ng-bind="us.subject")
- p Drag & drop again to undo
+ p(translate="KANBAN.UNDO_ARCHIVED")
- a.icon.icon-edit(tg-check-permission="modify_us", href="", title="Edit", ng-hide="us.isArchived")
+ a.icon.icon-edit(tg-check-permission="modify_us", href="", title="{{'COMMON.EDIT' | translate}}", ng-hide="us.isArchived")
diff --git a/app/partials/kanban/kanban.jade b/app/partials/kanban/kanban.jade
index 606098d0..7a85f542 100644
--- a/app/partials/kanban/kanban.jade
+++ b/app/partials/kanban/kanban.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(tg-kanban, ng-controller="KanbanController as ctrl"
ng-init="section='kanban'")
section.main.kanban
diff --git a/app/partials/project/project-colors.jade b/app/partials/project/project-colors.jade
index bab64a73..56280e65 100644
--- a/app/partials/project/project-colors.jade
+++ b/app/partials/project/project-colors.jade
@@ -11,7 +11,6 @@ div.wrapper
div.project-colors-options
a.button-green.new-color(href="")
- span.text
- | + Add new status
+ span.text(translate="PROJECT.COLORS.ACTION_NEW_STATUS")
include ../includes/modules/colors-table
diff --git a/app/partials/project/project-menu.jade b/app/partials/project/project-menu.jade
index ea56ff56..4eeaede7 100644
--- a/app/partials/project/project-menu.jade
+++ b/app/partials/project/project-menu.jade
@@ -1,65 +1,65 @@
div(class="menu-container")
ul(class="main-nav")
li(id="nav-search")
- a(href="" title="Search")
+ a(href="" title="{{'PROJECT.SECTION.SEARCH' | translate}}")
span(class="icon icon-search")
- span(class="item") Search
+ span(class="item", translate="PROJECT.SECTION.SEARCH")
<% if (project.is_backlog_activated && project.my_permissions.indexOf("view_us") != -1) { %>
li(id="nav-backlog")
- a(href="" title="Backlog" tg-nav="project-backlog:project=project.slug")
+ a(href="" title="{{'PROJECT.SECTION.BACKLOG' | translate}}" tg-nav="project-backlog:project=project.slug")
span(class="icon icon-backlog")
- span(class="item") Backlog
+ span(class="item", translate="PROJECT.SECTION.BACKLOG")
<% } %>
<% if (project.is_kanban_activated && project.my_permissions.indexOf("view_us") != -1) { %>
li(id="nav-kanban")
- a(href="" title="Kanban" tg-nav="project-kanban:project=project.slug")
+ a(href="" title="{{'PROJECT.SECTION.KANBAN' | translate}}" tg-nav="project-kanban:project=project.slug")
span(class="icon icon-kanban")
- span(class="item") Kanban
+ span(class="item", translate="PROJECT.SECTION.KANBAN")
<% } %>
<% if (project.is_issues_activated && project.my_permissions.indexOf("view_issues") != -1) { %>
li(id="nav-issues")
- a(href="" title="Issues" tg-nav="project-issues:project=project.slug")
+ a(href="" title="{{'PROJECT.SECTION.ISSUES' | translate}}" tg-nav="project-issues:project=project.slug")
span(class="icon icon-issues")
- span(class="item") Issues
+ span(class="item", translate="PROJECT.SECTION.ISSUES")
<% } %>
<% if (project.is_wiki_activated && project.my_permissions.indexOf("view_wiki_pages") != -1) { %>
li(id="nav-wiki")
- a(href="" title="Wiki" tg-nav="project-wiki:project=project.slug")
+ a(href="" title="{{'PROJECT.SECTION.WIKI' | translate}}" tg-nav="project-wiki:project=project.slug")
span(class="icon icon-wiki")
- span(class="item") Wiki
+ span(class="item", translate="PROJECT.SECTION.WIKI")
<% } %>
li(id="nav-team")
- a(href="" title="Team" tg-nav="project-team:project=project.slug")
+ a(href="" title="{{'PROJECT.SECTION.TEAM' | translate}}" tg-nav="project-team:project=project.slug")
span(class="icon icon-team")
- span(class="item") Team
+ span(class="item", translate="PROJECT.SECTION.TEAM")
<% if (project.videoconferences) { %>
li(id="nav-video")
- a(href!="<%- project.videoconferenceUrl %>" target="_blank" title="Meet Up")
+ a(href!="<%- project.videoconferenceUrl %>" target="_blank" title="{{'PROJECT.SECTION.MEETUP' | translate}}")
span(class="icon icon-video")
- span(class="item") Meet Up
+ span(class="item", translate="PROJECT.SECTION.MEETUP")
<% } %>
<% if (project.i_am_owner) { %>
li(id="nav-admin")
- a(href="" tg-nav="project-admin-home:project=project.slug" title="Admin")
+ a(href="" tg-nav="project-admin-home:project=project.slug" title="{{'PROJECT.SECTION.ADMIN' | translate}}")
span(class="icon icon-settings")
- span(class="item") Admin
+ span(class="item", translate="PROJECT.SECTION.ADMIN")
<% } %>
<% if (user) { %>
div(class="user")
div(class="user-settings")
ul(class="popover")
li
- a(href="" title="User Profile", tg-nav="user-settings-user-profile:project=project.slug") User Profile
+ a(href="" title="{{'USER_SETTINGS.POPOVER.USER_PROFILE' | translate}}", tg-nav="user-settings-user-profile:project=project.slug", translate="USER_SETTINGS.POPOVER.USER_PROFILE")
li
- a(href="" title="Change Password", tg-nav="user-settings-user-change-password:project=project.slug") Change Password
+ a(href="" title="{{'USER_SETTINGS.POPOVER.CHANGE_PASSWORD' | translate}}", tg-nav="user-settings-user-change-password:project=project.slug", translate="USER_SETTINGS.POPOVER.CHANGE_PASSWORD")
li
- a(href="" title="Notifications", tg-nav="user-settings-mail-notifications:project=project.slug") Notifications
+ a(href="" title="{{'USER_SETTINGS.POPOVER.NOTIFICATIONS' | translate}}", tg-nav="user-settings-mail-notifications:project=project.slug", translate="USER_SETTINGS.POPOVER.NOTIFICATIONS")
<% if (feedbackEnabled) { %>
li
- a(href="" class="feedback" title="Feedback") Feedback
+ a(href="" class="feedback" title="{{'USER_SETTINGS.POPOVER.FEEDBACK' | translate}}", translate="USER_SETTINGS.POPOVER.FEEDBACK")
<% } %>
li
- a(href="" title="Logout" class="logout") Logout
- a(href="" title="User preferences" class="avatar" id="nav-user-settings")
+ a(href="" title="{{'COMMON.LOGOUT' | translate}}" class="logout", translate="COMMON.LOGOUT")
+ a(href="" title="{{'USER_SETTINGS.POPOVER.TITLE_AVATAR' | translate}}" class="avatar" id="nav-user-settings")
img(src="{{ user.photo }}" alt="{{ user.full_name_display }}")
<% } %>
diff --git a/app/partials/project/project-navigation-base.jade b/app/partials/project/project-navigation-base.jade
index 030087b6..ab677ce2 100644
--- a/app/partials/project/project-navigation-base.jade
+++ b/app/partials/project/project-navigation-base.jade
@@ -1,20 +1,20 @@
h1 Your projects
form
fieldset
- input.search-project(type="text", placeholder="Search in...")
+ input.search-project(type="text", placeholder="{{'PROJECT.NAVIGATION.PLACEHOLDER_SEARCH' | translate}}")
a.icon.icon-search
div.create-project-button-wrapper
- a.button-green.create-project-button(href="" title="Create new project")
- span Create project
+ a.button-green.create-project-button(href="" title="{{'PROJECT.NAVIGATION.ACTION_CREATE_PROJECT' | translate}}")
+ span(translate="PROJECT.NAVIGATION.ACTION_CREATE_PROJECT")
div(tg-import-project-button)
- a.button-blackish.import-project-button(href="" title="Import project")
+ a.button-blackish.import-project-button(href="" title="{{'PROJECT.NAVIGATION.TITLE_ACTION_IMPORT' | translate}}")
span.icon.icon-upload
input.import-file.hidden(type="file")
div.projects-pagination(tg-projects-pagination)
- a.v-pagination-previous.icon.icon-arrow-up(href="", title="Show previous projects")
+ a.v-pagination-previous.icon.icon-arrow-up(href="", title="{{'PROJECT.NAVIGATION.TITLE_PRVIOUS_PROJECT' | translate}}")
div.v-pagination-list
ul.projects-list
- a.v-pagination-next.icon.icon-arrow-bottom(href="", title="Show next projects")
+ a.v-pagination-next.icon.icon-arrow-bottom(href="", title="{{'PROJECT.NAVIGATION.TITLE_NEXT_PROJECT' | translate}}")
diff --git a/app/partials/project/project.jade b/app/partials/project/project.jade
index 56fb4f81..1d8f9b9a 100644
--- a/app/partials/project/project.jade
+++ b/app/partials/project/project.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="ProjectController as ctrl")
section.main.single-project
h1
@@ -5,16 +7,16 @@ div.wrapper(ng-controller="ProjectController as ctrl")
div.summary
div.summary-stats
span.info-num(tg-bo-bind="stats.total_points")
- span.info-text project
points
+ span.info-text(translate="PROJECT.STATS")
div.summary-stats
span.info-num(tg-bo-bind="stats.defined_points")
- span.info-text defined
points
+ span.info-text(translate="PROJECT.DEFINED")
div.summary-stats
span.info-num(tg-bo-bind="stats.assigned_points")
- span.info-text assigned
points
+ span.info-text(translate="PROJECT.ASSIGNED")
div.summary-stats
span.info-num(tg-bo-bind="stats.closed_points")
- span.info-text closed
points
+ span.info-text(translate="PROJECT.CLOSED")
div.project-data-container
p.description(tg-bo-bind="project.description")
ul
diff --git a/app/partials/project/projects.jade b/app/partials/project/projects.jade
index 94a16268..d43133a6 100644
--- a/app/partials/project/projects.jade
+++ b/app/partials/project/projects.jade
@@ -1,12 +1,13 @@
+doctype html
+
include ../includes/components/beta
div.home-projects-list(ng-controller="ProjectsController as ctrl")
.home-projects-wrapper
div.welcome-user
div.info
- p
- | Welcome
+ p(translate="PROJECT.WELCOME")
span(tg-bo-bind="ctrl.user.full_name_display")
- a.logout(ng-click="ctrl.logout()" href="", title="Logout") logout
+ a.logout(ng-click="ctrl.logout()" href="", title="{{'COMMON.LOGOUT' | translate}}", translate="COMMON.LOGOUT")
.avatar
img(tg-bo-src="ctrl.user.photo", tg-bo-alt="ctrl.user.full_name_display")
@@ -21,14 +22,13 @@ div.home-projects-list(ng-controller="ProjectsController as ctrl")
p(tg-bo-bind="project.description")
div.all-projects
- h1 Projects
+ h1(translate="PROJECT.SECTION_PROJECTS")
div(tg-projects-list)
.create-project-button-wrapper
- a.button-green.create-project-button(href="", ng-click="ctrl.newProject()", title="Create new project")
- span Create project
+ a.button-green.create-project-button(href="", ng-click="ctrl.newProject()", title="{{'PROJECT.NAVIGATION.ACTION_CREATE_PROJECT' | translate}}")
+ span(translate="PROJECT.NAVIGATION.ACTION_CREATE_PROJECT")
div(tg-import-project-button)
- a.button-blackish.import-project-button(href="", title="Import project")
+ a.button-blackish.import-project-button(href="", title="{{'PROJECT.TITLE_ACTION_IMPORT' | translate}}")
span.icon.icon-upload
input.import-file.hidden(type="file")
-
diff --git a/app/partials/search/search.jade b/app/partials/search/search.jade
index cf584252..68836dc4 100644
--- a/app/partials/search/search.jade
+++ b/app/partials/search/search.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(tg-search, ng-controller="SearchController as ctrl",
ng-init="section='search'")
diff --git a/app/partials/task/related-task-create-form.jade b/app/partials/task/related-task-create-form.jade
index 2110afcf..03b822a5 100644
--- a/app/partials/task/related-task-create-form.jade
+++ b/app/partials/task/related-task-create-form.jade
@@ -1,16 +1,16 @@
.tasks
.task-name
- input(type='text', placeholder='Type the new task subject')
+ input(type='text', placeholder="{{'TASK.PLACEHOLDER_SUBJECT' | translate}}")
.task-settings
- a.icon.icon-floppy(href='', title='Save')
- a.icon.icon-delete.cancel-edit(href='', title='Cancel')
+ a.icon.icon-floppy(href='', title="{{'COMMON.SAVE' | translate}}")
+ a.icon.icon-delete.cancel-edit(href='', title="{{'COMMON.CANCEL' | translate}}")
.status(tg-related-task-status='newTask', ng-model='newTask', not-auto-save='true')
- a.task-status(href='', title='Status Name')
+ a.task-status(href='', title="{{'TITLE_SELECT_STATUS' | translate}}")
span.task-status-bind
span.icon.icon-arrow-bottom
.assigned-to(tg-related-task-assigned-to-inline-edition='newTask', not-auto-save='true')
- .task-assignedto(title='Assigned to')
+ .task-assignedto(title="{{'COMMON.FIELDS.ASSIGNED_TO' | translate}}")
figure.avatar
span.icon.icon-arrow-bottom
diff --git a/app/partials/task/related-task-row-edit.jade b/app/partials/task/related-task-row-edit.jade
index cfc4950f..8016c273 100644
--- a/app/partials/task/related-task-row-edit.jade
+++ b/app/partials/task/related-task-row-edit.jade
@@ -1,16 +1,16 @@
.tasks
.task-name
- input(type='text', value!='<%- task.subject %>', placeholder='Type the task subject')
+ input(type='text', value!='<%- task.subject %>', placeholder="{{'TASK.PLACEHOLDER_SUBJECT' | translate}}")
.task-settings
- a.icon.icon-floppy(href='', title='Save')
- a.icon.icon-delete.cancel-edit(href='', title='Cancel')
+ a.icon.icon-floppy(href='', title="{{'COMMON.SAVE' | translate}}")
+ a.icon.icon-delete.cancel-edit(href='', title="{{'COMMON.CANCEL' | translate}}")
.status(tg-related-task-status='task', ng-model='task')
- a.task-status(href='', title='Status Name')
+ a.task-status(href='', title="{{'COMON.TITLE_SELECT_STATUS' | translate}}")
span.task-status-bind
span.icon.icon-arrow-bottom
.assigned-to(tg-related-task-assigned-to-inline-edition='task')
- .task-assignedto(title='Assigned to')
+ .task-assignedto(title="{{'COMMON.FIELDS.ASSIGNED_TO' | translate}}")
figure.avatar
span.icon.icon-arrow-bottom
diff --git a/app/partials/task/related-task-row.jade b/app/partials/task/related-task-row.jade
index d384c9a0..bbef4fd6 100644
--- a/app/partials/task/related-task-row.jade
+++ b/app/partials/task/related-task-row.jade
@@ -2,25 +2,25 @@ div(class="tasks")
div(class="task-name")
span(class="icon icon-iocaine")
a(tg-nav="project-tasks-detail:project=project.slug,ref=task.ref" title!="#<%- task.ref %> <%- task.subject %>" class="clickable")
- span #<%- task.ref %>
+ span #<%- task.ref %>
span <%- task.subject %>
div(class="task-settings")
<% if(perms.modify_task) { %>
- a(href="" title="Edit" class="icon icon-edit")
+ a(href="" title="{{'COMMON.EDIT' | translate}}" class="icon icon-edit")
<% } %>
<% if(perms.delete_task) { %>
- a(href="" title="Delete" class="icon icon-delete delete-task")
+ a(href="" title="{{'COMMON.DELETE' | translate}}" class="icon icon-delete delete-task")
<% } %>
div(tg-related-task-status="task" ng-model="task" class="status")
- a(href="" title="Status Name" class="task-status")
+ a(href="" title="{{'TASK.TITLE_SELECT_STATUS' | translate}}" class="task-status")
span(class="task-status-bind")
<% if(perms.modify_task) { %>
span(class="icon icon-arrow-bottom")
<% } %>
div(tg-related-task-assigned-to-inline-edition="task" class="assigned-to")
- div(title="Assigned to" class="task-assignedto <% if(perms.modify_task) { %>editable<% } %>")
+ div(title="{{'COMMON.FIELDS.ASSIGNED_TO' | translate}}" class="task-assignedto <% if(perms.modify_task) { %>editable<% } %>")
figure(class="avatar")
<% if(perms.modify_task) { %>
span(class="icon icon-arrow-bottom")
diff --git a/app/partials/task/task-detail.jade b/app/partials/task/task-detail.jade
index 4d149454..2bd2b2ad 100644
--- a/app/partials/task/task-detail.jade
+++ b/app/partials/task/task-detail.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="TaskDetailController as ctrl",
ng-init="section='backlog-kanban'")
div.main.us-detail
@@ -6,9 +8,9 @@ div.wrapper(ng-controller="TaskDetailController as ctrl",
.action-buttons
a.button-gray(
tg-check-permission="view_milestones",
- href="", title="Go to taskboard",
+ href="", title="{{'TASK.LINK_TASKBOARD' | translate}}",
tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
- ng-if="sprint && project.is_backlog_activated") Taskboard
+ ng-if="sprint && project.is_backlog_activated", translate="TASKBOARD.SECTION_NAME")
section.us-story-main-data
div.us-title(ng-class="{blocked: task.is_blocked}")
@@ -16,25 +18,25 @@ div.wrapper(ng-controller="TaskDetailController as ctrl",
span.us-number(tg-bo-ref="task.ref")
span.us-name(tg-editable-subject, ng-model="task", required-perm="modify_task")
- h3.us-related-task This task belongs to
- a(tg-check-permission="view_us", href="", title="Go to user story",
+ h3.us-related-task(translate="TASK.OWNER_US")
+ a(tg-check-permission="view_us", href="", title="{{'TASK.TITLE_LINK_GO_OWNER' | translate}}",
tg-nav="project-userstories-detail:project=project.slug, ref=us.ref",
ng-if="us")
span(tg-bo-ref="us.ref")
span(tg-bo-bind="us.subject")
- p.external-reference(ng-if="task.external_reference") This task has been created from
- a(target="_blank", tg-bo-href="task.external_reference[1]", title="Go to origin")
+ p.external-reference(ng-if="task.external_reference", translate="TASK.ORIGIN_US")
+ a(target="_blank", tg-bo-href="task.external_reference[1]", title="{{'TASK.TITLE_LINK_GO_ORIGIN' | translate}}")
span {{ task.external_reference[1] }}
p.block-desc-container(ng-show="task.is_blocked")
- span.block-description-title Blocked
- span.block-description(ng-bind="task.blocked_note || 'This task is blocked'")
+ span.block-description-title(translate="COMMON.BLOCKED")
+ span.block-description(ng-bind="task.blocked_note || ('TASK.BLOCKED_DESCRIPTION' | translate)")
div.issue-nav
a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
- title="previous task")
+ title="{{'TASK.PREVIOUS' | translate}}")
a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
- title="next task")
+ title="{{'TASK.NEXT' | translate}}")
div.tags-block(tg-tag-line, ng-model="task", required-perm="modify_task")
@@ -61,10 +63,10 @@ div.wrapper(ng-controller="TaskDetailController as ctrl",
tg-task-is-iocaine-button(ng-model="task")
tg-block-button(tg-check-permission="modify_task", ng-model="task")
tg-delete-button(tg-check-permission="delete_task",
- on-delete-title="'Delete Task'",
+ on-delete-title="{{'TASK.TITLE_DELETE_ACTION' | translate}}",
on-delete-go-to-url="onDeleteGoToUrl",
ng-model="task")
- div.lightbox.lightbox-block(tg-lb-block, title="Blocking task", ng-model="task")
+ div.lightbox.lightbox-block(tg-lb-block, title="TASK.LIGHTBOX_TITLE_BLOKING_TASK", ng-model="task")
div.lightbox.lightbox-select-user(tg-lb-assignedto)
div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/taskboard/taskboard-user.jade b/app/partials/taskboard/taskboard-user.jade
index 68fe53dc..ca05113f 100644
--- a/app/partials/taskboard/taskboard-user.jade
+++ b/app/partials/taskboard/taskboard-user.jade
@@ -1,5 +1,5 @@
figure.avatar.avatar-assigned-to
- a(href='#', title='Assign task', ng-class="{'not-clickable': !clickable}")
+ a(href='#', title="{{'TASKBOARD.TITLE_ACTION_ASSIGN' | translate}}", ng-class="{'not-clickable': !clickable}")
img(ng-src='{{imgurl}}')
figure.avatar.avatar-task-link
a(tg-nav='project-tasks-detail:project=project.slug,ref=task.ref', ng-attr-title='{{task.subject}}')
diff --git a/app/partials/taskboard/taskboard.jade b/app/partials/taskboard/taskboard.jade
index 33faab92..5f4cfda1 100644
--- a/app/partials/taskboard/taskboard.jade
+++ b/app/partials/taskboard/taskboard.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(tg-taskboard, ng-controller="TaskboardController as ctrl",
ng-init="section='backlog'")
section.main.taskboard
diff --git a/app/partials/team/leave-project.jade b/app/partials/team/leave-project.jade
index 8b482f7b..16b599f0 100644
--- a/app/partials/team/leave-project.jade
+++ b/app/partials/team/leave-project.jade
@@ -1,4 +1,3 @@
a.leave-project(ng-click='leave()', href='')
span.icon.icon-delete
-
- | Leave this project
+ | {{"TEAM.ACTION_LEAVE_PROJECT" | translate}}
diff --git a/app/partials/team/team-filter.jade b/app/partials/team/team-filter.jade
index 62cffffe..26ae1828 100644
--- a/app/partials/team/team-filter.jade
+++ b/app/partials/team/team-filter.jade
@@ -1,7 +1,7 @@
ul
li
a(ng-class='{active: !filtersRole.id}', ng-click='ctrl.setRole()', href='')
- span.title All
+ span.title(translate="TEAM.SECTION_FILTER_ALL")
span.icon.icon-arrow-right
li(ng-repeat='role in roles')
diff --git a/app/partials/team/team.jade b/app/partials/team/team.jade
index 84f47d4f..96323560 100644
--- a/app/partials/team/team.jade
+++ b/app/partials/team/team.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="TeamController as ctrl", ng-init="section='team'")
sidebar.menu-secondary
include ../includes/modules/team/team-filters
diff --git a/app/partials/us/us-client-requirement-button.jade b/app/partials/us/us-client-requirement-button.jade
index a3dbe9d3..dc269cbc 100644
--- a/app/partials/us/us-client-requirement-button.jade
+++ b/app/partials/us/us-client-requirement-button.jade
@@ -1,5 +1,4 @@
label(for="client-requirement",
- class!="button button-gray client-requirement <% if(canEdit){ %>editable<% }; %> <% if(isRequired){ %>active<% }; %>")
- | Client requirement
+ class!="button button-gray client-requirement <% if(canEdit){ %>editable<% }; %> <% if(isRequired){ %>active<% }; %>", translate="US.FIELDS.CLIENT_REQUIREMENT")
input(type="checkbox", id="client-requirement", name="client-requirement")
\ No newline at end of file
diff --git a/app/partials/us/us-detail.jade b/app/partials/us/us-detail.jade
index 8c8708a1..85e15ddb 100644
--- a/app/partials/us/us-detail.jade
+++ b/app/partials/us/us-detail.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="UserStoryDetailController as ctrl",
ng-init="section='backlog-kanban'")
div.main.us-detail
@@ -6,9 +8,9 @@ div.wrapper(ng-controller="UserStoryDetailController as ctrl",
.action-buttons
a.button-gray(
tg-check-permission="view_milestones",
- href="", title="Go to taskboard",
+ href="", title="{{'TASK.LINK_TASKBOARD' | translate}}",
tg-nav="project-taskboard:project=project.slug,sprint=sprint.slug",
- ng-if="sprint && project.is_backlog_activated") Taskboard
+ ng-if="sprint && project.is_backlog_activated", translate="TASKBOARD.SECTION_NAME")
section.us-story-main-data
div.us-title(ng-class="{blocked: us.is_blocked}")
@@ -16,24 +18,24 @@ div.wrapper(ng-controller="UserStoryDetailController as ctrl",
span.us-number(tg-bo-ref="us.ref")
span.us-name(tg-editable-subject, ng-model="us", required-perm="modify_us")
- p.us-related-task(ng-if="us.origin_issue") This US has been promoted from Issue
- a(tg-check-permission="view_us", href="", title="Go to issue",
+ p.us-related-task(ng-if="us.origin_issue", translate="US.PROMOTED")
+ a(tg-check-permission="view_us", href="", title="{{'US.TITLE_LINK_GO_TO_ISSUE' | translate}}",
tg-nav="project-issues-detail:project=project.slug, ref=us.origin_issue.ref"
tg-bo-title="'#' + us.origin_issue.ref + ' ' + us.origin_issue.subject")
span(tg-bo-ref="us.origin_issue.ref")
- p.external-reference(ng-if="us.external_reference") This US has been created from
- a(target="_blank", tg-bo-href="us.external_reference[1]", title="Go to origin")
+ p.external-reference(ng-if="us.external_reference", translate="US.EXTERNAL_REFERENCE")
+ a(target="_blank", tg-bo-href="us.external_reference[1]", title="{{'US.GO_TO_EXTERNAL_REFERENCE' | translate}}")
span {{ us.external_reference[1] }}
p.block-desc-container(ng-show="us.is_blocked")
- span.block-description-title Blocked
- span.block-description(ng-bind="us.blocked_note || 'This user story is blocked'")
+ span.block-description-title(translate="COMMON.BLOCKED")
+ span.block-description(ng-bind="us.blocked_note || ('US.BLOCKED' | translate)")
div.issue-nav
a.icon.icon-arrow-left(ng-show="previousUrl", tg-bo-href="previousUrl",
- title="previous user story")
+ title="{{'US.PREVIOUS' | translate}}")
a.icon.icon-arrow-right(ng-show="nextUrl", tg-bo-href="nextUrl",
- title="next user story")
+ title="{{'US.NEXT' | translate}}")
div.tags-block(tg-tag-line, ng-model="us", required-perm="modify_us")
@@ -65,10 +67,10 @@ div.wrapper(ng-controller="UserStoryDetailController as ctrl",
tg-us-client-requirement-button(ng-model="us")
tg-block-button(tg-check-permission="modify_us", ng-model="us")
tg-delete-button(tg-check-permission="delete_us",
- on-delete-title="'Delete User Story'",
+ on-delete-title="{{'Delete User Story' | translate}}",
on-delete-go-to-url="onDeleteGoToUrl",
ng-model="us")
- div.lightbox.lightbox-block(tg-lb-block, title="Blocking us", ng-model="us")
+ div.lightbox.lightbox-block(tg-lb-block, title="US.LIGHTBOX_TITLE_BLOKING_US", ng-model="us")
div.lightbox.lightbox-select-user(tg-lb-assignedto)
div.lightbox.lightbox-select-user(tg-lb-watchers)
diff --git a/app/partials/us/us-status-button.jade b/app/partials/us/us-status-button.jade
index b46f156f..7a3ba3b5 100644
--- a/app/partials/us/us-status-button.jade
+++ b/app/partials/us/us-status-button.jade
@@ -4,7 +4,7 @@ div(class!="status-data <% if(editable){ %>clickable<% }%>")
<% if(editable){ %>
span.icon.icon-arrow-bottom
<% }%>
- span.level-name status
+ span.level-name(translate="COMMON.FIELDS.STATUS")
ul.popover.pop-status
<% _.each(statuses, function(st) { %>
diff --git a/app/partials/us/us-task-progress.jade b/app/partials/us/us-task-progress.jade
index 8ced2ed5..df2f8b7c 100644
--- a/app/partials/us/us-task-progress.jade
+++ b/app/partials/us/us-task-progress.jade
@@ -1,3 +1,2 @@
-.current-progress(style!='width:<%- progress %>%')
-div.tasks-completed
- | <%- totalClosedTasks %>/<%- totalTasks %> tasks completed
\ No newline at end of file
+.current-progress(ng-style='style')
+div.tasks-completed(translate="US.TASK_COMPLETED", translate-values='{ totalTasks: totalTasks, totalClosedTasks: totalClosedTasks}')
diff --git a/app/partials/us/us-team-requirement-button.jade b/app/partials/us/us-team-requirement-button.jade
index 3067d7d9..e1520364 100644
--- a/app/partials/us/us-team-requirement-button.jade
+++ b/app/partials/us/us-team-requirement-button.jade
@@ -1,4 +1,3 @@
-label(for="team-requirement", class!="button button-gray team-requirement <% if(canEdit){ %>editable<% }; %> <% if(isRequired){ %>active<% }; %>")
- | Team requirement
+label(for="team-requirement", class!="button button-gray team-requirement <% if(canEdit){ %>editable<% }; %> <% if(isRequired){ %>active<% }; %>", translate="US.FIELDS.TEAM_REQUIREMENT")
input(type="checkbox", id="team-requirement", name="team-requirement")
\ No newline at end of file
diff --git a/app/partials/user/cancel-account.jade b/app/partials/user/cancel-account.jade
index 1735da1e..9d3043e5 100644
--- a/app/partials/user/cancel-account.jade
+++ b/app/partials/user/cancel-account.jade
@@ -1,8 +1,10 @@
+doctype html
+
div.wrapper.cancel-account
div.login-main
div.login-container
h1.logo
img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- p.tagline Your agile, free, and open source project management tool
+ p.tagline(translate="COMMON.TAG_LINE")
include ../includes/modules/cancel-account-form
diff --git a/app/partials/user/change-email.jade b/app/partials/user/change-email.jade
index 1102d53c..7f2ef8ab 100644
--- a/app/partials/user/change-email.jade
+++ b/app/partials/user/change-email.jade
@@ -1,8 +1,10 @@
+doctype html
+
div.wrapper
div.login-main
div.login-container
h1.logo
img.logo-svg(src="/svg/logo.svg", alt="TAIGA")
- p.tagline Your agile, free, and open source project management tool
+ p.tagline(translate="COMMON.TAG_LINE")
include ../includes/modules/change-email-form
diff --git a/app/partials/user/lightbox/lightbox-delete-account.jade b/app/partials/user/lightbox/lightbox-delete-account.jade
index 03b3b528..9d4fb190 100644
--- a/app/partials/user/lightbox/lightbox-delete-account.jade
+++ b/app/partials/user/lightbox/lightbox-delete-account.jade
@@ -1,12 +1,12 @@
-a.close(href="", title="close")
+a.close(href="", title="{{'close' | translate}}")
span.icon.icon-delete
form
- h2.title Delete Taiga Account
+ h2.title(translate="LIGHTBOX.DELETE_ACCOUNT.SECTION_NAME")
p
- span.question Are you sure you want to delete your Taiga account?
- span.subtitle We're going to miss you! :-(
+ span.question(translate="LIGHBOX.DELETE_ACCOUNT.CONFIRM")
+ span.subtitle(translate="LIGHBOX.DELETE_ACCOUNT.SUBTITLE")
div.options
- a.button-green(href="", title="Accept")
- span Accept
- a.button-red(href="", title="Cancel")
- span Cancel
+ a.button-green(href="", title="{{'COMMON.ACCEPT' | translate}}")
+ span(translate="COMMON.ACCEPT") Accept
+ a.button-red(href="", title="{{'Cancel' | translate}}", )
+ span(translate="COMMON.CANCEL") Accept
diff --git a/app/partials/user/mail-notifications.jade b/app/partials/user/mail-notifications.jade
index 2676f575..a798aad6 100644
--- a/app/partials/user/mail-notifications.jade
+++ b/app/partials/user/mail-notifications.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(tg-user-notifications, ng-controller="UserNotificationsController as ctrl",
ng-init="section='mail-notifications'")
sidebar.menu-secondary.sidebar(tg-user-settings-navigation="mail-notifications")
@@ -6,8 +8,8 @@ div.wrapper(tg-user-notifications, ng-controller="UserNotificationsController as
section.main.admin-common
header
h1
- span.green(tg-bo-html="sectionName")
+ span.green {{sectionName | translate}}
- p.total Notifications By Mail
+ p.total(translate="NOTIFICATION.MAIL")
include ../includes/modules/user-settings/mail-notifications-table
diff --git a/app/partials/user/user-change-password.jade b/app/partials/user/user-change-password.jade
index 4eb2698d..c9057993 100644
--- a/app/partials/user/user-change-password.jade
+++ b/app/partials/user/user-change-password.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(tg-user-change-password, ng-controller="UserChangePasswordController as ctrl",
ng-init="section='user-settings'")
sidebar.menu-secondary.sidebar(tg-user-settings-navigation="change-password")
@@ -6,17 +8,17 @@ div.wrapper(tg-user-change-password, ng-controller="UserChangePasswordController
section.main.user-change-password
header
h1
- span.green(tg-bo-html="sectionName")
+ span.green {{sectionName | translate}}
form
fieldset
- label(for="current-password") Current Password
- input(type="password", placeholder="Your current password (or empty if you have no password yet)", id="current-password", ng-model="currentPassword")
+ label(for="current-password", translate="CHANGE_PASSWORD.FIELD_CURRENT_PASSWORD")
+ input(type="password", placeholder="{{'Your current password (or empty if you have no password yet)' | translate}}", id="current-password", ng-model="currentPassword")
fieldset
- label(for="new-password") New Password
- input(type="password", placeholder="New Password", id="new-password", ng-model="newPassword1")
+ label(for="new-password", translate="CHANGE_PASSWORD.FIELD_NEW_PASSWORD")
+ input(type="password", placeholder="{{'CHANGE_PASSWORD.FIELD_NEW_PASSWORD' | translate}}", id="new-password", ng-model="newPassword1")
fieldset
- label(for="retype-password") Retype Password
- input(type="password", placeholder="Retype Password", id="retype-password", ng-model="newPassword2")
+ label(for="retype-password", translate) Retype Password
+ input(type="password", placeholder="{{'CHANGE_PASSWORD.FIELD_RETYPE_PASSWORD' | translate}}", id="retype-password", ng-model="newPassword2")
fieldset
- button.button-green.submit-button(type="submit", title="Save") Save
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
diff --git a/app/partials/user/user-profile.jade b/app/partials/user/user-profile.jade
index 6c39fb79..45c6ee63 100644
--- a/app/partials/user/user-profile.jade
+++ b/app/partials/user/user-profile.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(tg-user-profile, ng-controller="UserSettingsController as ctrl",
ng-init="section='user-settings'")
sidebar.menu-secondary.sidebar(tg-user-settings-navigation="user-profile")
@@ -6,7 +8,7 @@ div.wrapper(tg-user-profile, ng-controller="UserSettingsController as ctrl",
section.main.user-profile
header
h1
- span.green(tg-bo-html="sectionName")
+ span.green {{sectionName | translate}}
form
div.container
@@ -15,42 +17,47 @@ div.wrapper(tg-user-profile, ng-controller="UserSettingsController as ctrl",
.image-container
img.avatar(ng-src="{{user.big_photo}}" alt="avatar")
.overlay.hidden
- img.loading-spinner(src="/svg/spinner-circle.svg", alt="loading...")
+ img.loading-spinner(src="/svg/spinner-circle.svg", alt="{{'COMMON.LOADING' | translate}}")
input(type="file", id="avatar-field", class="hidden",
tg-avatar-model="avatarAttachment")
- p The image will be cropped to 80x80px.
+ p(translate="USER_PROFILE.IMAGE_HELP")
span.size-info.hidden(tg-bo-html="maxFileSizeMsg")
- a.button-green.change.js-change-avatar(tg-bo-title="'Change photo. ' + maxFileSizeMsg") Change
- a.use-gravatar Use gravatar image
+ a.button-green.change.js-change-avatar(title="{{'USER_PROFILE.CHANGE_PHOTO'}} + ' ' + maxFileSizeMsg", translate="USER_PROFILE.ACTION_CHANGE_IMAGE")
+ a.use-gravatar(translate="USER_PROFILE.ACTION_USE_GRAVATAR")
div.data
fieldset
- label(for="email") Username
- input(type="text", name="username", id="username", placeholder="username",
+ label(for="email", translate"USER_PROFILE.FIELD.USERNAME")
+ input(type="text", name="username", id="username", placeholder="{{'USER_PROFILE.FIELD.USERNAME' | translate}}",
ng-model="user.username", data-required="true", data-maxlength="255",
data-regexp="^[\\w.-]+$")
fieldset
- label(for="email") Email
- input(type="text", name="email", id="email", placeholder="email",
+ label(for="email", translate="USER_PROFILE.FIELD.EMAIL")
+ input(type="text", name="email", id="email", placeholder="{{'USER_PROFILE.FIELD.EMAIL' | translate}}",
ng-model="user.email", data-type="email", data-required="true",
data-maxlength="255")
fieldset
- label(for="full-name") Full name
+ label(for="full-name", translate="USER_PROFILE.FIELD.FULL_NAME")
input(type="text", name="full_name", id="full-name",
- placeholder="Set your full name (ex. Íñigo Montoya)",
+ placeholder="{{'USER_PROFILE.FIELD.PLACEHOLDER_FULL_NAME' | translate}}",
ng-model="user.full_name", data-required="true",
data-maxlength="256")
fieldset
- label(for="bio") Bio
- textarea(name="bio", id="bio", placeholder="Tell us something about you",
+ label(for="full-name", translate="USER_PROFILE.FIELD.LANGUAGE")
+ select(data-required="true", ng-model="lang")
+ option(value="en", translate="LANGUAGES.ENGLISH")
+
+ fieldset
+ label(for="bio", translate="USER_PROFILE.FIELD.BIO")
+ textarea(name="bio", id="bio", placeholder="{{'USER_PROFILE.FIELD.PLACEHOLDER_BIO' | translate}}",
ng-model="user.bio")
fieldset.submit
- button.button-green.submit-button(type="submit", title="Save") Save
- a.delete-account(href="", title="Delete Taiga account",
- ng-click="ctrl.openDeleteLightbox()") Delete Taiga account
+ button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE")
+ a.delete-account(href="", title="{{'USER_PROFILE.ACTION_DELETE_ACCOUNT' | translate}}",
+ ng-click="ctrl.openDeleteLightbox()", translate="USER_PROFILE.ACTION_DELETE_ACCOUNT")
div.lightbox.lightbox-delete-account(tg-lb-delete-user)
diff --git a/app/partials/wiki/editable-wiki-content.jade b/app/partials/wiki/editable-wiki-content.jade
index ddeb2581..ae963af2 100644
--- a/app/partials/wiki/editable-wiki-content.jade
+++ b/app/partials/wiki/editable-wiki-content.jade
@@ -1,11 +1,11 @@
.view-wiki-content
section.wysiwyg(tg-bind-html='wiki.html')
- span.edit.icon.icon-edit(title='Edit')
+ span.edit.icon.icon-edit(title="{{'COMMON.EDIT' | translate}}")
.edit-wiki-content(style='display: none;')
- textarea(placeholder='Write your wiki page here', ng-model='wiki.content', tg-markitup='tg-markitup')
- a.help-markdown(href='https://taiga.io/support/taiga-markdown-syntax/', target='_blank', title='Mardown syntax help')
+ textarea(placeholder="{{'WIKI.PLACEHOLDER_PAGE' | translate}}", ng-model='wiki.content', tg-markitup='tg-markitup')
+ a.help-markdown(href='https://taiga.io/support/taiga-markdown-syntax/', target='_blank', title="{{'COMMON.DESCRIPTION.MARKDOWN_HELP' | translate}}")
span.icon.icon-help
- span Markdown syntax help
+ span(translate="COMMON.DESCRIPTION.MARKDOWN_HELP")
span.action-container
- a.save.icon.icon-floppy(href='', title='Save')
- a.cancel.icon.icon-delete(href='', title='Cancel')
+ a.save.icon.icon-floppy(href='', title="{{'COMMON.SAVE' | translate}}")
+ a.cancel.icon.icon-delete(href='', title="{{'COMMON.CANCEL' | translate}}")
diff --git a/app/partials/wiki/wiki-nav.jade b/app/partials/wiki/wiki-nav.jade
index 759bccaa..8e2c97bc 100644
--- a/app/partials/wiki/wiki-nav.jade
+++ b/app/partials/wiki/wiki-nav.jade
@@ -1,5 +1,5 @@
header
- h1 Links
+ h1(translate="WIKI.NAVIGATION.SECTION_NAME")
nav
ul
@@ -10,11 +10,11 @@ nav
<% if (deleteWikiLinkPermission) { %>
span.icon.icon-delete
<% } %>
- input(type="text" placeholder="name" class="hidden" value!="<%- link.title %>")
+ input(type="text" placeholder="{{'COMMON.FIELDS.NAME' | translate}}" class="hidden" value!="<%- link.title %>")
<% }) %>
li.new.hidden
- input(type="text" placeholder="name")
+ input(type="text" placeholder="{{'COMMON.FIELDS.NAME' | translate}}")
<% if (addWikiLinkPermission) { %>
-a(href="" title="Add link" class="add-button button-gray")
- span Add link
+a(href="" title="{{'WIKI.NAVIGATION.ACTION_ADD_LINK' | translate}}" class="add-button button-gray")
+ span(translate="WIKI.NAVIGATION.ACTION_ADD_LINK")
<% } %>
diff --git a/app/partials/wiki/wiki-summary.jade b/app/partials/wiki/wiki-summary.jade
index 7fb31db1..f2855cba 100644
--- a/app/partials/wiki/wiki-summary.jade
+++ b/app/partials/wiki/wiki-summary.jade
@@ -1,14 +1,14 @@
div.wiki-times-edited
span.number <%- totalEditions %>
- span.description times
edited
+ span.description(translate="WIKI.SUMMARY.TIMES_EDITED")
div.wiki-last-modified
span.number <%- lastModifiedDate %>
- span.description last
edit
+ span.description(translate="WIKI.SUMMARY.LAST_EDIT")
div.wiki-username-edition
figure.avatar
img(src!="<%- user.imgUrl %>" alt!="<%- user.name %>")
div.wiki-user-modification
- span.description last modification
+ span.description(translate="WIKI.SUMMARY.LAST_MODIFICATION")
span.username <%- user.name %>
diff --git a/app/partials/wiki/wiki.jade b/app/partials/wiki/wiki.jade
index aabca782..34463d42 100644
--- a/app/partials/wiki/wiki.jade
+++ b/app/partials/wiki/wiki.jade
@@ -1,3 +1,5 @@
+doctype html
+
div.wrapper(ng-controller="WikiDetailController as ctrl",
ng-init="section='wiki'")
sidebar.menu-secondary.extrabar(tg-check-permission="view_wiki_links")
@@ -6,7 +8,7 @@ div.wrapper(ng-controller="WikiDetailController as ctrl",
.header
h1
span(tg-bo-bind="project.name")
- span.green Wiki
+ span.green(translate="PROJECT.SECTION.WIKI")
span.wiki-title(tg-bo-bind='wikiSlug|unslugify')
div.summary.wiki-summary(tg-wiki-summary, ng-model="wiki", ng-if="wiki.id")
@@ -14,6 +16,6 @@ div.wrapper(ng-controller="WikiDetailController as ctrl",
tg-attachments(ng-model="wiki", type="wiki_page", ng-if="wiki.id")
- a.remove(href="", ng-click="ctrl.delete()", ng-if="wiki.id", title="Remove this wiki page", tg-check-permission="delete_wiki_page")
+ a.remove(href="", ng-click="ctrl.delete()", ng-if="wiki.id", title="{{'WIKI.REMOVE' | translate}}", tg-check-permission="delete_wiki_page")
span.icon.icon-delete
- span Remove this wiki page
+ span(translate="WIKI.REMOVE")
diff --git a/app/styles/components/kanban-task.scss b/app/styles/components/kanban-task.scss
index 5cc71ed5..429edda7 100644
--- a/app/styles/components/kanban-task.scss
+++ b/app/styles/components/kanban-task.scss
@@ -152,6 +152,9 @@
padding-right: .2rem;
}
}
+ .points-text {
+ text-transform: lowercase;
+ }
}
.kanban-tag {
border-top: .3rem solid;
diff --git a/app/styles/components/summary.scss b/app/styles/components/summary.scss
index 0c50809c..33ee7665 100644
--- a/app/styles/components/summary.scss
+++ b/app/styles/components/summary.scss
@@ -67,7 +67,6 @@
}
}
-
.large-summary {
justify-content: space-between;
.large-summary-wrapper {
diff --git a/app/styles/layout/us-detail.scss b/app/styles/layout/us-detail.scss
index 90107884..b3322b59 100644
--- a/app/styles/layout/us-detail.scss
+++ b/app/styles/layout/us-detail.scss
@@ -100,7 +100,7 @@
margin-top: .5rem;
a {
border-left: 1px solid $gray-light;
- padding: 0 .2rem;
+ padding: 0 .2rem;
}
a:hover {
color: $green-taiga;
@@ -357,6 +357,7 @@
.level-name {
color: darken($whitish, 20%);
float: right;
+ text-transform: lowercase;
}
}
diff --git a/app/styles/modules/admin/admin-functionalities.scss b/app/styles/modules/admin/admin-functionalities.scss
index 7f0a9d2d..9f0842fe 100644
--- a/app/styles/modules/admin/admin-functionalities.scss
+++ b/app/styles/modules/admin/admin-functionalities.scss
@@ -41,7 +41,7 @@
text-align: center;
}
}
- span {
+ .title {
@extend %bold;
display: block;
}
diff --git a/app/styles/modules/auth/cancel-account.scss b/app/styles/modules/auth/cancel-account.scss
index 52776464..7f3447f8 100644
--- a/app/styles/modules/auth/cancel-account.scss
+++ b/app/styles/modules/auth/cancel-account.scss
@@ -2,4 +2,12 @@
fieldset {
text-align: center;
}
+ p {
+ color: $grayer;
+ margin-bottom: .5rem;
+ text-align: center;
+ }
+ form {
+ margin-top: 1rem;
+ }
}
diff --git a/app/styles/modules/auth/change-email-form.scss b/app/styles/modules/auth/change-email-form.scss
new file mode 100644
index 00000000..5d88044c
--- /dev/null
+++ b/app/styles/modules/auth/change-email-form.scss
@@ -0,0 +1,13 @@
+.change-email-form {
+ fieldset {
+ text-align: center;
+ }
+ p {
+ color: $grayer;
+ margin-bottom: .5rem;
+ text-align: center;
+ }
+ form {
+ margin-top: 1rem;
+ }
+}
diff --git a/app/styles/modules/filters/filter-tags.scss b/app/styles/modules/filters/filter-tags.scss
deleted file mode 100644
index d640d9a7..00000000
--- a/app/styles/modules/filters/filter-tags.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.filter-tags {
- margin-top: 2rem;
- .filter-tag {
- color: $white;
- cursor: pointer;
- margin-bottom: 1rem;
- opacity: .5;
- padding: .5rem 1rem;
- position: relative;
- &.active {
- opacity: 1;
- }
- }
- .tag-count {
- background: none repeat scroll 0 0 rgba(0, 0, 0, .3);
- padding: .5rem 1rem;
- position: absolute;
- right: 0;
- top: 0;
- }
-}
diff --git a/bower.json b/bower.json
index 69a278e9..0b62786e 100644
--- a/bower.json
+++ b/bower.json
@@ -75,7 +75,10 @@
"pikaday": "~1.2.0",
"malihu-custom-scrollbar-plugin": "~3.0.4",
"raven-js": "~1.1.16",
- "l.js": "~0.1.0"
+ "l.js": "~0.1.0",
+ "angular-translate": "~2.6.1",
+ "angular-translate-loader-static-files": "~2.6.1",
+ "angular-translate-interpolation-messageformat": "~2.6.1"
},
"resolutions": {
"lodash": "~2.4.1",
diff --git a/gulpfile.js b/gulpfile.js
index 72ef3857..51d3a389 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -89,6 +89,8 @@ paths.libs = [
paths.app + "vendor/angular-route/angular-route.js",
paths.app + "vendor/angular-sanitize/angular-sanitize.js",
paths.app + "vendor/angular-animate/angular-animate.js",
+ paths.app + "vendor/angular-translate/angular-translate.js",
+ paths.app + "vendor/angular-translate-loader-static-files/angular-translate-loader-static-files.js",
paths.app + "vendor/i18next/i18next.js",
paths.app + "vendor/moment/min/moment-with-langs.js",
paths.app + "vendor/checksley/checksley.js",
@@ -259,10 +261,8 @@ gulp.task("app-loader", function() {
});
gulp.task("locales", function() {
- return gulp.src("app/locales/en/app.json")
- .pipe(wrap("angular.module('taigaBase').value('localesEn', <%= contents %>);", {}, {parse: false}))
- .pipe(rename("locales.en.js"))
- .pipe(gulp.dest(paths.tmp));
+ return gulp.src(paths.locales)
+ .pipe(gulp.dest(paths.dist + "locales"));
});
gulp.task("coffee", function() {
@@ -298,17 +298,13 @@ gulp.task("jslibs-deploy", function() {
});
gulp.task("app-watch", ["coffee", "plugins-js", "conf", "locales", "app-loader"], function() {
- var _paths = paths.js.concat(paths.tmp + "locales.en.js")
-
- return gulp.src(_paths)
+ return gulp.src(paths.js)
.pipe(concat("app.js"))
.pipe(gulp.dest(paths.dist + "js/"));
});
gulp.task("app-deploy", ["coffee", "plugins-js", "conf", "locales", "app-loader"], function() {
- var _paths = paths.js.concat(paths.tmp + "locales.en.js")
-
- return gulp.src(_paths)
+ return gulp.src(paths.js)
.pipe(sourcemaps.init())
.pipe(concat("app.js"))
.pipe(uglify({mangle:false, preserveComments: false}))
@@ -373,6 +369,7 @@ gulp.task("express", function() {
app.use("/partials", express.static(__dirname + "/dist/partials"));
app.use("/fonts", express.static(__dirname + "/dist/fonts"));
app.use("/plugins", express.static(__dirname + "/dist/plugins"));
+ app.use("/locales", express.static(__dirname + "/dist/locales"));
app.all("/*", function(req, res, next) {
//Just send the index.html for other files to support HTML5Mode
@@ -389,7 +386,7 @@ gulp.task("watch", function() {
gulp.watch(paths.svg, ["copy-svg"]);
gulp.watch(paths.coffee, ["app-watch"]);
gulp.watch(paths.libs, ["jslibs-watch"]);
- gulp.watch(paths.locales, ["app-watch"]);
+ gulp.watch(paths.locales, ["locales"]);
gulp.watch(paths.images, ["copy-images"]);
gulp.watch(paths.fonts, ["copy-fonts"]);
});
diff --git a/locales.js b/locales.js
new file mode 100644
index 00000000..76cec254
--- /dev/null
+++ b/locales.js
@@ -0,0 +1,175 @@
+var glob = require('glob')
+var inquirer = require('inquirer');
+var fs = require('fs');
+var _ = require('lodash');
+var Promise = require("bluebird");
+var clc = require('cli-color');
+
+var app = 'app/';
+
+var question = {
+ type: 'list',
+ name: 'command',
+ message: 'Action',
+ choices: [
+ {
+ name: 'Replace keys',
+ value: 'replace-keys'
+ },
+ {
+ name: 'Find duplicates',
+ value: 'find-duplicates'
+ }
+ ]
+};
+
+inquirer.prompt([question], function( answer ) {
+ if (answer.command === 'replace-keys') replaceKeys();
+ if (answer.command === 'find-duplicates') findDuplicates();
+});
+
+function replaceKeys() {
+ question()
+ .then(searchKey)
+ .then(printFiles)
+ .then(confirm)
+ .then(replace)
+
+
+ function question() {
+ return new Promise(function (resolve, reject) {
+ var questions = [
+ {
+ type: 'input',
+ message: 'Write the key',
+ name: 'find_key'
+ },
+ {
+ type: 'input',
+ message: 'Write the new key',
+ name: 'replace_key'
+ }
+ ];
+
+ inquirer.prompt(questions, function(answers) {
+ resolve({
+ answers: answers,
+ files: []
+ });
+ });
+ });
+ }
+
+ function searchKey(obj) {
+ return new Promise(function (resolve, reject) {
+ var key = obj.answers.find_key;
+
+ glob(app + '**/*.+(jade|coffee)', {}, function (er, files) {
+ obj.files = files.filter(function(filepath) {
+ var file = fs.readFileSync(filepath).toString('utf8');
+
+ return file.indexOf(key) !== -1;
+ });
+
+ resolve(obj);
+ });
+ });
+ }
+
+ function printFiles(obj) {
+ return new Promise(function (resolve, reject) {
+ obj.files.forEach(function(file) {
+ console.log(file);
+ });
+
+ resolve(obj);
+ });
+ }
+
+ function confirm(obj) {
+ return new Promise(function (resolve, reject) {
+ var questions = [
+ {
+ type: 'confirm',
+ message: 'Are you sure?',
+ name: 'sure'
+ }
+ ];
+
+ inquirer.prompt(questions, function(answer) {
+ if (answer.sure) {
+ resolve(obj);
+ } else {
+ reject('Cancel replace');
+ }
+ });
+ });
+ };
+
+ function replace(obj) {
+ obj.files.forEach(function(filepath) {
+ var file = fs.readFileSync(filepath).toString('utf8');
+ var re = new RegExp(obj.answers.find_key, 'g');
+
+ file = file.replace(re, obj.answers.replace_key);
+
+ fs.writeFile(filepath, file);
+ });
+ }
+}
+
+
+function findDuplicates() {
+ glob(app + 'locales/*.json', {}, function (er, files) {
+ files.forEach(duplicates);
+ });
+
+ function duplicates(file) {
+ var fileKeys = flatKeys(file);
+ var duplicates = [];
+ var value = '';
+ var values = _.values(fileKeys);
+
+ for (key in fileKeys) {
+ value = fileKeys[key];
+
+ if(duplicates.indexOf(value) !== -1) continue;
+
+ if (values.indexOf(value) !== values.lastIndexOf(value)) {
+ duplicates.push(value);
+
+ console.log(clc.red(value) + ' duplicate in ' + file);
+ }
+ }
+ }
+
+ function flatKeys(filepath) {
+ var locale = JSON.parse(fs.readFileSync(filepath).toString('utf8'));
+ return flatObject(locale);
+ }
+}
+
+
+function flatObject(data, path) {
+ var flat, keyWithPath, val;
+ var result = {};
+
+ if (!path) {
+ path = [];
+ }
+
+ for (var key in data) {
+ val = data[key];
+
+ if (typeof val === 'object') {
+ flat = flatObject(val, path.concat(key));
+
+ _.assign(result, flat);
+ } else {
+ keyWithPath = path.length ? ("" + path.join(".") + "." + key) : key;
+ result[keyWithPath] = val;
+ }
+ }
+
+ return result;
+};
diff --git a/main-sass.js b/main-sass.js
index 5ebdb49f..7d46c751 100644
--- a/main-sass.js
+++ b/main-sass.js
@@ -109,6 +109,7 @@ exports.files = function () {
'modules/auth/forgot-form',
'modules/auth/change-password-from-recovery',
'modules/auth/cancel-account',
+ 'modules/auth/change-email-form',
//Wiki modules
'modules/wiki/wiki-nav',
diff --git a/package.json b/package.json
index 0b5bd476..89c133c1 100644
--- a/package.json
+++ b/package.json
@@ -20,9 +20,12 @@
"scss-lint": "gulp scss-lint --fail"
},
"devDependencies": {
+ "bluebird": "^2.9.21",
+ "cli-color": "^0.3.3",
"coffee-script": "^1.9.1",
"del": "^1.1.1",
"express": "^4.12.0",
+ "glob": "^5.0.3",
"gulp": "^3.8.11",
"gulp-angular-templatecache": "^1.5.0",
"gulp-autoprefixer": "^2.1.0",
@@ -48,6 +51,7 @@
"gulp-template": "^3.0.0",
"gulp-uglify": "~1.1.0",
"gulp-wrap": "^0.11.0",
+ "inquirer": "^0.8.2",
"pre-commit": "^1.0.5",
"readable-stream": "~1.0.33",
"run-sequence": "^1.0.2",