/*
 * 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.shared.impl.cldr;
// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA

/**
 * Implementation of DateTimeFormatInfo for the "ln" locale.
 */
public class DateTimeFormatInfoImpl_ln extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "ntɔ́ngɔ́",
        "mpókwa"
    };
  }

  @Override
  public String dateFormatFull() {
    return "EEEE d MMMM y";
  }

  @Override
  public String dateFormatLong() {
    return "d MMMM y";
  }

  @Override
  public String dateFormatMedium() {
    return "d MMM y";
  }

  @Override
  public String dateFormatShort() {
    return "d/M/y";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "Yambo ya Yézu Krís",
        "Nsima ya Yézu Krís"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "libóso ya",
        "nsima ya Y"
    };
  }

  @Override
  public String formatMinuteSecond() {
    return "m:ss";
  }

  @Override
  public String formatMonthAbbrevDay() {
    return "d MMM";
  }

  @Override
  public String formatMonthFullWeekdayDay() {
    return "EEEE d MMMM";
  }

  @Override
  public String formatMonthNumDay() {
    return "d/M";
  }

  @Override
  public String formatYearMonthAbbrev() {
    return "MMM y";
  }

  @Override
  public String formatYearMonthAbbrevDay() {
    return "d MMM y";
  }

  @Override
  public String formatYearMonthFullDay() {
    return "d MMMM y";
  }

  @Override
  public String formatYearMonthNum() {
    return "M/y";
  }

  @Override
  public String formatYearMonthNumDay() {
    return "d/M/y";
  }

  @Override
  public String formatYearMonthWeekdayDay() {
    return "EEE d MMM y";
  }

  @Override
  public String formatYearQuarterFull() {
    return "QQQQ y";
  }

  @Override
  public String formatYearQuarterShort() {
    return "Q y";
  }

  @Override
  public String[] monthsFull() {
    return new String[] {
        "sánzá ya yambo",
        "sánzá ya míbalé",
        "sánzá ya mísáto",
        "sánzá ya mínei",
        "sánzá ya mítáno",
        "sánzá ya motóbá",
        "sánzá ya nsambo",
        "sánzá ya mwambe",
        "sánzá ya libwa",
        "sánzá ya zómi",
        "sánzá ya zómi na mɔ̌kɔ́",
        "sánzá ya zómi na míbalé"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "y",
        "f",
        "m",
        "a",
        "m",
        "y",
        "y",
        "a",
        "s",
        "ɔ",
        "n",
        "d"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "yan",
        "fbl",
        "msi",
        "apl",
        "mai",
        "yun",
        "yul",
        "agt",
        "stb",
        "ɔtb",
        "nvb",
        "dsb"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "sánzá mísáto ya yambo",
        "sánzá mísáto ya míbalé",
        "sánzá mísáto ya mísáto",
        "sánzá mísáto ya mínei"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "SM1",
        "SM2",
        "SM3",
        "SM4"
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "eyenga",
        "mokɔlɔ mwa yambo",
        "mokɔlɔ mwa míbalé",
        "mokɔlɔ mwa mísáto",
        "mokɔlɔ ya mínéi",
        "mokɔlɔ ya mítáno",
        "mpɔ́sɔ"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "e",
        "y",
        "m",
        "m",
        "m",
        "m",
        "p"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "eye",
        "ybo",
        "mbl",
        "mst",
        "min",
        "mtn",
        "mps"
    };
  }
}
