/*
 * 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.shared.impl.cldr;

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA

/**
 * Implementation of DateTimeFormatInfo for the "pa" locale.
 */
public class DateTimeFormatInfoImpl_pa extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "ਸਵੇਰੇ",
        "ਸ਼ਾਮ"
    };
  }

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

  @Override
  public String dateFormatLong() {
    return "d MMMM y";
  }

  @Override
  public String dateFormatMedium() {
    return "d MMM y";
  }

  @Override
  public String dateFormatShort() {
    return "dd/MM/yyyy";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "ਈਸਾਪੂਰਵ",
        "ਸੰਨ"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "ਈਸਾਪੂਰਵ",
        "ਸੰਨ"
    };
  }

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

  @Override
  public String formatYearMonthAbbrev() {
    return "MMM y";
  }

  @Override
  public String formatYearMonthAbbrevDay() {
    return "d MMM y";
  }

  @Override
  public String formatYearMonthFull() {
    return "MMMM y";
  }

  @Override
  public String formatYearMonthFullDay() {
    return "d MMMM y";
  }

  @Override
  public String formatYearMonthNumDay() {
    return "d/M/y";
  }

  @Override
  public String formatYearMonthWeekdayDay() {
    return "EEE, d MMM y";
  }

  @Override
  public String formatYearQuarterFull() {
    return "QQQQ y";
  }

  @Override
  public String formatYearQuarterShort() {
    return "Q y";
  }

  @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[] {
        "ਪਹਿਲਾਂ ਚੌਥਾਈ",
        "ਦੂਜਾ ਚੌਥਾਈ",
        "ਤੀਜਾ ਚੌਥਾਈ",
        "ਚੌਥਾ ਚੌਥਾਈ"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "ਪਹਿਲਾਂ ਚੌਥਾਈ",
        "ਦੂਜਾ ਚੌਥਾਈ",
        "ਤੀਜਾ ਚੌਥਾਈ",
        "ਚੌਥਾ ਚੌਥਾਈ"
    };
  }

  @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[] {
        "ਐਤ.",
        "ਸੋਮ.",
        "ਮੰਗਲ.",
        "ਬੁਧ.",
        "ਵੀਰ.",
        "ਸ਼ੁਕਰ.",
        "ਸ਼ਨੀ."
    };
  }
}
