Nov 11, 2011

Locale switching στο JHeadstart και στο ADF

Μια συνηθισμένη απαίτηση έχει να κάνει με τη δυνατότητα επιλογής γλωσσικού περιβάλλοντος (locale) σε μια ADF εφαρμογή. Μια τέτοια ενέργεια θα έχει ως αποτέλεσμα την κατάλληλη διαμόρφωση των λεκτικών στοιχείων (labels), ημερομηνιών, αριθμών και ενδεχομένως και δεδομένων (πχ λίστες τιμών) στο περιβάλλον επιλογής του χρήστη. Μου αρέσει πολύ η υποστήριξη αυτής της δυνατότητας από το JHeadstart δίχως να χρειαστεί να γράψουμε γραμμή κώδικα και πρόκειται να την παρουσιάσω καθώς είναι εξαιρετικά χρήσιμη και σε καθαρά ADF projects, αν απλά ανατρέξουμε στον πηγαίο κώδικα της υλοποίησης.

Πρώτα από όλα, την δυνατότητα επιλογής γλώσσας θα τη δίνουμε στους χρήστες μας κατά τη διάρκεια του login. Διαφορετικά μπλέκουμε σε καταστάσεις cancel edit και requery objects αν αυτοί βρίσκονται ήδη σε μια σελίδα με αλλαγές ή που παρουσιάζονται δεδομένα από φιλτραρισμένες λίστες με βάση το locale. Στη login.jspx, αντιγράφουμε κάτω από το πεδία username και password τον παρακάτω κώδικα από το templates/default/misc/file/menuGlobal.vm ώστε να προκύψει και ένα choice list για την επιλογή της γλώσσας. Διορθώνουμε μόνο την ιδιότητα labelAndAccessKey ώστε να ανταποκρίνεται στο λεκτικό της επιλογής μας:

<af:selectOneChoice id="localeSwitcher" immediate="true" autoSubmit="true"
labelAndAccessKey="${JHS.nls('Language','LANGUAGE_SELECTOR_LABEL')}"
valueChangeListener="#{jhsLocaleManager.changeLocale}"
value="#{jhsLocaleManager.currentLocale}">
<af:forEach items="#{jhsLocaleManager.supportedLocales}" var="row">
<af:selectItem value="#{row.locale}" label="#{row.description}"/>
</af:forEach>
</af:selectOneChoice>

Τώρα, ας ορίσουμε τις υποστηριζόμενες γλώσσες. Στο definition file του JHeadstart υπάρχουν οι ανάλογες ρυθμίσεις για το default locale, τα υπόλοιπα υποστηριζόμενα καθώς και τον τρόπο επιλογής του αρχικού.

Παράγοντας τις σελίδες, θα εμφανιστεί στο login και ο επιλογέας γλώσσας με εξ ορισμού τιμή αυτήν του browser μας. Ανάλογα με την επιλογή της γλώσσας, από εδώ και στο εξής στην πλοήγηση μας στην εφαρμογή θα εμφανίζονται τα αντίστοιχα μεταφρασμένα μηνύματα.

Αν θέλουμε επιπλέον να μεταφράσουμε και δεδομένα όπως λίστες τιμών που φιλτράρονται σύμφωνα με τη γλώσσα επιλογής, τότε θα χρειαστεί να δούμε λίγο τα ενδότερα του JHeadstart. Πιο συγκεκριμένα, στοιχεία του συνδεδεμένου χρήστη αποθηκεύονται σε μια session μεταβλητή ονόματι jhsUser (και τύπου: oracle.jheadstart.model.JhsUser) που περιλαμβάνει το πεδίο locale που παίρνει τιμές κατά το login μας (στο παράδειγμα μας 'en' ή 'el') Άρα μπορούμε να το χρησιμοποιήσουμε ως bind variable για φιλτράρισμα με expression της μορφής: adf.userSession.userData.jhsUser.locale.

No comments: