/*
 * 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
//  cldrVersion=21.0
//  number=$Revision: 5953 $
//  type=sah
//  date=$Date: 2011-07-04 19:22:55 -0400 (Mon, 04 Jul 2011) $

/**
 * Implementation of DateTimeFormatInfo for the "sah" locale.
 */
public class DateTimeFormatInfoImpl_sah extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "ЭИ",
        "ЭК"
    };
  }

  @Override
  public String dateFormatFull() {
    return "y 'сыл' MMMM d 'күнэ', EEEE";
  }

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

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

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

  @Override
  public String[] erasFull() {
    return new String[] {
        "б. э. и.",
        "б. э"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "б. э. и.",
        "б. э"
    };
  }

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

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

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

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

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

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

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

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

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

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

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

  @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[] {
        "1-кы кыбаартал",
        "2-с кыбаартал",
        "3-с кыбаартал",
        "4-с кыбаартал"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "1-кы кб",
        "2-с кб",
        "3-с кб",
        "4-с кб"
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "Баскыһыанньа",
        "Бэнидиэлинньик",
        "Оптуорунньук",
        "Сэрэдэ",
        "Чэппиэр",
        "Бээтиҥсэ",
        "Субуота"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "Б",
        "Б",
        "О",
        "С",
        "Ч",
        "Б",
        "С"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "Бс",
        "Бн",
        "Оп",
        "Сэ",
        "Чп",
        "Бэ",
        "Сб"
    };
  }
}
