/*
 * Copyright 2014 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=25
//  date=$Date: 2014-03-06 06:14:25 +0100 (Thu, 06 Mar 2014) $
//  number=$Revision: 9876 $
//  type=si

/**
 * 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 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 formatYearMonthNumDay() {
    return "y-M-d";
  }

  @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 "a h.mm.ss zzzz";
  }

  @Override
  public String timeFormatLong() {
    return "a h.mm.ss 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[] {
        "ඉරිදා",
        "සඳුදා",
        "අඟහ",
        "බදාදා",
        "බ්‍රහස්",
        "සිකු",
        "සෙන"
    };
  }
}
