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

/**
 * Implementation of DateTimeFormatInfo for the "mn" locale.
 */
public class DateTimeFormatInfoImpl_mn extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "ҮӨ",
        "ҮХ"
    };
  }

  @Override
  public String dateFormatFull() {
    return "y 'оны' MMM'ын' d. EEEE 'гараг'.";
  }

  @Override
  public String dateFormatLong() {
    return "y 'оны' MMM'ын' d";
  }

  @Override
  public String dateFormatMedium() {
    return "y.MM.dd";
  }

  @Override
  public String dateFormatShort() {
    return "y.MM.dd";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "манай эриний өмнөх",
        "манай эриний"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "МЭӨ",
        "МЭ"
    };
  }

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

  @Override
  public String formatMonthFullDay() {
    return "MMM'ын' d";
  }

  @Override
  public String formatMonthFullWeekdayDay() {
    return "MMMM'ын' d, EEEE";
  }

  @Override
  public String formatMonthNumDay() {
    return "MM/dd";
  }

  @Override
  public String formatYearMonthAbbrev() {
    return "y 'оны' MMM";
  }

  @Override
  public String formatYearMonthAbbrevDay() {
    return "y.MM.dd";
  }

  @Override
  public String formatYearMonthFull() {
    return "y 'оны' MMM";
  }

  @Override
  public String formatYearMonthFullDay() {
    return "y.MM.dd";
  }

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

  @Override
  public String formatYearMonthNumDay() {
    return "y.MM.dd";
  }

  @Override
  public String formatYearMonthWeekdayDay() {
    return "y.MM.dd, EEE";
  }

  @Override
  public String formatYearQuarterFull() {
    return "y 'оны' QQQQ";
  }

  @Override
  public String[] monthsFull() {
    return new String[] {
        "Нэгдүгээр сар",
        "Хоёрдугаар сар",
        "Гуравдугаар сар",
        "Дөрөвдүгээр сар",
        "Тавдугаар сар",
        "Зургаадугаар сар",
        "Долдугаар сар",
        "Наймдугаар сар",
        "Есдүгээр сар",
        "Аравдугаар сар",
        "Арван нэгдүгээр сар",
        "Арван хоёрдугаар сар"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "I",
        "II",
        "III",
        "IV",
        "V",
        "VI",
        "VII",
        "VIII",
        "IX",
        "X",
        "XI",
        "XII"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "1-р сар",
        "2-р сар",
        "3-р сар",
        "4-р сар",
        "5-р сар",
        "6-р сар",
        "7-р сар",
        "8-р сар",
        "9-р сар",
        "10-р сар",
        "11-р сар",
        "12-р сар"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "1-р улирал",
        "2-р улирал",
        "3-р улирал",
        "4-р улирал"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "I улирал",
        "II улирал",
        "III улирал",
        "IV улирал"
    };
  }

  @Override
  public String timeFormatFull() {
    return "HH:mm:ss (zzzz)";
  }

  @Override
  public String timeFormatLong() {
    return "HH:mm:ss (z)";
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "ням",
        "даваа",
        "мягмар",
        "лхагва",
        "пүрэв",
        "баасан",
        "бямба"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "Ня",
        "Да",
        "Мя",
        "Лх",
        "Пү",
        "Ба",
        "Бя"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "Ня",
        "Да",
        "Мя",
        "Лх",
        "Пү",
        "Ба",
        "Бя"
    };
  }
}
