/*
 * Copyright 2010 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 DATA

/**
 * Implementation of DateTimeFormatInfo for locale "bo".
 */
public class DateTimeFormatInfoImpl_bo extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] { 
        "སྔ་དྲོ་",
        "ཕྱི་དྲོ་"
    };
  }

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

  @Override
  public String dateFormatLong() {
    return "སྦྱི་ལོ་y MMMMའི་ཙེས་dད";
  }

  @Override
  public String dateFormatMedium() {
    return "y ལོ་འི་MMMཙེས་d";
  }

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

  @Override
  public String[] erasFull() {
    return new String[] { 
        "སྤྱི་ལོ་སྔོན།",
        "སྤྱི་ལོ།"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] { 
        "སྤྱི་ལོ་སྔོན།",
        "སྤྱི་ལོ།"
    };
  }

  @Override
  public String formatYearMonthAbbrevDay() {
    return "སྦྱི་ལོ་y MMMའི་ཙེས་dད";
  }

  @Override
  public String formatYearMonthFullDay() {
    return "སྦྱི་ལོ་y MMMMའི་ཙེས་dད";
  }

  @Override
  public String[] monthsFull() {
    return new String[] { 
        "ཟླ་བ་དང་པོ་",
        "ཟླ་བ་གཉིས་པ་",
        "ཟླ་བ་སུམ་པ་",
        "ཟླ་བ་བཞི་པ་",
        "ཟླ་བ་ལྔ་པ་",
        "ཟླ་བ་དྲུག་པ་",
        "ཟླ་བ་བདུན་པ་",
        "ཟླ་བ་བརྒྱད་པ་",
        "ཟླ་བ་དགུ་པ་",
        "ཟླ་བ་བཅུ་པ་",
        "ཟླ་བ་བཅུ་གཅིག་པ་",
        "ཟླ་བ་བཅུ་གཉིས་པ་"
    };
  }

  @Override
  public String[] monthsFullStandalone() {
    return monthsFull();
  }

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

  @Override
  public String[] monthsNarrowStandalone() {
    return monthsNarrow();
  }

  @Override
  public String[] monthsShort() {
    return new String[] { 
        "ཟླ་༡",
        "ཟླ་༢",
        "ཟླ་༣",
        "ཟླ་༤",
        "ཟླ་༥",
        "ཟླ་༦",
        "ཟླ་༧",
        "ཟླ་༨",
        "ཟླ་༩",
        "ཟླ་༡༠",
        "ཟླ་༡༡",
        "ཟླ་༡༢"
    };
  }

  @Override
  public String[] monthsShortStandalone() {
    return monthsShort();
  }

  @Override
  public String[] quartersFull() {
    return new String[] { 
        "དུས་ཚིགས་དང་པོ།",
        "དུས་ཚིགས་གཉིས་པ།",
        "་དུས་ཚིགས་གསུམ་པ།",
        "དུས་ཚིགས་བཞི་པ།"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] { 
        "དུས་ཚིགས་དང་པོ།",
        "དུས་ཚིགས་གཉིས་པ།",
        "་དུས་ཚིགས་གསུམ་པ།",
        "དུས་ཚིགས་བཞི་པ།"
    };
  }

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

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

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

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

  @Override
  public String[] weekdaysFull() {
    return new String[] { 
        "གཟའ་ཉི་མ་",
        "གཟའ་ཟླ་བ་",
        "གཟའ་མིག་དམར་",
        "གཟའ་ཧླག་པ་",
        "གཟའ་ཕུར་བུ་",
        "གཟའ་སངས་",
        "གཟའ་སྤེན་པ་"
    };
  }

  @Override
  public String[] weekdaysFullStandalone() {
    return weekdaysFull();
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] { 
        "ཉི",
        "ཟླ",
        "མི",
        "ཧླ",
        "ཕུ",
        "ས",
        "སྤེ"
    };
  }

  @Override
  public String[] weekdaysNarrowStandalone() {
    return weekdaysNarrow();
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] { 
        "ཉི་མ་",
        "ཟླ་བ་",
        "མིག་དམར་",
        "ཧླག་པ་",
        "ཕུར་བུ་",
        "སངས་",
        "སྤེན་པ་"
    };
  }

  @Override
  public String[] weekdaysShortStandalone() {
    return weekdaysShort();
  }
}
