diff --git a/user/src/com/google/gwt/i18n/client/LocaleInfo.java b/user/src/com/google/gwt/i18n/client/LocaleInfo.java
index 1eb9ca8..dac341e 100644
--- a/user/src/com/google/gwt/i18n/client/LocaleInfo.java
+++ b/user/src/com/google/gwt/i18n/client/LocaleInfo.java
@@ -85,7 +85,14 @@
      */
     return instance.infoImpl.getLocaleNativeDisplayName(localeName);
   }
-  
+
+  /**
+   * @return true if any locale supported by this build of the app is RTL.
+   */
+  public static boolean hasAnyRTL() {
+    return instance.infoImpl.hasAnyRTL();
+  }
+
   private final LocaleInfoImpl infoImpl;
 
   private final CldrImpl cldrImpl;
diff --git a/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java b/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
index d98858b..7142858 100644
--- a/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
@@ -85,4 +85,11 @@
   public NumberConstants getNumberConstants() {
     return GWT.create(NumberConstantsImpl.class);
   }
+  
+  /**
+   * @return true if any locale supported by this build of the app is RTL.
+   */
+  public boolean hasAnyRTL() {
+    return false;
+  }
 }
diff --git a/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java b/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java
index 8d0adcc..fd1ba61 100644
--- a/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java
+++ b/user/src/com/google/gwt/i18n/rebind/LocaleInfoGenerator.java
@@ -67,6 +67,20 @@
   private static final String OVERRIDE_LOCALE_NATIVE_DISPLAY_NAMES = "com/google/gwt/i18n/client/impl/cldr/LocaleNativeDisplayNames-override.properties";
 
   /**
+   * Set of canonical language codes which are RTL.
+   */
+  private static final Set<String> RTL_LOCALES = new HashSet<String>();
+
+  static {
+    // TODO(jat): get this from CLDR data.
+    RTL_LOCALES.add("ar");
+    RTL_LOCALES.add("fa");
+    RTL_LOCALES.add("he");
+    RTL_LOCALES.add("ps");
+    RTL_LOCALES.add("ur");
+  }
+
+  /**
    * Generate an implementation for the given type.
    * 
    * @param logger error logger
@@ -114,9 +128,14 @@
       writer.println("@Override");
       writer.println("public String[] getAvailableLocaleNames() {");
       writer.println("  return new String[] {");
+      boolean hasAnyRtl = false;
       for (GwtLocaleImpl possibleLocale : allLocales) {
         writer.println("    \""
             + possibleLocale.toString().replaceAll("\"", "\\\"") + "\",");
+        if (RTL_LOCALES.contains(
+            possibleLocale.getCanonicalForm().getLanguage())) {
+          hasAnyRtl = true;
+        }
       }
       writer.println("  };");
       writer.println("}");
@@ -128,6 +147,11 @@
           + "::nativeDisplayNames[localeName];");
       writer.println("}-*/;");
       writer.println();
+      writer.println("@Override");
+      writer.println("public boolean hasAnyRTL() {");
+      writer.println("  return " + hasAnyRtl + ";");
+      writer.println("}");
+      writer.println();
       writer.println("private native void ensureNativeDisplayNames() /*-{");
       writer.println("  if (this.@" + qualName
           + "::nativeDisplayNames != null) {");
diff --git a/user/test/com/google/gwt/i18n/I18NTest_en.gwt.xml b/user/test/com/google/gwt/i18n/I18NTest_en.gwt.xml
index 73cf0dc..280d4ef 100644
--- a/user/test/com/google/gwt/i18n/I18NTest_en.gwt.xml
+++ b/user/test/com/google/gwt/i18n/I18NTest_en.gwt.xml
@@ -19,5 +19,6 @@
 	<!-- Include client-side source for the test cases -->
 	<source path="client"/>
 	<extend-property name="locale" values="en_US"/>
+        <extend-property name="locale" values="ar"/>
 	<set-property name = "locale" value = "en_US"/>
 </module>
diff --git a/user/test/com/google/gwt/i18n/client/LocaleInfoTest.java b/user/test/com/google/gwt/i18n/client/LocaleInfoTest.java
index 1b7c9e1..52aa6db 100644
--- a/user/test/com/google/gwt/i18n/client/LocaleInfoTest.java
+++ b/user/test/com/google/gwt/i18n/client/LocaleInfoTest.java
@@ -27,17 +27,17 @@
     return "com.google.gwt.i18n.I18NTest";
   }
 
-  public void testCurrentLocale() {
-    String locale = LocaleInfo.getCurrentLocale().getLocaleName();
-    assertEquals("piglatin_UK_WINDOWS", locale);
-  }
-
   public void testAvailableLocales() {
     String[] locales = LocaleInfo.getAvailableLocaleNames();
     assertArrayEquals(new String[] {
         "default", "piglatin", "piglatin_UK", "piglatin_UK_WINDOWS"}, locales);
   }
 
+  public void testCurrentLocale() {
+    String locale = LocaleInfo.getCurrentLocale().getLocaleName();
+    assertEquals("piglatin_UK_WINDOWS", locale);
+  }
+
   public void testNativeDisplayNames() {
     // en isn't in the property set for this module so should return null
     String displayName = LocaleInfo.getLocaleNativeDisplayName("en");
@@ -51,6 +51,8 @@
   public void testRTL() {
     boolean isRTL = LocaleInfo.getCurrentLocale().isRTL();
     assertFalse(isRTL);
+    boolean hasRTL = LocaleInfo.hasAnyRTL();
+    assertFalse(hasRTL);
   }
 
   private void assertArrayEquals(String[] expected, String[] actual) {
diff --git a/user/test/com/google/gwt/i18n/client/LocaleInfo_ar_Test.java b/user/test/com/google/gwt/i18n/client/LocaleInfo_ar_Test.java
index 0dfdc16..6acd948 100644
--- a/user/test/com/google/gwt/i18n/client/LocaleInfo_ar_Test.java
+++ b/user/test/com/google/gwt/i18n/client/LocaleInfo_ar_Test.java
@@ -52,5 +52,7 @@
   public void testRTL() {
     boolean isRTL = LocaleInfo.getCurrentLocale().isRTL();
     assertTrue(isRTL);
+    boolean hasRTL = LocaleInfo.hasAnyRTL();
+    assertTrue(hasRTL);
   }
 }
diff --git a/user/test/com/google/gwt/i18n/client/LocaleInfo_en_Test.java b/user/test/com/google/gwt/i18n/client/LocaleInfo_en_Test.java
new file mode 100644
index 0000000..4dfc5d3
--- /dev/null
+++ b/user/test/com/google/gwt/i18n/client/LocaleInfo_en_Test.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.i18n.client;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * Tests the LocaleInfo class and the associated generator.
+ */
+public class LocaleInfo_en_Test extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    // This module is built in the en locale, but includes ar.
+    return "com.google.gwt.i18n.I18NTest_en";
+  }
+
+  public void testAvailableLocales() {
+    String[] locales = LocaleInfo.getAvailableLocaleNames();
+    ArrayList<String> localeList = new ArrayList<String>();
+    Collections.addAll(localeList, locales);
+    assertTrue(localeList.contains("ar"));
+    assertTrue(localeList.contains("default"));
+    assertTrue(localeList.contains("en_US"));
+  }
+
+  public void testRTL() {
+    boolean isRTL = LocaleInfo.getCurrentLocale().isRTL();
+    assertFalse(isRTL);
+    boolean hasRTL = LocaleInfo.hasAnyRTL();
+    assertTrue(hasRTL);
+  }
+}
