aboutsummaryrefslogtreecommitdiffstats
path: root/documentation/articles/RememberToTheSetTheLocale.asciidoc
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/articles/RememberToTheSetTheLocale.asciidoc')
-rw-r--r--documentation/articles/RememberToTheSetTheLocale.asciidoc183
1 files changed, 183 insertions, 0 deletions
diff --git a/documentation/articles/RememberToTheSetTheLocale.asciidoc b/documentation/articles/RememberToTheSetTheLocale.asciidoc
new file mode 100644
index 0000000000..042682e234
--- /dev/null
+++ b/documentation/articles/RememberToTheSetTheLocale.asciidoc
@@ -0,0 +1,183 @@
+[[remember-to-the-set-the-locale]]
+Remember to the set the locale
+------------------------------
+The Locale of an application or an individual component dictates the
+language and format used for displaying and parsing numbers and dates.
+This includes things like names of months, 12 or 24 hour time formats,
+the order of days and months in dates, and decimal separators in
+numbers.
+
+_Displaying_ values in a locale foreign to the user is bad enough.
+Forcing your users to _enter_ values in a foreign locale (such as
+decimal separator periods instead of commas, or vice versa) can be
+considered a cruel (although sadly not particularly unusual) punishment.
+
+A Vaadin application’s locale, if not explicitly set, defaults to the
+locale defined in the request headers sent by the browser , or, if
+that’s missing, the locale returned by `java.util.Locale.getDefault()`,
+which in turn is the default locale of the Java Virtual Machine, which
+depends on the configuration of the environment in which it happens to
+be running. Either way, chances are that the end result does not match
+what your users expect.
+
+[[per-component]]
+Per Component
+~~~~~~~~~~~~~
+
+Vaadin components have a *`setLocale()`* method that allows specifying
+the locale separately for each component.
+
+[source,java]
+....
+InlineDateField datePicker = new InlineDateField();
+datePicker.setLocale( java.util.Locale.CANADA_FRENCH );
+....
+
+[[inheritance]]
+Inheritance
+^^^^^^^^^^^
+
+A component _inherits its locale_ from its parent. So setting the locale
+on a component affects its nested children components by default.
+Remember that layouts and even the
+https://vaadin.com/api/7.2.5/com/vaadin/ui/UI.html[UI] (Vaadin 7) object
+are components too, so setting their locale affects their content.
+
+[[session-default]]
+Session Default
+~~~~~~~~~~~~~~~
+
+Instead of setting a locale for each individual component, you may set a
+Session-wide default. The components inherit that property. You may
+continue to override this session-default locale for individual
+components, where needed, with a call to `setLocale`.
+
+Setting the default locale changed between Vaadin 6 and 7.
+
+[[in-vaadin-6]]
+In Vaadin 6
+^^^^^^^^^^^
+
+In Vaadin 6, you set the locale by calling
+https://vaadin.com/api/6.8.9/com/vaadin/Application.html#setLocale(java.util.Locale)[`setLocale`]method
+on the
+https://vaadin.com/api/6.8.9/com/vaadin/Application.html[`Application`]
+object. See
+https://vaadin.com/book/vaadin6/-/page/advanced.global.html[chapter
+12.14 Accessing Session-Global Data] of the Book of Vaadin, Vaadin 6
+edition, for important information about accessing the Application
+object.
+
+[[in-vaadin-7]]
+In Vaadin 7
+^^^^^^^^^^^
+
+In Vaadin session, you must go through the current `VaadinSession`
+object to call `setLocale`. You may access that object in either of two
+ways:
+
+* Through that class’ static method `getCurrent` +
+* Jumping from a component object to a UI object to the current
+VaadinSession object.
+
+[[bug-workaround]]
+Bug & Workaround\\
+++++++++++++++++++
+
+Unfortunately, there is a bug (or design issue) in Vaadin 7. See
+http://dev.vaadin.com/ticket/12350[ticket 12350]. The problem is that
+setting the locale of the VaadinSession does not affect already existing
+UI objects. So, while the `init` method of your app's UI is the natural
+place to set the session's locale, doing so does not take effect in that
+current UI until after a page refresh.
+
+The *workaround* is to explicitly set the current UI object's locale, in
+addition to setting the VaadinSession object's locale. The first affects
+the current UI, while the second affects any future UI objects that may
+be instantiated in your app.
+
+This ( if in a UI object's "init" method)…
+
+[source,java]
+....
+Locale locale = Locale.CANADA_FRENCH;
+this.setLocale( locale ); // Call to affect this current UI. Workaround for bug: http://dev.vaadin.com/ticket/12350
+this.getSession().setLocale( locale ); // Affects only future UI instances, not current one because of bug. See workaround in line above.
+// VaadinSession.getCurrent().setLocale( locale ); // Alternative to "this.getSession".
+....
+
+…or this ( if not in a UI object, add "getUI()" )…
+
+[source,java]
+....
+Locale locale = Locale.CANADA_FRENCH;
+this.getUI().setLocale( locale ); // Call to affect this current UI. Workaround for bug: http://dev.vaadin.com/ticket/12350
+this.getUI().getSession().setLocale( locale ); // Affects only future UI instances, not current one because of bug. See workaround in line above.
+// VaadinSession.getCurrent().setLocale( locale ); // Alternative to "this.getSession".
+....
+
+[[example-app]]
+Example App
+^^^^^^^^^^^
+
+Here is source code for a complete Vaadin 7 example app.
+
+[source,java]
+....
+package com.example.vaadinexperiment;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.annotations.VaadinServletConfiguration;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.server.VaadinServlet;
+import com.vaadin.server.VaadinSession;
+import com.vaadin.ui.InlineDateField;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+import java.util.Locale;
+import javax.servlet.annotation.WebServlet;
+
+@Theme ( "mytheme" )
+@SuppressWarnings ( "serial" )
+public class MyVaadinUI extends UI
+{
+
+ @WebServlet ( value = "/*" , asyncSupported = true )
+ @VaadinServletConfiguration ( productionMode = false , ui = MyVaadinUI.class , widgetset = "com.example.vaadinexperiment.AppWidgetSet" )
+ public static class Servlet extends VaadinServlet
+ {
+ }
+
+ @Override
+ protected void init ( VaadinRequest request )
+ {
+ final VerticalLayout layout = new VerticalLayout();
+ layout.setMargin( true );
+ layout.setSpacing( true );
+ setContent( layout );
+
+ Locale locale = Locale.CANADA_FRENCH;
+ this.setLocale( locale ); // Call to affect this current UI. Workaround for bug: http://dev.vaadin.com/ticket/12350
+ this.getSession().setLocale( locale ); // Affects only future UI instances, not current one because of bug. See workaround in line above.
+ // VaadinSession.getCurrent().setLocale( locale ); // Alternative to "this.getSession".
+
+ InlineDateField datePicker = new InlineDateField();
+ datePicker.setCaption( "This component’s locale → defaults to parent’s, → which defaults to VaadinSession’s, → which defaults to JVM" );
+ layout.addComponent( datePicker );
+
+ InlineDateField datePickerFinnish = new InlineDateField();
+ datePickerFinnish.setCaption( "This component’s default locale is overridden for Finnish" );
+ datePickerFinnish.setLocale( new Locale( "fi" , "FI" ) );
+ layout.addComponent( datePickerFinnish );
+ }
+
+}
+....
+
+image:http://i.imgur.com/w9CViCR.png[Calendar]
+
+'''''
+
+Information here drawn from
+http://stackoverflow.com/q/16331112/642706[this StackOverflow.com
+question].