/*
 * 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

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

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

  @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 formatHour24Minute() {
    return "HH.mm";
  }

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

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

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

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

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

  @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 "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[] weekdaysNarrow() {
    return new String[] {
        "ඉ",
        "ස",
        "අ",
        "බ",
        "බ්‍ර",
        "සි",
        "සෙ"
    };
  }

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