Revision: 7292
          
http://languagetool.svn.sourceforge.net/languagetool/?rev=7292&view=rev
Author:   dnaber
Date:     2012-06-07 21:23:23 +0000 (Thu, 07 Jun 2012)
Log Message:
-----------
fix language detection to use the default variant (as we don't offer just 
"English"); handle German and its variants as we do for English and its variants

Modified Paths:
--------------
    trunk/JLanguageTool/src/java/org/languagetool/Language.java
    trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle.properties
    trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle_en.properties
    trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageComboBox.java
    
trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageDetectionCheckbox.java
    trunk/JLanguageTool/src/java/org/languagetool/language/English.java
    trunk/JLanguageTool/src/java/org/languagetool/language/German.java
    trunk/JLanguageTool/src/test/org/languagetool/JLanguageToolTest.java
    trunk/JLanguageTool/src/test/org/languagetool/LanguageTest.java
    
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/FalseFriendRuleTest.java

Added Paths:
-----------
    trunk/JLanguageTool/src/java/org/languagetool/language/GermanyGerman.java

Modified: trunk/JLanguageTool/src/java/org/languagetool/Language.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/Language.java 2012-06-07 
19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/java/org/languagetool/Language.java 2012-06-07 
21:23:23 UTC (rev 7292)
@@ -56,6 +56,7 @@
   public static final Language ESPERANTO = new Esperanto();
   public static final Language FRENCH = new French();
   public static final Language GERMAN = new German();
+  public static final Language GERMANY_GERMAN = new GermanyGerman();
   public static final Language AUSTRIAN_GERMAN = new AustrianGerman();
   public static final Language SWISS_GERMAN = new SwissGerman();
   public static final Language ITALIAN = new Italian();
@@ -89,8 +90,8 @@
     ENGLISH, GERMAN, POLISH, FRENCH, SPANISH, ITALIAN, KHMER, DUTCH, 
LITHUANIAN, UKRAINIAN, RUSSIAN,
     SLOVAK, SLOVENIAN, /*SWEDISH,*/ ROMANIAN, ICELANDIC, GALICIAN, CATALAN, 
DANISH,
     MALAYALAM, BELARUSIAN, ESPERANTO, CHINESE, ASTURIAN, TAGALOG, BRETON, 
GREEK,
-    AMERICAN_ENGLISH, BRITISH_ENGLISH, AUSTRIAN_GERMAN, SWISS_GERMAN,
-    CANADIAN_ENGLISH, SOUTH_AFRICAN_ENGLISH, NEW_ZEALAND_ENGLISH, 
AUSTRALIAN_ENGLISH,
+    AMERICAN_ENGLISH, BRITISH_ENGLISH, CANADIAN_ENGLISH, 
SOUTH_AFRICAN_ENGLISH, NEW_ZEALAND_ENGLISH, AUSTRALIAN_ENGLISH,
+    GERMANY_GERMAN, AUSTRIAN_GERMAN, SWISS_GERMAN,
     DEMO
   };
 
@@ -136,7 +137,7 @@
    * @return String[] - array of country variants for the language.
    */
   public abstract String[] getCountryVariants();
-  
+
   /**
    * Get this language's Java locale.
    */
@@ -175,6 +176,13 @@
   }
 
   /**
+   * Languages that have variants need to overwrite this to select their most 
common variant.
+   */
+  public Language getDefaultVariant() {
+    return null;
+  }
+
+  /**
    * Get this language's part-of-speech disambiguator implementation.
    */
   public Disambiguator getDisambiguator() {
@@ -343,6 +351,45 @@
   }
 
   /**
+   * Get the best match for a locale, using American English as the final 
fallback if nothing
+   * else fits. The returned language will be a variant language (e.g. British 
English, not just English)
+   * if available.
+   */
+  public static Language getLanguageForLocale(final Locale locale) {
+    Language language = getLanguageForLanguageNameAndCountry(locale);
+    if (language != null) {
+      return language;
+    } else {
+      language = getLanguageForLanguageNameOnly(locale);
+      if (language != null) {
+        return language;
+      }
+    }
+    return Language.AMERICAN_ENGLISH;  // final fallback
+  }
+
+  private static Language getLanguageForLanguageNameAndCountry(Locale locale) {
+    for (Language language : Language.REAL_LANGUAGES) {
+      if (language.getShortName().equals(locale.getLanguage())) {
+        final List<String> countryVariants = 
Arrays.asList(language.getCountryVariants());
+        if (countryVariants.contains(locale.getCountry())) {
+          return language;
+        }
+      }
+    }
+    return null;
+  }
+
+  private static Language getLanguageForLanguageNameOnly(Locale locale) {
+    for (Language language : Language.REAL_LANGUAGES) {
+      if (language.getShortName().equals(locale.getLanguage()) && 
!language.hasVariant()) {
+        return language;
+      }
+    }
+    return null;
+  }
+
+  /**
    * Get the Language object for the given language name.
    * 
    * @param languageName e.g. <code>English</code> or <code>German</code> 
(case is significant)

Modified: 
trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle.properties
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle.properties     
2012-06-07 19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle.properties     
2012-06-07 21:23:23 UTC (rev 7292)
@@ -33,6 +33,8 @@
 
 de = German
 
+de-DE = German (Germany)
+
 de-AT = German (Austrian)
 
 de-CH = German (Swiss)

Modified: 
trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle_en.properties
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle_en.properties  
2012-06-07 19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/java/org/languagetool/MessagesBundle_en.properties  
2012-06-07 21:23:23 UTC (rev 7292)
@@ -33,6 +33,8 @@
 
 de = German
 
+de-DE = German (Germany)
+
 de-AT = German (Austrian)
 
 de-CH = German (Swiss)

Modified: 
trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageComboBox.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageComboBox.java     
2012-06-07 19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageComboBox.java     
2012-06-07 21:23:23 UTC (rev 7292)
@@ -29,6 +29,7 @@
 public class LanguageComboBox extends JComboBox {
 
   private final ResourceBundle messages;
+  private final List<I18nLanguage> i18nLanguages = new 
ArrayList<I18nLanguage>();
 
   public LanguageComboBox(ResourceBundle messages) {
     this.messages = messages;
@@ -37,12 +38,21 @@
 
   void populateLanguageBox() {
     removeAllItems();
-    final List<I18nLanguage> i18nLanguages = getAllLanguages();
-    preselectDefaultLanguage(i18nLanguages);
+    initAllLanguages();
+    preselectDefaultLanguage();
   }
 
-  private List<I18nLanguage> getAllLanguages() {
-    final List<I18nLanguage> i18nLanguages = new ArrayList<I18nLanguage>();
+  void selectLanguage(Language language) {
+    final String translatedName = language.getTranslatedName(messages);
+    for (final I18nLanguage i18nLanguage : i18nLanguages) {
+      if (i18nLanguage.toString().equals(translatedName)) {
+        setSelectedItem(i18nLanguage);
+      }
+    }
+  }
+
+  private void initAllLanguages() {
+    i18nLanguages.clear();
     for (Language language : Language.LANGUAGES) {
       final boolean skip = (language == Language.DEMO) || 
language.hasVariant();
       if (!skip) {
@@ -50,32 +60,14 @@
       }
     }
     Collections.sort(i18nLanguages);
-    return i18nLanguages;
-  }
-
-  private void preselectDefaultLanguage(List<I18nLanguage> i18nLanguages) {
-    final String defaultGuiLocale = getDefaultGuiLanguage(Locale.getDefault());
     for (final I18nLanguage i18nLanguage : i18nLanguages) {
       addItem(i18nLanguage);
-      if (i18nLanguage.toString().equals(defaultGuiLocale)) {
-        setSelectedItem(i18nLanguage);
-      }
     }
   }
 
-  private String getDefaultGuiLanguage(Locale defaultLocale) {
-    String defaultGuiLocale = null;
-    try {
-      defaultGuiLocale = messages.getString(defaultLocale.getLanguage() + "-" 
+ defaultLocale.getCountry());
-    } catch (final MissingResourceException e) {
-      // this specific language/variant combination is not supported
-      try {
-        defaultGuiLocale = messages.getString(defaultLocale.getLanguage());
-      } catch (final MissingResourceException e2) {
-        // language not supported, so don't select a default
-      }
-    }
-    return defaultGuiLocale;
+  private void preselectDefaultLanguage() {
+    final Language defaultLanguage = 
Language.getLanguageForLocale(Locale.getDefault());
+    selectLanguage(defaultLanguage);
   }
 
 }

Modified: 
trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageDetectionCheckbox.java
===================================================================
--- 
trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageDetectionCheckbox.java
    2012-06-07 19:22:55 UTC (rev 7291)
+++ 
trunk/JLanguageTool/src/java/org/languagetool/gui/LanguageDetectionCheckbox.java
    2012-06-07 21:23:23 UTC (rev 7292)
@@ -28,7 +28,6 @@
 
 class LanguageDetectionCheckbox extends JCheckBox {
 
-  private final ResourceBundle messages;
   private final LanguageComboBox languageBox;
 
   LanguageDetectionCheckbox(final ResourceBundle messages, final 
LanguageComboBox languageBox, final Configuration config) {
@@ -41,7 +40,6 @@
       }
     });
     setSelected(config.getAutoDetect());
-    this.messages = messages;
     this.languageBox = languageBox;
   }
 
@@ -49,14 +47,13 @@
     final LanguageIdentifier langIdentifier = new LanguageIdentifier(text);
     Language lang = 
Language.getLanguageForShortName(langIdentifier.getLanguage());
     if (lang == null) {
-      lang = Language.ENGLISH;
+      lang = Language.AMERICAN_ENGLISH;
     }
-    for (int i = 0; i < languageBox.getItemCount(); i++) {
-      final I18nLanguage boxLanguage = (I18nLanguage) languageBox.getItemAt(i);
-      if (boxLanguage.toString().equals(lang.getTranslatedName(messages))) {
-        languageBox.setSelectedIndex(i);
-      }
+    if (lang.hasVariant()) {
+      // UI only shows variants like "English (American)", not just "English", 
so use that:
+      lang = lang.getDefaultVariant();
     }
+    languageBox.selectLanguage(lang);
     return lang;
   }
 

Modified: trunk/JLanguageTool/src/java/org/languagetool/language/English.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/language/English.java 
2012-06-07 19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/java/org/languagetool/language/English.java 
2012-06-07 21:23:23 UTC (rev 7292)
@@ -48,13 +48,18 @@
   }
 
   @Override
+  public Language getDefaultVariant() {
+    return AMERICAN_ENGLISH;
+  }
+
+  @Override
   public final SentenceTokenizer getSentenceTokenizer() {
     if (sentenceTokenizer == null) {
       sentenceTokenizer = new SRXSentenceTokenizer(getShortName());
     }
     return sentenceTokenizer;
   }
-  
+
   @Override
   public String getName() {
     return "English";

Modified: trunk/JLanguageTool/src/java/org/languagetool/language/German.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/language/German.java  
2012-06-07 19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/java/org/languagetool/language/German.java  
2012-06-07 21:23:23 UTC (rev 7292)
@@ -33,13 +33,18 @@
 
   private Tagger tagger;
   private SentenceTokenizer sentenceTokenizer;
-  
+
   @Override
   public Locale getLocale() {
     return new Locale(getShortName());
   }
 
   @Override
+  public Language getDefaultVariant() {
+    return GERMANY_GERMAN;
+  }
+
+  @Override
   public String getName() {
     return "German";
   }
@@ -51,7 +56,7 @@
 
   @Override
   public String[] getCountryVariants() {
-    return new String[]{"DE", "LU", "LI", "BE"};
+    return new String[]{"LU", "LI", "BE"};
   }
 
   @Override

Copied: 
trunk/JLanguageTool/src/java/org/languagetool/language/GermanyGerman.java (from 
rev 7290, 
trunk/JLanguageTool/src/java/org/languagetool/language/SwissGerman.java)
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/language/GermanyGerman.java   
                        (rev 0)
+++ trunk/JLanguageTool/src/java/org/languagetool/language/GermanyGerman.java   
2012-06-07 21:23:23 UTC (rev 7292)
@@ -0,0 +1,33 @@
+/* LanguageTool, a natural language style checker
+ * Copyright (C) 2012 Daniel Naber (http://www.danielnaber.de)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
+ * USA
+ */
+package org.languagetool.language;
+
+public class GermanyGerman extends German {
+
+  @Override
+  public final String[] getCountryVariants() {
+    return new String[]{"DE"};
+  }
+
+  @Override
+  public final String getName() {
+    return "German (Germany)";
+  }
+
+}

Modified: trunk/JLanguageTool/src/test/org/languagetool/JLanguageToolTest.java
===================================================================
--- trunk/JLanguageTool/src/test/org/languagetool/JLanguageToolTest.java        
2012-06-07 19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/test/org/languagetool/JLanguageToolTest.java        
2012-06-07 21:23:23 UTC (rev 7292)
@@ -75,10 +75,22 @@
     assertEquals(1, tool.check("Ein Test Test, der Fehler geben 
sollte.").size());
     tool.activateDefaultPatternRules();
     tool.setListUnknownWords(true);
+    // no spelling mistakes as we have not created a variant:
+    assertEquals(0, tool.check("I can give you more a detailed 
description").size());
+    //test unknown words listing
+    assertEquals("[I, can, detailed, give, more, you]", 
tool.getUnknownWords().toString());    
+  }
+
+  public void testGermanyGerman() throws IOException {
+    final JLanguageTool tool = new JLanguageTool(Language.GERMANY_GERMAN);
+    assertEquals(0, tool.check("Ein Test, der keine Fehler geben 
sollte.").size());
+    assertEquals(1, tool.check("Ein Test Test, der Fehler geben 
sollte.").size());
+    tool.activateDefaultPatternRules();
+    tool.setListUnknownWords(true);
     // German rule has no effect with English error, but they are spelling 
mistakes:
     assertEquals(6, tool.check("I can give you more a detailed 
description").size());
     //test unknown words listing
-    assertEquals("[I, can, detailed, give, more, you]", 
tool.getUnknownWords().toString());    
+    assertEquals("[I, can, detailed, give, more, you]", 
tool.getUnknownWords().toString());
   }
 
   public void testPositionsWithGerman() throws IOException {

Modified: trunk/JLanguageTool/src/test/org/languagetool/LanguageTest.java
===================================================================
--- trunk/JLanguageTool/src/test/org/languagetool/LanguageTest.java     
2012-06-07 19:22:55 UTC (rev 7291)
+++ trunk/JLanguageTool/src/test/org/languagetool/LanguageTest.java     
2012-06-07 21:23:23 UTC (rev 7292)
@@ -22,6 +22,8 @@
 
 import org.junit.Test;
 
+import java.util.Locale;
+
 public class LanguageTest {
 
        @Test
@@ -77,4 +79,18 @@
     assertFalse(Language.getLanguageForShortName("pl").hasVariant());
        }
 
+  @Test
+       public void testGetLanguageForLocale() {
+    assertEquals(Language.GERMANY_GERMAN, Language.getLanguageForLocale(new 
Locale("de", "DE")));
+    assertEquals(Language.AUSTRIAN_GERMAN, Language.getLanguageForLocale(new 
Locale("de", "AT")));
+    assertEquals(Language.AMERICAN_ENGLISH, Language.getLanguageForLocale(new 
Locale("en", "US")));
+    assertEquals(Language.BRITISH_ENGLISH, Language.getLanguageForLocale(new 
Locale("en", "GB")));
+    // fallback to the language's default variant if not specified:
+    assertEquals(Language.AMERICAN_ENGLISH, Language.getLanguageForLocale(new 
Locale("en")));
+    assertEquals(Language.GERMANY_GERMAN, Language.getLanguageForLocale(new 
Locale("de")));
+    // final fallback is everything else fails:
+    assertEquals(Language.AMERICAN_ENGLISH, 
Language.getLanguageForLocale(Locale.JAPANESE));
+    assertEquals(Language.AMERICAN_ENGLISH, Language.getLanguageForLocale(new 
Locale("zz")));
+  }
+
 }

Modified: 
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/FalseFriendRuleTest.java
===================================================================
--- 
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/FalseFriendRuleTest.java
       2012-06-07 19:22:55 UTC (rev 7291)
+++ 
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/FalseFriendRuleTest.java
       2012-06-07 21:23:23 UTC (rev 7292)
@@ -52,7 +52,7 @@
     langTool.activateDefaultFalseFriendRules();
     assertErrors(1, "Man sollte ihn nicht so beraten.", langTool);
     assertErrors(0, "Man sollte ihn nicht so beschimpfen.", langTool);
-    assertErrors(2, "Ich gehe in Blubbstadt zur Hochschule.", langTool);
+    assertErrors(1, "Ich gehe in Blubbstadt zur Hochschule.", langTool);
   }
 
   public void testHintsForPolishSpeakers() throws IOException, 
ParserConfigurationException, SAXException {

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Languagetool-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/languagetool-cvs

Reply via email to