/*
 * 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 "my" locale.
 */
public class DateTimeFormatInfoImpl_my extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "နံနက်",
        "ညနေ"
    };
  }

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

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

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

  @Override
  public String dateFormatShort() {
    return "dd-MM-yy";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "ခရစ်တော် မပေါ်မီနှစ်",
        "ခရစ်နှစ်"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "ဘီစီ",
        "အေဒီ"
    };
  }

  @Override
  public int firstDayOfTheWeek() {
    return 0;
  }

  @Override
  public String formatHour12Minute() {
    return "a h:mm";
  }

  @Override
  public String formatHour12MinuteSecond() {
    return "a h:mm:ss";
  }

  @Override
  public String formatHour24Minute() {
    return "B H:mm";
  }

  @Override
  public String formatHour24MinuteSecond() {
    return "B HH:mm:ss";
  }

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

  @Override
  public String formatMonthFullWeekdayDay() {
    return "MMMM d ရက် EEEEနေ့";
  }

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

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

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

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

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

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

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

  @Override
  public String[] monthsFull() {
    return new String[] {
        "ဇန်နဝါရီ",
        "ဖေဖော်ဝါရီ",
        "မတ်",
        "ဧပြီ",
        "မေ",
        "ဇွန်",
        "ဇူလိုင်",
        "ဩဂုတ်",
        "စက်တင်ဘာ",
        "အောက်တိုဘာ",
        "နိုဝင်ဘာ",
        "ဒီဇင်ဘာ"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "ဇ",
        "ဖ",
        "မ",
        "ဧ",
        "မ",
        "ဇ",
        "ဇ",
        "ဩ",
        "စ",
        "အ",
        "န",
        "ဒ"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "ဇန်",
        "ဖေ",
        "မတ်",
        "ဧ",
        "မေ",
        "ဇွန်",
        "ဇူ",
        "ဩ",
        "စက်",
        "အောက်",
        "နို",
        "ဒီ"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "ပထမ သုံးလပတ်",
        "ဒုတိယ သုံးလပတ်",
        "တတိယ သုံးလပတ်",
        "စတုတ္ထ သုံးလပတ်"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "ပထမ သုံးလပတ်",
        "ဒုတိယ သုံးလပတ်",
        "တတိယ သုံးလပတ်",
        "စတုတ္ထ သုံးလပတ်"
    };
  }

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

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

  @Override
  public String timeFormatMedium() {
    return "B HH:mm:ss";
  }

  @Override
  public String timeFormatShort() {
    return "B H:mm";
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "တနင်္ဂနွေ",
        "တနင်္လာ",
        "အင်္ဂါ",
        "ဗုဒ္ဓဟူး",
        "ကြာသပတေး",
        "သောကြာ",
        "စနေ"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "တ",
        "တ",
        "အ",
        "ဗ",
        "က",
        "သ",
        "စ"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "တနင်္ဂနွေ",
        "တနင်္လာ",
        "အင်္ဂါ",
        "ဗုဒ္ဓဟူး",
        "ကြာသပတေး",
        "သောကြာ",
        "စနေ"
    };
  }
}
