/*
 * 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
//  cldrVersion=21.0
//  number=$Revision: 6546 Google $
//  date=$Date: 2012-02-07 13:32:35 -0500 (Tue, 07 Feb 2012) $
//  type=root

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

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

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

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

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

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

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

  @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[] monthsNarrow() {
    return new String[] {
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12"
    };
  }

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

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

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

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

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

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

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

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

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