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

/**
 * Implementation of DateTimeFormatInfo for the "si" locale.
 */
public class DateTimeFormatInfoImpl_si extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "පෙ.ව.",
        "ප.ව."
    };
  }

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

  @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 formatHour12Minute() {
    return "a h.mm";
  }

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

  @Override
  public String formatMinuteSecond() {
    return "mm.ss";
  }

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

  @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[] monthsShortStandalone() {
    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 timeFormatFull() {
    return "h:mm:ss a zzzz";
  }

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

  @Override
  public String timeFormatMedium() {
    return "a h.mm.ss";
  }

  @Override
  public String timeFormatShort() {
    return "a h.mm";
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "ඉරිදා",
        "සඳුදා",
        "අඟහරුවාදා",
        "බදාදා",
        "බ්‍රහස්පතින්දා",
        "සිකුරාදා",
        "සෙනසුරාදා"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "ඉ",
        "ස",
        "අ",
        "බ",
        "බ්‍ර",
        "සි",
        "සෙ"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "ඉරි",
        "සඳු",
        "අඟ",
        "බදා",
        "බ්‍රහ",
        "සිකු",
        "සෙන"
    };
  }
}
