/*
 * 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 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 dateFormatFull() {
    return "EEEE, y MMMM 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 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[] 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 "h:mm:ss a";
  }

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

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

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

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