Skip to content

Commit

Permalink
Merge pull request #1658 from openboxes/1657-localization-api-overrid…
Browse files Browse the repository at this point in the history
…e-translations

#1657 Localization API should include custom translations from database
  • Loading branch information
jmiranda committed May 15, 2020
2 parents e02e41f + 168d657 commit 02d7bc2
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
package org.pih.warehouse.api

import grails.converters.JSON
import org.pih.warehouse.core.Localization

class LocalizationApiController {

Expand All @@ -21,15 +22,35 @@ class LocalizationApiController {
String languageCode = params.lang
String prefix = params.prefix

Locale locale = languageCode ? localizationService.getLocale(languageCode) : localizationService.getCurrentLocale()
Properties messagesProperties = localizationService.getMessagesProperties(locale)
String[] supportedLocales = grailsApplication.config.openboxes.locale.supportedLocales

def selectedMessages = prefix ? messagesProperties.findAll {
Locale defaultLocale = Locale.default
Locale currentLocale = localizationService.getCurrentLocale()
Locale selectedLocale = languageCode ? localizationService.getLocale(languageCode) : currentLocale

// Get the default message properties as well as the message properties for the selected locale
Properties defaultMessageProperties = localizationService.getMessagesProperties(defaultLocale)
Properties selectedMessageProperties = localizationService.getMessagesProperties(selectedLocale)

// Get all translations for the given prefix and locale from the database
List<Localization> localizedMessages = prefix ? Localization.findAllByCodeIlikeAndLocale("${prefix}%", selectedLocale.language) :
Localization.findAllByLocale(selectedLocale.language)
Properties customMessageProperties = new Properties()
localizedMessages.each { Localization localization ->
customMessageProperties.put(localization.code, localization.text)
}

// Merge all messages from default, selected, and custom message properties
Properties mergedMessageProperties = new Properties()
mergedMessageProperties.putAll(defaultMessageProperties)
mergedMessageProperties.putAll(selectedMessageProperties)
mergedMessageProperties.putAll(customMessageProperties)

Properties messageProperties = prefix ? mergedMessageProperties.findAll {
it.key.startsWith(prefix)
} : messagesProperties
} : mergedMessageProperties

render([messages: selectedMessages?.sort(), supportedLocales: supportedLocales, currentLocale: locale] as JSON)
render([messages: messageProperties?.sort(), supportedLocales: supportedLocales, currentLocale: selectedLocale] as JSON)
}

def read = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,22 @@ class LocalizationController {
def localizationInstanceList
def localizationInstanceTotal

if (params.q || params.locale) {
localizationInstanceList = Localization.createCriteria().list(params) {
if (params.locale) {
eq("locale", params.locale)
}
def defaultLocale = new Locale(grailsApplication.config.openboxes.locale.defaultLocale)
def currentLocale = session?.user?.locale ?: session.locale ?: defaultLocale
params.locale = params.locale ?: currentLocale?.language

localizationInstanceList = Localization.createCriteria().list(params) {
if (params.locale) {
eq("locale", params.locale)
}
if (params.q) {
or {
ilike("code", params.q + "%")
ilike("text", "%" + params.q + "%")
}
}
localizationInstanceTotal = localizationInstanceList.totalCount
} else {
localizationInstanceList = Localization.list(params)
localizationInstanceTotal = Localization.count()

}
localizationInstanceTotal = localizationInstanceList.totalCount

[localizationInstanceList: localizationInstanceList, localizationInstanceTotal: localizationInstanceTotal]
}
Expand Down Expand Up @@ -142,15 +142,15 @@ class LocalizationController {
redirect(action: "list", id: params.id)
}
} else {
flash.message = "${warehouse.message(code: 'default.not.found.message', args: [warehouse.message(code: 'localization.label', default: 'Localization'), params.id])}"
flash.message = "${warehouse.message(code: 'default.not.found.message', args: [warehouse.message(code: 'localization.label', default: 'Localization'), params.id])}"
redirect(action: "list")
}
}


def export = {
log.info("Locale: " + session.user.locale)
Locale locale = session.user.locale
Locale locale = params.locale ? new Locale(params.locale) : session.user.locale
def filename = locale.language == 'en' ? "messages.properties" : "messages_${locale.language}.properties"
def localizationInstanceList = Localization.findAllByLocale(locale.language)
response.setHeader("Content-disposition", "attachment; filename=\"${filename}\"")
Expand Down Expand Up @@ -210,4 +210,4 @@ class LocalizationCommand {
locale(nullable: false)
messageProperties(nullable: false)
}
}
}
51 changes: 33 additions & 18 deletions grails-app/i18n/messages_es.properties
Original file line number Diff line number Diff line change
@@ -1,10 +1,24 @@
# System messages
receiving.deprecation.message=The Receiving feature has been deprecated in favor of the Inbound Stock Movement feature
requisition.deprecation.message=The Requisition feature has been deprecated in favor of the Inbound Stock Movement feature
shipping.deprecation.message=The Shipping feature has been deprecated in favor of the Outbound Stock Movement feature
# Access messages
access.accessDenied.label=Acceso denegado
no.access.label=No access
access.accessDenied.message=Acceso a la acción <b>{0}</b> no se ha concedido al usuario <b>{1}</b>. \r\n Favor mande un email al administrador del sistema<b>{2}</b>.
# Action messages
action.not.found.message=Acción <b>{0}</b> no encontrada
# Add to Shipment Command
addToShipment.container.invalid=Por favor, seleccione una unidad de embalaje de expedición
# Address messages
address.label=Address
address.address.label=Street address
address.address2.label=Street address 2
address.city.label=City
address.stateOrProvince.label=State / Province
address.postalCode.label=Postal code
address.country.label=Country
address.description.label=Description
# Admin messages
admin.applicationVersion.label=versión de la aplicación
admin.debug.label=Modo de Debug
Expand All @@ -14,6 +28,7 @@ admin.environment.label=medio ambiente
admin.externalAppConfig.header=Configuración externa
admin.externalConfigFile.label=Archivo de configuración externa
admin.generalSettings.header=Configuración general
admin.backgroundJobs.header=Background Jobs
admin.grailsVersion.label=Versión de Grails
admin.hostname.label=Hostname
admin.label=Administración
Expand All @@ -23,6 +38,7 @@ admin.title=administrar la configuración de
admin.upgrade.title=actualización de la aplicación
admin.upgrade.label=actualización
# Application messages
application.branchName.label=Branch
application.buildDate.label=Fecha de producción
application.buildNumber.label=Número de compilación
application.environment.label=medio ambiente
Expand Down Expand Up @@ -230,8 +246,8 @@ default.data.label=datos
default.date.format=dd / MMM / aaaa hh: mm: ss
default.date.label=Fecha
default.dateCreated.label=Fecha de creación
De=default.dateFrom.label =
default.dateTo.label=para
default.dateFrom.label = Fecha de
default.dateTo.label=Fecha para
default.dates.label=Fecha
default.delete.label=Eliminar {0}
default.deleted.message={0} {1}
Expand Down Expand Up @@ -263,18 +279,18 @@ default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2
default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra dentro del rango de tamaños válido desde [{3}] a [{4}]
default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida
default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no pasa la validación personalizada
Artículo=default.item.label = Articulo por defecto
default.item.label = Articulo
default.items.label=Elementos
default.label=Por defecto
Defaultdefault.lastUpdated.label=Última Actualización
default.lastUpdated.label=Última Actualización
default.layout.label=Diseño
default.lbs.label=libras
default.list.label=Lista de {0}
default.locale.label=Configuración regional
default.login.label=Login
default.logout.label=Salir
default.lotSerialNo.label=Lot / Serial No
Administrar=default.manage.label = {0}
default.manage.label = Administrar {0}
default.month.oneMonth.label=un mes
default.month.sixMonths.label=seis meses
default.month.threeMonths.label=tres meses
Expand All @@ -298,7 +314,6 @@ default.not.found.message={0} no encontrado con ID {1}
default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no está dentro de la lista [{3}]
default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser único
default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo
Default.number.format=Numero por defecto
default.number.format=# # #, # # #, # # #
default.on.label=on
default.openboxes.label=openboxes
Expand Down Expand Up @@ -504,7 +519,7 @@ inventory.showTransactionLog.label=Mostrar historial de acciones
inventory.markAsSupported.label=Marcar como apoyo
inventory.markAsNonInventoried.label=Marcar como no inventariados
inventory.markAsNotSupported.label=Marcar como no apoyó
Inventario=#
# Inventario
inventory.addItem.label=Añadir artículo
inventory.addNewInventoryItem.message=Añadir un nuevo artículo de inventario para proceder.
inventory.addToShipments.label=Agregar a los traslados
Expand Down Expand Up @@ -618,7 +633,7 @@ inventoryItem.expires.label=Expira
inventoryItem.expiringStock.error=Stock actual expira en menos de 30 días
inventoryItem.expiringStock.info=Stock actual expira en 90 días
inventoryItem.expiringStock.warning=Stock actual expira en menos de 60 días
Cumplir=inventoryItem.fulfillQuantity.label = Cantidad
inventoryItem.fulfillQuantity.label = Cumplir Cantidad
inventoryItem.idealQuantity.info=stock actual es menor que la cantidad ideal de
inventoryItem.importSuccess.message=¡Enhorabuena! Ha importado inventario de {0}
inventoryItem.notValidXLSFile.message=Por favor elija un archivo XLS válido para importar.
Expand Down Expand Up @@ -679,7 +694,7 @@ locationTypes.label=Tipos Ubicación
# Usuario
login.password.label=contraseña
login.username.label=nombre de usuario
Nombres=Mes #
# Mes
month.short.1.label=Ene
month.short.2.label=Feb
month.short.3.label=Mar
Expand Down Expand Up @@ -740,21 +755,21 @@ order.orderedFor.label=Orden para
order.orderedFrom.label=Orden de
order.orderedOn.label=Pedido el
order.ordersInto.label=Órdenes en {0}
order.ordersPlacedBy.label=pedidos colocados <b> = por </b>
Los=pedidos colocados order.ordersPlacedWith.label = <b> con </b>
order.ordersPlacedBy.label=Los pedidos colocados por
order.ordersPlacedWith.label =Los pedidos colocados con
order.pending.label=Pendiente
order.pendingOrderLog.label=Órdenes Pendientes
order.placeOrder.label=Encargarlo
order.productReceived.label=Producto Recibido
order.qtyFulfilled.label=Cantidad cumplida
order.qtyOrdered.label=Cantidad Pedido
order.receiveOrder.label=Recibir orden
Recibido=order.received.label =
order.remaining.label=restante =
order.received.label = Recibido
order.remaining.label=Restante
order.selectItemsToReceive.label=Seleccionar elementos que reciben
order.shipmentItemErrors.message=embarque error = item (s)
order.shipmentType.label=tipo de envío
Los=envíos order.shipments.label =
order.shipments.label = Los envíos
order.status.label=Estado
order.summary.label=Resumen del pedido
order.thereAreNoSuppliers.label=No hay proveedores
Expand Down Expand Up @@ -789,7 +804,7 @@ package.quantity.label=Cantidad
package.uom.label=Unidad de medida
package.packageNotFound.message=No hay paquetes disponibles.
package.add.label=Añadir un nuevo paquete
Persona=mensajes #
# Mensajes de persona
person.label=Persona
persons.label=Personas
person.alreadyExists.message=<b> = {0} {1} </b> ya existe
Expand Down Expand Up @@ -892,7 +907,7 @@ productGroup.list.label=Mostrar grupos de productos
productReceived.nullable.orderItems=Producto = No existe
# Compra Workflow Orden
purchaseOrderWorkflow.label=Orden de compra
Recibo=mensajes #
# mensajes de recibo
receipt.actualDeliveryDate.invalid.mustOccurOnOrAfterActualShippingDate=Debe ocurrir en o después de la Fecha de envío reales
receipt.actualDeliveryDate.invalid.mustOccurOnOrBeforeToday=Debe ocurrir en o antes de hoy
receipt.inventoryItem.invalid=Debe hacer referencia a un artículo de inventario válido
Expand Down Expand Up @@ -950,7 +965,7 @@ report.runReport.label=Ejecutar informe
report.quantityBalance.label=Saldo
report.quantityChange.label=+ / -
report.quantityDelivered.label=Entregada
Recibido=report.quantityReceived.label =
report.quantityReceived.label = Recibido
report.quantityPerBox.label=Cantidad por caja
report.quantityOnHand.label=Cantidad en mano
report.quantityTotal.label=Cantidad
Expand Down Expand Up @@ -1060,7 +1075,7 @@ requisitionItem.previous.label=Anterior
requisitionItem.quantity.label=Cantidad
requisitionItem.requested.label=requerido
requisitionItem.type.label=Tipo
Pide=mensajes #
# Mensajes de peticiones
requests.label=Peticiones
# Correo envío
shipment.label=envío
Expand Down
2 changes: 1 addition & 1 deletion grails-app/taglib/org/pih/warehouse/MessageTagLib.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class MessageTagLib {
data-localized="${localized}"
src="${
createLinkTo(dir: 'images/icons/silk', file: image + '.png')
}" title="${localized}"/>
}" title="${attrs.code} = ${localized}"/>
"""

Expand Down
3 changes: 0 additions & 3 deletions grails-app/taglib/org/pih/warehouse/SelectTagLib.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -545,9 +545,6 @@ class SelectTagLib {
}

def selectLocale = { attrs, body ->
if (!attrs.value) {
attrs.value = session.user.locale?.language
}
attrs.from = grailsApplication.config.openboxes.locale.supportedLocales
attrs.optionValue = { new Locale(it).displayName }
out << g.select(attrs)
Expand Down
Loading

0 comments on commit 02d7bc2

Please sign in to comment.