From 9af0cb49ccf55f6ada2a243df376d18f899e644e Mon Sep 17 00:00:00 2001 From: bthieurmel Date: Fri, 20 Mar 2020 11:01:49 +0100 Subject: [PATCH] auth_ui() : add choose_language --- NAMESPACE | 4 + NEWS.md | 2 + R/language.R | 367 ++++++++++++++++++----------------- R/module-auth.R | 59 +++++- R/secure-app.R | 14 +- R/shiny-utils.R | 8 + examples/demo/server.R | 1 + examples/demo/ui.R | 4 +- examples/module-auth.R | 4 +- examples/secure_app.R | 7 +- man/module-authentication.Rd | 8 +- man/secure-app.Rd | 9 +- 12 files changed, 292 insertions(+), 195 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index cc2cd51..a17a259 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -79,16 +79,20 @@ importFrom(shiny,reactiveVal) importFrom(shiny,reactiveValues) importFrom(shiny,reactiveValuesToList) importFrom(shiny,removeUI) +importFrom(shiny,renderUI) importFrom(shiny,req) importFrom(shiny,selectInput) importFrom(shiny,showModal) importFrom(shiny,showNotification) importFrom(shiny,tabPanel) importFrom(shiny,textInput) +importFrom(shiny,uiOutput) +importFrom(shiny,updateActionButton) importFrom(shiny,updateCheckboxInput) importFrom(shiny,updateDateRangeInput) importFrom(shiny,updateQueryString) importFrom(shiny,updateSelectInput) +importFrom(shiny,updateTextInput) importFrom(stats,setNames) importFrom(utils,getFromNamespace) importFrom(utils,modifyList) diff --git a/NEWS.md b/NEWS.md index 87df879..27b3a4e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,8 @@ * Add ``autofocus`` on username input. * Fix some (strange) bug with ``input$shinymanager_where`` * Fix `inputs_list` with some shiny version +* `auth_ui()` now accept a `choose_language` arguments. +* Rename `br` language into `pt-BR` (iso code) # shinymanager 1.0.200 diff --git a/R/language.R b/R/language.R index ca86121..4e8e9f6 100644 --- a/R/language.R +++ b/R/language.R @@ -1,6 +1,183 @@ .globals <- new.env(parent = emptyenv()) +.label_en = list( + "Please authenticate" = "Please authenticate", + "Username:" = "Username:", + "Password:" = "Password:", + "Login" = "Login", + "Username or password are incorrect" = "Username or password are incorrect", + "Your account has expired" = "Your account has expired", + "Please change your password" = "Please change your password", + "New password:" = "New password:", + "Confirm password:" = "Confirm password:", + "Update new password" = "Update new password", + "Password successfully updated! Please re-login" = "Password successfully updated! Please re-login", + "The two passwords are different" = "The two passwords are different", + "Failed to update password" = "Failed to update password", + "Logout" = "Logout", + "Go to application" = "Go to application", + "Administrator mode" = "Administrator mode", + "Add a user" = "Add a user", + "Failed to update user" = "Failed to update user", + "User successfully updated" = "User successfully updated", + "Cancel" = "Cancel", + "Confirm new user" = "Confirm new user", + "Confirm change" = "Confirm change", + "Are you sure to remove user(s): %s from the database ?" = "Are you sure to remove user(s): %s from the database ?", + "Delete user(s)" = "Delete user(s)", + "Edit user" = "Edit user", + "User already exist!" = "User already exist!", + "Dismiss" = "Dismiss", + "New user %s succesfully created!" = "New user %s succesfully created!", + "Ask to change password" = "Ask to change password", + "Confirm" = "Confirm", + "Ask %s to change password on next connection?" = "Ask %s to change password on next connection?", + "Change saved!" = "Change saved!", + "Failed to update the database" = "Failed to update the database", + "Password does not respect safety requirements" = "Password does not respect safety requirements", + "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6." = "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6.", + "Number of connections per user" = "Number of connections per user", + "Number of connections per day" = "Number of connections per day", + "Total number of connection" = "Total number of connection", + "You can\'t remove yourself!" = "You can\'t remove yourself!", + "User:" = "User:", + "Period:" = "Period:", + "Last week" = "Last week", + "Last month" = "Last month", + "All period" = "All period", + "Home" = "Home", + "Select all shown users" = "Select all shown users", + "Remove selected users" = "Remove selected users", + "Force selected users to change password" = "Force selected users to change password", + "Users" = "Users", + "Passwords" = "Passwords", + "Download logs database" = "Download logs database", + "Download SQL database" = "Download SQL database", + "Reset password for %s?" = "Reset password for %s?", + "Temporary password:" = "Temporary password:", + "Password succesfully reset!" = "Password succesfully reset!", + "You are not authorized for this application" = "You are not authorized for this application" +) + +.label_fr = list( + "Please authenticate" = "Veuillez vous authentifier", + "Username:" = "Nom d\'utilisateur :", + "Password:" = "Mot de passe :", + "Login" = "Se connecter", + "Username or password are incorrect" = "Nom d\'utilisateur ou mot de passe incorrect", + "Your account has expired" = "Votre compte a expir\u00e9", + "Please change your password" = "Veuillez changer votre mot de passe", + "New password:" = "Nouveau mot de passe :", + "Confirm password:" = "Confirmez le mot de passe :", + "Update new password" = "Mettre \u00e0 jour", + "Password successfully updated! Please re-login" = "Mot de passe modifi\u00e9! Veuillez vous reconnecter", + "The two passwords are different" = "Les deux mots de passe sont diff\u00e9rents", + "Failed to update password" = "Echec de la mise \u00e0 jour du mot de passe", + "Logout" = "Se d\u00e9connecter", + "Go to application" = "Aller \u00e0 l\'application", + "Administrator mode" = "Mode administrateur", + "Add a user" = "Ajouter un utilisateur", + "Failed to update user" = "Echec de la mise \u00e0 jour de l\'utilisateur", + "User successfully updated" = "Mise \u00e0 jour r\u00e9ussie", + "Cancel" = "Annuler", + "Confirm new user" = "Valider l\'ajout", + "Confirm change" = "Valider les modifications", + "Are you sure to remove user(s): %s from the database ?" = "Etes-vous s\u00fbr de vouloir supprimer %s de la base de donn\u00e9es ?", + "Delete user(s)" = "Supprimer l\'/les utilisateur(s)", + "Edit user" = "Modifier l\'utilisateur", + "User already exist!" = "L\'utilisateur existe d\u00e9j\u00e0", + "Dismiss" = "Fermer", + "New user %s succesfully created!" = "Nouvel utilisateur %s cr\u00e9\u00e9 avec succ\u00e8s !", + "Ask to change password" = "Demander \u00e0 changer le mot de passe", + "Confirm" = "Confirmer", + "Ask %s to change password on next connection?" = "Demander \u00e0 %s de changer son mot de passe \u00e0 la prochaine connexion ?", + "Change saved!" = "Changements sauvegard\u00e9s !", + "Failed to update the database" = "Une erreur s\'est produite", + "Password does not respect safety requirements" = "Le mot de passe ne respecte les r\u00e8gles de s\u00e9curit\u00e9", + "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6." = "Le mot de passe doit contenir au minimum un chiffre, une lettre majuscule, une lettre minuscule et doit \u00eatre au moins de longueur 6.", + "Number of connections per user" = "Nombre de connexions par utilisateur", + "Number of connections per day" = "Nombre de connexions par jour", + "Total number of connection" = "Nombre total de connexions", + "You can\'t remove yourself!" = "Vous ne pouvez pas supprimer votre propre compte!", + "User:" = "Utilisateur :", + "Period:" = "P\u00e9riode :", + "Last week" = "Semaine derni\u00e8re", + "Last month" = "Mois dernier", + "All period" = "P\u00e9riode enti\u00e8re", + "Home" = "Accueil", + "Select all shown users" = "S\u00e9lectionner tous les utilisateurs affich\u00e9s", + "Remove selected users" = "Supprimer les utilisateurs s\u00e9lectionn\u00e9s", + "Force selected users to change password" = "Forcer les utilisateurs s\u00e9l\u00e9ctionn\u00e9s \u00e0 changer de mot de passe", + "Users" = "Utilisateurs", + "Passwords" = "Mots de passe", + "Download logs database" = "T\u00e9l\u00e9charger les logs", + "Download SQL database" = "T\u00e9l\u00e9charger la base SQL", + "Reset password for %s?" = "R\u00e9initialiser le mot de passe de %s ?", + "Temporary password:" = "Mot de passe temporaire", + "Password succesfully reset!" = "Mot de passe r\u00e9initialis\u00e9", + "You are not authorized for this application" = "Vous n\'\u00eates pas habilit\u00e9 pour cette application" +) + +.label_ptbr = list( + "Please authenticate" = "Autentica\u00e7\u00e3o", + "Username:" = "Usu\u00e1rio:", + "Password:" = "Senha:", + "Login" = "Conectar", + "Username or password are incorrect" = "Usu\u00e1rio ou senha incorreto", + "Your account has expired" = "Sua conta expirou", + "Please change your password" = "Por favor, mude sua senha", + "New password:" = "Nova senha:", + "Confirm password:" = "Confirmar nova senha:", + "Update new password" = "Atualizar nova senha", + "Password successfully updated! Please re-login" = "Senha alterada com sucesso! Por favor, autentique-se novamente", + "The two passwords are different" = "As duas senhas s\u00e3o diferentes", + "Failed to update password" = "Falha em atualizar a senha", + "Logout" = "Desconectar", + "Go to application" = "Ir \u00e0 aplica\u00e7\u00e3o", + "Administrator mode" = "Modo administrador", + "Add a user" = "Adicionar usu\u00e1rio", + "Failed to update user" = "Falha em atualizar usu\u00e1rio", + "User successfully updated" = "Usu\u00e1rio atualizado com sucesso", + "Cancel" = "Cancelas", + "Confirm new user" = "Confirmar novo usu\u00e1rio", + "Confirm change" = "Confirmar mudan\u00e7a", + "Are you sure to remove user(s): %s from the database ?" = "Tem certeza que deseja remover o(s) usu\u00e1rio(s) %s do banco de dados?", + "Delete user(s)" = "Deletar usu\u00e1rio(s)", + "Edit user" = "Modificar usu\u00e1rio", + "User already exist!" = "O usu\u00e1rio j\u00e1 existe!", + "Dismiss" = "Fechar", + "New user %s succesfully created!" = "Novo usu\u00e1rio %s criado com sucesso!", + "Ask to change password" = "Pedir para alterar a senha", + "Confirm" = "Confirmar", + "Ask %s to change password on next connection?" = "Pedir a %s para alterar a senha na pr\u00f3xima conex\u00e3o?", + "Change saved!" = "Mudan\u00e7as salvas!", + "Failed to update the database" = "Erro em atualizar o banco de dados", + "Password does not respect safety requirements" = "Senha n\u00e3o conforme com as exig\u00eancias de seguran\u00e7a", + "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6." = "A senha deve conter pelo menos um n\u00famero, uma letra min\u00fascula, uma letra mai\u00fascula e deve ter pelo menos 6 caracteres", + "Number of connections per user" = "N\u00famero de conex\u00f5es por usu\u00e1rio", + "Number of connections per day" = "N\u00famero de conex\u00f5es por dia", + "Total number of connection" = "N\u00famero total de conex\u00f5es", + "You can\'t remove yourself!" = "Voc\u00ea n\u00e3o pode se remover!", + "User:" = "Usu\u00e1rio:", + "Period:" = "Per\u00edodo:", + "Last week" = "Semana passada", + "Last month" = "M\u00eas passado", + "All period" = "Todo per\u00edodo", + "Home" = "In\u00edcio", + "Select all shown users" = "Selecionar todos os usu\u00e1rios mostrados", + "Remove selected users" = "Remover usu\u00e1rios selecionados", + "Force selected users to change password" = "For\u00e7ar usu\u00e1rio selecionado a mudar a senha", + "Users" = "Usu\u00e1rios", + "Passwords" = "Senhas", + "Download logs database" = "Fazer download dos logs do banco de dados", + "Download SQL database" = "Fazer download do banco de dados SQL", + "Reset password for %s?" = "Resetar a senha de %s?", + "Temporary password:" = "Senha tempor\u00e1ria", + "Password succesfully reset!" = "Senha resetada com sucesso!", + "You are not authorized for this application" = "Voc\u00ea n\u00e3o est\u00e1 autorizado a utilizar esse aplicativo" +) + #' @importFrom R6 R6Class #' @importFrom utils modifyList language <- R6::R6Class( @@ -35,186 +212,22 @@ language <- R6::R6Class( }, get_DT = function() { private$DT_lan[[private$language]] + }, + get_language_registered = function() { + private$language_registered + }, + get_language = function() { + private$language } ), private = list( language = "en", - language_registered = c("en", "fr", "br"), - labels = list( - "Please authenticate" = "Please authenticate", - "Username:" = "Username:", - "Password:" = "Password:", - "Login" = "Login", - "Username or password are incorrect" = "Username or password are incorrect", - "Your account has expired" = "Your account has expired", - "Please change your password" = "Please change your password", - "New password:" = "New password:", - "Confirm password:" = "Confirm password:", - "Update new password" = "Update new password", - "Password successfully updated! Please re-login" = "Password successfully updated! Please re-login", - "The two passwords are different" = "The two passwords are different", - "Failed to update password" = "Failed to update password", - "Logout" = "Logout", - "Go to application" = "Go to application", - "Administrator mode" = "Administrator mode", - "Add a user" = "Add a user", - "Failed to update user" = "Failed to update user", - "User successfully updated" = "User successfully updated", - "Cancel" = "Cancel", - "Confirm new user" = "Confirm new user", - "Confirm change" = "Confirm change", - "Are you sure to remove user(s): %s from the database ?" = "Are you sure to remove user(s): %s from the database ?", - "Delete user(s)" = "Delete user(s)", - "Edit user" = "Edit user", - "User already exist!" = "User already exist!", - "Dismiss" = "Dismiss", - "New user %s succesfully created!" = "New user %s succesfully created!", - "Ask to change password" = "Ask to change password", - "Confirm" = "Confirm", - "Ask %s to change password on next connection?" = "Ask %s to change password on next connection?", - "Change saved!" = "Change saved!", - "Failed to update the database" = "Failed to update the database", - "Password does not respect safety requirements" = "Password does not respect safety requirements", - "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6." = "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6.", - "Number of connections per user" = "Number of connections per user", - "Number of connections per day" = "Number of connections per day", - "Total number of connection" = "Total number of connection", - "You can\'t remove yourself!" = "You can\'t remove yourself!", - "User:" = "User:", - "Period:" = "Period:", - "Last week" = "Last week", - "Last month" = "Last month", - "All period" = "All period", - "Home" = "Home", - "Select all shown users" = "Select all shown users", - "Remove selected users" = "Remove selected users", - "Force selected users to change password" = "Force selected users to change password", - "Users" = "Users", - "Passwords" = "Passwords", - "Download logs database" = "Download logs database", - "Download SQL database" = "Download SQL database", - "Reset password for %s?" = "Reset password for %s?", - "Temporary password:" = "Temporary password:", - "Password succesfully reset!" = "Password succesfully reset!", - "You are not authorized for this application" = "You are not authorized for this application" - ), + language_registered = c("en", "fr", "pt-BR"), + labels = .label_en, labels_lan = list( - fr = list( - "Please authenticate" = "Veuillez vous authentifier", - "Username:" = "Nom d\'utilisateur :", - "Password:" = "Mot de passe :", - "Login" = "Se connecter", - "Username or password are incorrect" = "Nom d\'utilisateur ou mot de passe incorrect", - "Your account has expired" = "Votre compte a expir\u00e9", - "Please change your password" = "Veuillez changer votre mot de passe", - "New password:" = "Nouveau mot de passe :", - "Confirm password:" = "Confirmez le mot de passe :", - "Update new password" = "Mettre \u00e0 jour", - "Password successfully updated! Please re-login" = "Mot de passe modifi\u00e9! Veuillez vous reconnecter", - "The two passwords are different" = "Les deux mots de passe sont diff\u00e9rents", - "Failed to update password" = "Echec de la mise \u00e0 jour du mot de passe", - "Logout" = "Se d\u00e9connecter", - "Go to application" = "Aller \u00e0 l\'application", - "Administrator mode" = "Mode administrateur", - "Add a user" = "Ajouter un utilisateur", - "Failed to update user" = "Echec de la mise \u00e0 jour de l\'utilisateur", - "User successfully updated" = "Mise \u00e0 jour r\u00e9ussie", - "Cancel" = "Annuler", - "Confirm new user" = "Valider l\'ajout", - "Confirm change" = "Valider les modifications", - "Are you sure to remove user(s): %s from the database ?" = "Etes-vous s\u00fbr de vouloir supprimer %s de la base de donn\u00e9es ?", - "Delete user(s)" = "Supprimer l\'/les utilisateur(s)", - "Edit user" = "Modifier l\'utilisateur", - "User already exist!" = "L\'utilisateur existe d\u00e9j\u00e0", - "Dismiss" = "Fermer", - "New user %s succesfully created!" = "Nouvel utilisateur %s cr\u00e9\u00e9 avec succ\u00e8s !", - "Ask to change password" = "Demander \u00e0 changer le mot de passe", - "Confirm" = "Confirmer", - "Ask %s to change password on next connection?" = "Demander \u00e0 %s de changer son mot de passe \u00e0 la prochaine connexion ?", - "Change saved!" = "Changements sauvegard\u00e9s !", - "Failed to update the database" = "Une erreur s\'est produite", - "Password does not respect safety requirements" = "Le mot de passe ne respecte les r\u00e8gles de s\u00e9curit\u00e9", - "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6." = "Le mot de passe doit contenir au minimum un chiffre, une lettre majuscule, une lettre minuscule et doit \u00eatre au moins de longueur 6.", - "Number of connections per user" = "Nombre de connexions par utilisateur", - "Number of connections per day" = "Nombre de connexions par jour", - "Total number of connection" = "Nombre total de connexions", - "You can\'t remove yourself!" = "Vous ne pouvez pas supprimer votre propre compte!", - "User:" = "Utilisateur :", - "Period:" = "P\u00e9riode :", - "Last week" = "Semaine derni\u00e8re", - "Last month" = "Mois dernier", - "All period" = "P\u00e9riode enti\u00e8re", - "Home" = "Accueil", - "Select all shown users" = "S\u00e9lectionner tous les utilisateurs affich\u00e9s", - "Remove selected users" = "Supprimer les utilisateurs s\u00e9lectionn\u00e9s", - "Force selected users to change password" = "Forcer les utilisateurs s\u00e9l\u00e9ctionn\u00e9s \u00e0 changer de mot de passe", - "Users" = "Utilisateurs", - "Passwords" = "Mots de passe", - "Download logs database" = "T\u00e9l\u00e9charger les logs", - "Download SQL database" = "T\u00e9l\u00e9charger la base SQL", - "Reset password for %s?" = "R\u00e9initialiser le mot de passe de %s ?", - "Temporary password:" = "Mot de passe temporaire", - "Password succesfully reset!" = "Mot de passe r\u00e9initialis\u00e9", - "You are not authorized for this application" = "Vous n\'\u00eates pas habilit\u00e9 pour cette application" - ), - br = list( - "Please authenticate" = "Autentica\u00e7\u00e3o", - "Username:" = "Usu\u00e1rio:", - "Password:" = "Senha:", - "Login" = "Conectar", - "Username or password are incorrect" = "Usu\u00e1rio ou senha incorreto", - "Your account has expired" = "Sua conta expirou", - "Please change your password" = "Por favor, mude sua senha", - "New password:" = "Nova senha:", - "Confirm password:" = "Confirmar nova senha:", - "Update new password" = "Atualizar nova senha", - "Password successfully updated! Please re-login" = "Senha alterada com sucesso! Por favor, autentique-se novamente", - "The two passwords are different" = "As duas senhas s\u00e3o diferentes", - "Failed to update password" = "Falha em atualizar a senha", - "Logout" = "Desconectar", - "Go to application" = "Ir \u00e0 aplica\u00e7\u00e3o", - "Administrator mode" = "Modo administrador", - "Add a user" = "Adicionar usu\u00e1rio", - "Failed to update user" = "Falha em atualizar usu\u00e1rio", - "User successfully updated" = "Usu\u00e1rio atualizado com sucesso", - "Cancel" = "Cancelas", - "Confirm new user" = "Confirmar novo usu\u00e1rio", - "Confirm change" = "Confirmar mudan\u00e7a", - "Are you sure to remove user(s): %s from the database ?" = "Tem certeza que deseja remover o(s) usu\u00e1rio(s) %s do banco de dados?", - "Delete user(s)" = "Deletar usu\u00e1rio(s)", - "Edit user" = "Modificar usu\u00e1rio", - "User already exist!" = "O usu\u00e1rio j\u00e1 existe!", - "Dismiss" = "Fechar", - "New user %s succesfully created!" = "Novo usu\u00e1rio %s criado com sucesso!", - "Ask to change password" = "Pedir para alterar a senha", - "Confirm" = "Confirmar", - "Ask %s to change password on next connection?" = "Pedir a %s para alterar a senha na pr\u00f3xima conex\u00e3o?", - "Change saved!" = "Mudan\u00e7as salvas!", - "Failed to update the database" = "Erro em atualizar o banco de dados", - "Password does not respect safety requirements" = "Senha n\u00e3o conforme com as exig\u00eancias de seguran\u00e7a", - "Password must contain at least one number, one lowercase, one uppercase and must be at least length 6." = "A senha deve conter pelo menos um n\u00famero, uma letra min\u00fascula, uma letra mai\u00fascula e deve ter pelo menos 6 caracteres", - "Number of connections per user" = "N\u00famero de conex\u00f5es por usu\u00e1rio", - "Number of connections per day" = "N\u00famero de conex\u00f5es por dia", - "Total number of connection" = "N\u00famero total de conex\u00f5es", - "You can\'t remove yourself!" = "Voc\u00ea n\u00e3o pode se remover!", - "User:" = "Usu\u00e1rio:", - "Period:" = "Per\u00edodo:", - "Last week" = "Semana passada", - "Last month" = "M\u00eas passado", - "All period" = "Todo per\u00edodo", - "Home" = "In\u00edcio", - "Select all shown users" = "Selecionar todos os usu\u00e1rios mostrados", - "Remove selected users" = "Remover usu\u00e1rios selecionados", - "Force selected users to change password" = "For\u00e7ar usu\u00e1rio selecionado a mudar a senha", - "Users" = "Usu\u00e1rios", - "Passwords" = "Senhas", - "Download logs database" = "Fazer download dos logs do banco de dados", - "Download SQL database" = "Fazer download do banco de dados SQL", - "Reset password for %s?" = "Resetar a senha de %s?", - "Temporary password:" = "Senha tempor\u00e1ria", - "Password succesfully reset!" = "Senha resetada com sucesso!", - "You are not authorized for this application" = "Voc\u00ea n\u00e3o est\u00e1 autorizado a utilizar esse aplicativo" - ) + en = .label_en, + fr = .label_fr, + `pt-BR` = .label_ptbr ), DT_lan = list( fr = list( @@ -258,7 +271,7 @@ language <- R6::R6Class( sSortDescending = ": activate to sort column descending" ) ), - br = list( + `pt-BR` = list( sEmptyTable = "Nenhum dado dispon\u00edvel na tabela", sInfo = "Mostrando entrada de _START_ at\u00e9 _END_ de um total de _TOTAL_ entradas", sInfoEmpty = "Mostrando entrada de 0 at\u00e9 0 de um total de 0 entradas", @@ -294,9 +307,7 @@ use_language <- function() { .globals$language } set_language <- function(lan) { - if (!identical(lan, "en")) { lan_set <- language$new() lan_set$set_language(lan) - } } diff --git a/R/module-auth.R b/R/module-auth.R index 430b276..6943458 100644 --- a/R/module-auth.R +++ b/R/module-auth.R @@ -8,6 +8,8 @@ #' @param tags_top A \code{tags (div, img, ...)} to be displayed on top of the authentication module. #' @param tags_bottom A \code{tags (div, img, ...)} to be displayed on bottom of the authentication module. #' @param background A optionnal \code{css} for authentication background. See example. +#' @param choose_language \code{logical/character}. Add language selection on top ? TRUE for all supported languages +#' or a vector of possibilities like \code{c("fr", "en")}. If enabled, \code{input$shinymanager_language} is created #' @param ... : Used for old version compatibility. #' #' @@ -16,11 +18,12 @@ #' @name module-authentication #' #' @importFrom htmltools tagList tags singleton -#' @importFrom shiny NS fluidRow column textInput passwordInput actionButton +#' @importFrom shiny NS fluidRow column textInput passwordInput actionButton uiOutput #' #' @example examples/module-auth.R auth_ui <- function(id, status = "primary", tags_top = NULL, - tags_bottom = NULL, background = NULL, ...) { + tags_bottom = NULL, background = NULL, + choose_language = NULL, ...) { ns <- NS(id) @@ -55,10 +58,35 @@ auth_ui <- function(id, status = "primary", tags_top = NULL, class = paste0("panel panel-", status), tags$div( class = "panel-body", + if (!is.null(choose_language)){ + choices = NULL + if(is.logical(choose_language) && choose_language){ + choices = lan$get_language_registered() + } else if(is.character(choose_language)){ + choices = unique(c(intersect(choose_language, lan$get_language_registered()), lan$get_language())) + } + + if(length(choices) > 1){ + selected = ifelse(lan$get_language() %in% choices, + lan$get_language(), + choices[1]) + + tags$div( + style = "text-align: left; font-size: 12px;", + selectInput( + inputId = ns("language"), + label = NULL, + choices = choices, + selected = selected, + width = "20%" + ) + ) + } + }, tags$div( style = "text-align: center;", if (!is.null(tags_top)) tags_top, - tags$h3(lan$get("Please authenticate")) + uiOutput(ns("auth_title")) ), tags$br(), textInput( @@ -83,7 +111,8 @@ auth_ui <- function(id, status = "primary", tags_top = NULL, sprintf("bindEnter('%s');", ns("")) ), tags$div(id = ns("result_auth")), - if (!is.null(tags_bottom)) tags$hr(), tags_bottom + if (!is.null(tags_bottom)) tags$hr(), tags_bottom, + uiOutput(ns("update_shinymanager_language")) ) ) ) @@ -113,7 +142,7 @@ auth_ui <- function(id, status = "primary", tags_top = NULL, #' } #' #' @importFrom htmltools tags -#' @importFrom shiny reactiveValues observeEvent removeUI updateQueryString insertUI icon +#' @importFrom shiny reactiveValues observeEvent removeUI updateQueryString insertUI icon updateActionButton updateTextInput renderUI #' @importFrom stats setNames auth_server <- function(input, output, session, check_credentials, use_token = FALSE) { @@ -131,6 +160,26 @@ auth_server <- function(input, output, session, check_credentials, use_token = F lan <- use_language() + auth_title <- reactiveVal(lan$get("Please authenticate")) + observe({ + if(!is.null(input$language)){ + lan$set_language(input$language) + updateTextInput(session, inputId = "user_id", label = lan$get("Username:")) + updateTextInput(session, inputId = "user_pwd", label = lan$get("Password:")) + updateActionButton(session, inputId = "go_auth", label = lan$get("Login")) + + auth_title(lan$get("Please authenticate")) + + output$update_shinymanager_language <- renderUI({ + shinymanager_language(lan$get_language()) + }) + } + }) + + output$auth_title <- renderUI({ + tags$h3(auth_title()) + }) + authentication <- reactiveValues(result = FALSE, user = NULL, user_info = NULL) observeEvent(input$go_auth, { diff --git a/R/secure-app.R b/R/secure-app.R index 3f051c5..807c64b 100644 --- a/R/secure-app.R +++ b/R/secure-app.R @@ -10,7 +10,7 @@ #' @param theme Alternative Bootstrap stylesheet, default is to use \code{readable}, #' you can use themes provided by \code{shinythemes}. #' It will affect the authentication panel and the admin page. -#' @param language Language to use for labels, supported values are : "en", "fr", "br". +#' @param language Language to use for labels, supported values are : "en", "fr", "pt-BR". #' #' @note A special input value will be accessible server-side with \code{input$shinymanager_where} #' to know in which step user is : authentication, application, admin or password. @@ -26,8 +26,8 @@ #' #' @example examples/secure_app.R secure_app <- function(ui, ..., enable_admin = FALSE, head_auth = NULL, theme = NULL, language = "en") { - if (!language %in% c("en", "fr", "br")) { - warning("Only supported language for the now are: en, fr, br", call. = FALSE) + if (!language %in% c("en", "fr", "pt-BR")) { + warning("Only supported language for the now are: en, fr, pt-BR", call. = FALSE) language <- "en" } set_language(language) @@ -53,7 +53,8 @@ secure_app <- function(ui, ..., enable_admin = FALSE, head_auth = NULL, theme = theme = theme, tags$head(head_auth), do.call(pwd_ui, args), - shinymanager_where("password") + shinymanager_where("password"), + shinymanager_language(lan$get_language()) ) return(pwd_ui) } @@ -82,7 +83,8 @@ secure_app <- function(ui, ..., enable_admin = FALSE, head_auth = NULL, theme = title = tagList(icon("home"), lan$get("Home")), value = "home", admin_ui("admin"), - shinymanager_where("admin") + shinymanager_where("admin"), + shinymanager_language(lan$get_language()) ), tabPanel( title = "Logs", @@ -123,7 +125,7 @@ secure_app <- function(ui, ..., enable_admin = FALSE, head_auth = NULL, theme = ui <- ui(request) } tagList( - ui, menu, shinymanager_where("application"), + ui, menu, shinymanager_where("application"), shinymanager_language(lan$get_language()), singleton(tags$head(tags$script(src = "shinymanager/timeout.js"))) ) } diff --git a/R/shiny-utils.R b/R/shiny-utils.R index f3443b9..0e77565 100644 --- a/R/shiny-utils.R +++ b/R/shiny-utils.R @@ -28,6 +28,14 @@ shinymanager_where <- function(where) { ) } +shinymanager_language <- function(lan) { + tags$div( + style = "display: none;", + selectInput(inputId = "shinymanager_language", label = NULL, + choices = lan, selected = lan, multiple = TRUE) + ) +} + # Remove the whole query string #' @importFrom shiny updateQueryString getDefaultReactiveDomain diff --git a/examples/demo/server.R b/examples/demo/server.R index 23afc71..0f32afc 100644 --- a/examples/demo/server.R +++ b/examples/demo/server.R @@ -22,6 +22,7 @@ function(input, output, session) { observe({ print(input$shinymanager_where) + print(input$shinymanager_language) }) output$res_auth <- renderPrint({ diff --git a/examples/demo/ui.R b/examples/demo/ui.R index 04bc213..724a4e0 100644 --- a/examples/demo/ui.R +++ b/examples/demo/ui.R @@ -23,6 +23,8 @@ ui <- fluidPage( # Call UI inside secure_app() secure_app( ui = ui, - enable_admin = TRUE + enable_admin = TRUE, + language = "fr", + choose_language = c("en") ) diff --git a/examples/module-auth.R b/examples/module-auth.R index 686b9b1..bc48c93 100644 --- a/examples/module-auth.R +++ b/examples/module-auth.R @@ -36,9 +36,11 @@ if (interactive()) { ) ), # change auth ui background ? + # https://developer.mozilla.org/fr/docs/Web/CSS/background background = "linear-gradient(rgba(0, 0, 255, 0.5), rgba(255, 255, 0, 0.5)), - url('https://www.r-project.org/logo/Rlogo.png');" + url('https://www.r-project.org/logo/Rlogo.png');", + choose_language = TRUE ), # result of authentication diff --git a/examples/secure_app.R b/examples/secure_app.R index 070b0aa..059581f 100644 --- a/examples/secure_app.R +++ b/examples/secure_app.R @@ -16,7 +16,7 @@ if (interactive()) { ) # Wrap your UI with secure_app - ui <- secure_app(ui) + ui <- secure_app(ui, choose_language = TRUE) # change auth ui background ? # ui <- secure_app(ui, @@ -36,6 +36,11 @@ if (interactive()) { reactiveValuesToList(res_auth) }) + observe({ + print(input$shinymanager_where) + print(input$shinymanager_language) + }) + # your classic server logic } diff --git a/man/module-authentication.Rd b/man/module-authentication.Rd index fea779d..5edb25c 100644 --- a/man/module-authentication.Rd +++ b/man/module-authentication.Rd @@ -12,6 +12,7 @@ auth_ui( tags_top = NULL, tags_bottom = NULL, background = NULL, + choose_language = NULL, ... ) @@ -30,6 +31,9 @@ Valid status are: \code{"default"}, \code{"primary"}, \code{"success"}, \item{background}{A optionnal \code{css} for authentication background. See example.} +\item{choose_language}{\code{logical/character}. Add language selection on top ? TRUE for all supported languages +or a vector of possibilities like \code{c("fr", "en")}. If enabled, \code{input$shinymanager_language} is created} + \item{...}{: Used for old version compatibility.} \item{input, output, session}{Standard Shiny server arguments.} @@ -91,9 +95,11 @@ if (interactive()) { ) ), # change auth ui background ? + # https://developer.mozilla.org/fr/docs/Web/CSS/background background = "linear-gradient(rgba(0, 0, 255, 0.5), rgba(255, 255, 0, 0.5)), - url('https://www.r-project.org/logo/Rlogo.png');" + url('https://www.r-project.org/logo/Rlogo.png');", + choose_language = TRUE ), # result of authentication diff --git a/man/secure-app.Rd b/man/secure-app.Rd index aaa71bd..787ee9c 100644 --- a/man/secure-app.Rd +++ b/man/secure-app.Rd @@ -37,7 +37,7 @@ of the authentication page (for custom CSS for example).} you can use themes provided by \code{shinythemes}. It will affect the authentication panel and the admin page.} -\item{language}{Language to use for labels, supported values are : "en", "fr", "br".} +\item{language}{Language to use for labels, supported values are : "en", "fr", "pt-BR".} \item{check_credentials}{Function passed to \code{\link{auth_server}}.} @@ -94,7 +94,7 @@ if (interactive()) { ) # Wrap your UI with secure_app - ui <- secure_app(ui) + ui <- secure_app(ui, choose_language = TRUE) # change auth ui background ? # ui <- secure_app(ui, @@ -114,6 +114,11 @@ if (interactive()) { reactiveValuesToList(res_auth) }) + observe({ + print(input$shinymanager_where) + print(input$shinymanager_language) + }) + # your classic server logic }