Changer le langage d'affichage d'un objet externe ou du user public

Bonjour,
j’ai définie un objet externe avec une ressources “HTML” définie en anglais et en français.
L’objet est accessible via l’url “/ext/BCSIRCMPublicPortal”.
Mon problème est que cet élément est public et à l’affichage tous les textes sont en français.
Nous souhaiterions utiliser un paramètre ?LANG=EN afin de forcer la langue d’affichage.
Sur d’autres pages dont le rendu se fait via JS, nous avons utilisé un user technique tel que donné dans votre exemple de démo.
Comment pouvons-nous “forcer” un user dans le code java d’un objet externe ?

public class BCSIRCMPublicPortal extends ExternalObject {

	@Override
	public Object display(Parameters params) {
		BootstrapWebPage wp = new BootstrapWebPage(params.getRoot(), this.getDisplay(), false);
		wp.setFavicon(HTMLTool.getResourceIconURL(this, "FAVICON"));
		wp.appendHTML(HTMLTool.getResourceHTMLContent(this, "HTML"));
		
		return wp.toString();
	}
}

Merci d’avance
[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-07-15 15:54 (revision feb8ac7b88ad5561aef4e3026db18ff29510d249)
Encoding=UTF-8
EndpointIP=21.0.9.2
EndpointURL=http://3e9259cba6a2:8080
TimeZone=Europe/Paris
SystemDate=2020-07-21 16:01:42

La langue est liée au user connecté. Donc si c’est le user public dont on parle il faut le mettre dans la langue qui va bien.

S’il s’agit d’avoir une page multi-langue alors il faut passer par des users “techniques” distinct de public (qui par construction est mono langue), genre website_fra pour le français et website_enu pour l’anglais, etc.

A l’ouverture de la page vos choisissez alors le user en fonction de la langue du navigateur ou d’un paramètre de l’URL etc.

Bonjour,
merci pour votre retour.
Avoir des users spécifiques était bien la piste retenue.
Par contre, je ne trouve pas le code java à mettre dans l’objet externe pour lui “imposer” l’utilisateur.

Dans votre code serveur ça ne fait que créer un “squelette” de page HTML statique, j’imagine qu’il doit y avoir quelque part du Javascript qui interagit dynamiquement ? Est-ce le cas ?

NB: et si oui il aura mieux valu le mettre dans une resource JS qu’inliné dans la resource HTML

Les bon modèles pour une page publique qui utilise un user technique c’est les exemples de frontends de la démo, du plus simple au plus complexe:

C’est bien ce que nous avons fait dans le cas où la page est dynamique.
Dans le cas où la page est statique, nous voulions jouer sur les ressources de type HTML paramétré dans une langue.
Cela dit il reste le soucis du nom de l’onglet dans le navigateur.
Voici un autre exemple de page. Exactement comme la démo, la page est construite en js et on initialise le Simplicite.Ajax avec l’utilisateur technique désiré.

public class BCSIRCMPublicModificationRequest extends ExternalObject {
	private static final long serialVersionUID = 1L;

	/**
	 * Display method
	 * @param params Request parameters
	 */
	@Override
	public Object display(Parameters params) {
		// ZZZ IMPORTANT ZZZ Standalone page
		setDecoration(false);
		// Default Bootstrap page
		BootstrapWebPage wp = new BootstrapWebPage(params.getRoot(), this.getDisplay(), false);
		wp.appendCSSInclude(HTMLTool.getResourceCSSURL(this, "CSS"));

		wp.appendAjax();
		wp.appendJS("var ROOT = \"" + wp.getRoot() + "\";");
		
		wp.appendJSInclude(HTMLTool.getResourceJSURL(this, "SCRIPT"));
		wp.appendJSInclude(HTMLTool.getResourceJSURL(this, "OIDC"));
		wp.setReady("BCSIRCMPublicModificationRequest.init();");

		wp.setMenu("menu-brand", "<img id=\"logo\" src=\"" + HTMLTool.getResourceImageURL(this, "LOGO") + "\"/>", null, true, false, true);

		wp.appendHTML("<div id=\"success\" class=\"alert alert-success\" style=\"display: none;\"></div>");
		wp.appendHTML("<div id=\"error\" class=\"alert alert-danger\" style=\"display: none;\"></div>");
		wp.appendHTML("<div id=\"main\"></div>");
		wp.appendHTML("<div id=\"popup\" style=\"display: none;\"></div>");

		return wp.toString();
	}

Toutefois, le nom de l’onglet dans le navigateur est défini par l’instruction this.getDisplay() or à ce moment, le JS n’est pas chargé et la langue de la “session” actuelle est en français.

D’où ma question, lors du chargement de ce code java, est-il possible de lui changer la session pour que le code java utilise également un user technique ?
Si non, comment puis-je récupérer le libellé de mon objet externe dans une autre langue que celle du user public ?
Il n’existe donc aucun moyen d’imposer à la plateforme de charger des ressources d’un objet externe sur une langue précise ?

  1. Oui la ressource HTML incluse est celle dans la langue qui matche celle du user qui exécute le code de l’objet externe (i.e. le this.getGrant()), donc ici public. Pour avoir un corps HTML avec du contenu statique dans une langue arbitraire vous pouvez coté serveur explicitement charger une ressource HTML_FRA ou HTML_ENU etc. en fonction d’une langue passée paramètre HTTP ou autre et indépendamment de la langue du user public

  2. j’imagine qu’en Javascript il est facile de changer dynamiquement le contenu balise <title> du header HTML via le user technique (car c’est ça qui s’affiche dans le titre de l’onglet du navigateur), l’autre approche c’est, comme pour le corps HTML, de ne pas utiliser getDisplay() du user public mais un texte qui dépend d’une langue arbitraire

Le titre de l’onglet devait correspondre à la traduction de l’objet externe. Il me semble avoir vu dans différents posts qu’il n’y a pas de méthode “rapide” afin de la récupérer ?

La traduction de l’objet externe se récupère par le getDisplay() cette traduction n’étant ici que dans la langue du user qui exécute cet objet externe donc ici public.

Ici dans votre code vous avez choisi d’utiliser cette traduction de l’objet externe comme titre de la page, mais rien ne vous empeche de mettre autre chose, ex: new BootstrapWebPage(params.getRoot(), "Mon titre", false);. Et comme je le dit précédement vous pouvez donc faire en sorte que ce "Mon titre" soit dynamique en fonction d’une langue arbitrairement passée à la page

Merci pour votre retour. J’avais bien compris votre proposition.
Nous souhaitons toutefois éviter d’avoir du texte en “dur” et préférons passer par des textes paramétrables d’où l’utilisation de la traduction de l’objet.
Nous allons toutefois partir sur un texte statique contenant exactement le libellé de notre objet externe.
Merci quand même.

La traduction n’est malheureusement pas la bonne option ici car vous n’avez que la langue du user public à disposititon. Mais vous pouvez très utiliser des textes statiques paramétrables : getGrant().T("MY_TITLE_FRA") , mettez ces textes statiques dans la langue * (ANY) pour qu’ils soient accessible à tout utilisateur indépendamment de sa langue

1 Like

C’est vrai que disposer d’un paramètre de GET “lang” sur le user public est une très bonne idée.
ou utilisant des préférences local / navigator.language de l’utilisateur.

Autant les users identifiés ont une langue de préférence, autant les pages publiques n’en ont qu’une et c’est assez contraignant dans de nombreux cas d’internationalisation (le logon par exemple).

La difficulté est que Simplicité monte des sessions “mono-langue”, donc il faudra prévoir de créer 1 session “public” par langue…

1 Like

Une évolution pour charger un user “public” dans la langue de l’utilisateur non encore authentifié a été livrée en V5 :

  • il suffit de spécifier un paramètre _lang dans l’URL si on peut forcer le GET
  • sinon Simplicité utilisera le paramètre Accept-Language si présent dans le header HTTP (préférence de langues du navigateur et paramétrable par l’utilisateur en local)

Ca permet d’afficher par exemple la page de logon en français ou en anglais, puisque le logon utilise une session publique car non authentifiée en back par construction.