/*
 * Copyright 2012 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.impl.cldr;

import com.google.gwt.core.client.JavaScriptObject;

// DO NOT EDIT - GENERATED FROM CLDR DATA

/**
 * Localized names for the "se_FI" locale.
 */
public class LocalizedNamesImpl_se_FI extends LocalizedNamesImpl_se {

  @Override
  public String[] loadSortedRegionCodes() {
    return new String[] {
        "AF",
        "AX",
        "AL",
        "DZ",
        "US",
        "AS",
        "AD",
        "AO",
        "AI",
        "AQ",
        "AG",
        "VI",
        "AR",
        "AM",
        "AW",
        "AC",
        "AZ",
        "AU",
        "BS",
        "BH",
        "BD",
        "BB",
        "BE",
        "BZ",
        "BJ",
        "BM",
        "BT",
        "BO",
        "BA",
        "BW",
        "BV",
        "BR",
        "VG",
        "BN",
        "BG",
        "BF",
        "MM",
        "BI",
        "KY",
        "CZ",
        "EA",
        "TD",
        "CL",
        "CP",
        "CC",
        "CK",
        "CR",
        "CW",
        "DK",
        "KP",
        "MP",
        "DG",
        "DJ",
        "DM",
        "DO",
        "DE",
        "TR",
        "EC",
        "EG",
        "GQ",
        "CI",
        "SV",
        "ER",
        "EE",
        "ET",
        "EZ",
        "EU",
        "FK",
        "FO",
        "FJ",
        "PH",
        "FR",
        "GF",
        "PF",
        "MF",
        "GA",
        "GM",
        "CF",
        "GE",
        "GH",
        "GI",
        "GR",
        "GD",
        "GP",
        "GU",
        "GT",
        "GG",
        "GN",
        "GW",
        "GY",
        "HT",
        "HM",
        "HN",
        "HK",
        "IN",
        "ID",
        "IO",
        "IQ",
        "IR",
        "IE",
        "IS",
        "IL",
        "IT",
        "JM",
        "JP",
        "YE",
        "JE",
        "JO",
        "CX",
        "GL",
        "KH",
        "CM",
        "CA",
        "IC",
        "CV",
        "KZ",
        "KE",
        "CN",
        "KG",
        "KI",
        "CO",
        "KM",
        "CG",
        "CD",
        "XK",
        "HR",
        "CU",
        "KW",
        "CY",
        "LA",
        "LV",
        "LS",
        "LB",
        "LR",
        "LY",
        "LI",
        "LT",
        "GS",
        "LU",
        "MG",
        "MO",
        "MK",
        "MW",
        "MV",
        "MY",
        "ML",
        "MT",
        "IM",
        "MA",
        "MH",
        "MQ",
        "ZA",
        "KR",
        "SS",
        "MR",
        "MU",
        "YT",
        "MX",
        "FM",
        "MD",
        "MC",
        "MN",
        "ME",
        "MS",
        "MZ",
        "NA",
        "NR",
        "NP",
        "NI",
        "NE",
        "NG",
        "NU",
        "NF",
        "NO",
        "AT",
        "TL",
        "EH",
        "OM",
        "AE",
        "UN",
        "NC",
        "NZ",
        "PK",
        "PW",
        "PS",
        "PA",
        "PG",
        "PY",
        "PE",
        "PN",
        "PL",
        "PT",
        "PR",
        "QA",
        "QO",
        "RE",
        "RO",
        "RU",
        "SE",
        "RW",
        "BL",
        "SH",
        "KN",
        "LC",
        "PM",
        "VC",
        "SB",
        "WS",
        "SM",
        "ST",
        "SA",
        "SN",
        "RS",
        "SC",
        "SL",
        "SG",
        "SK",
        "SI",
        "SO",
        "ES",
        "LK",
        "GB",
        "SD",
        "FI",
        "SR",
        "SJ",
        "SZ",
        "CH",
        "SY",
        "TW",
        "TZ",
        "TJ",
        "TF",
        "TH",
        "TG",
        "TK",
        "TO",
        "TT",
        "TA",
        "TN",
        "TM",
        "TC",
        "TV",
        "UG",
        "UA",
        "UM",
        "HU",
        "UY",
        "UZ",
        "VU",
        "VA",
        "VE",
        "VN",
        "BY",
        "NL",
        "BQ",
        "SX",
        "WF",
        "ZM",
        "ZW",
    };
  }

  @Override
  protected void loadNameMapJava() {
    super.loadNameMapJava();
    namesMap.put("001", "Máilbmi");
    namesMap.put("002", "Afrihka");
    namesMap.put("003", "Davvi-Amerihká ja Gaska-Amerihká");
    namesMap.put("005", "Lulli-Amerihká");
    namesMap.put("011", "Oarje-Afrihká");
    namesMap.put("013", "Gaska-Amerihká");
    namesMap.put("014", "Nuorta-Afrihká");
    namesMap.put("015", "Davvi-Afrihká");
    namesMap.put("017", "Gaska-Afrihká");
    namesMap.put("018", "Lulli-Afrihká");
    namesMap.put("019", "Amerihka");
    namesMap.put("021", "Davvi-Amerihká");
    namesMap.put("057", "Mikronesia guovlu");
    namesMap.put("419", "Latiinnalaš Amerihká");
    namesMap.put("BA", "Bosnia ja Hercegovina");
    namesMap.put("EZ", "Euroavádat");
    namesMap.put("KH", "Kamboža");
    namesMap.put("SD", "Sudan");
    namesMap.put("TD", "Chad");
    namesMap.put("UN", "Ovttastuvvan Našuvnnat");
  }

  @Override
  protected JavaScriptObject loadNameMapNative() {
    return overrideMap(super.loadNameMapNative(), loadMyNameMap());
  }

  private native JavaScriptObject loadMyNameMap() /*-{
    return {
        "001": "Máilbmi",
        "002": "Afrihka",
        "003": "Davvi-Amerihká ja Gaska-Amerihká",
        "005": "Lulli-Amerihká",
        "011": "Oarje-Afrihká",
        "013": "Gaska-Amerihká",
        "014": "Nuorta-Afrihká",
        "015": "Davvi-Afrihká",
        "017": "Gaska-Afrihká",
        "018": "Lulli-Afrihká",
        "019": "Amerihka",
        "021": "Davvi-Amerihká",
        "057": "Mikronesia guovlu",
        "419": "Latiinnalaš Amerihká",
        "BA": "Bosnia ja Hercegovina",
        "EZ": "Euroavádat",
        "KH": "Kamboža",
        "SD": "Sudan",
        "TD": "Chad",
        "UN": "Ovttastuvvan Našuvnnat"
    };
  }-*/;
}
