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

/**
 * Implementation of DateTimeFormatInfo for the "mk" locale.
 */
public class DateTimeFormatInfoImpl_mk extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "претпладне",
        "попладне"
    };
  }

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

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

  @Override
  public String dateFormatMedium() {
    return "dd.M.yyyy";
  }

  @Override
  public String dateFormatShort() {
    return "dd.M.yy";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "пр.н.е.",
        "ае."
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "пр.н.е.",
        "ае."
    };
  }

  @Override
  public String formatYearMonthFullDay() {
    return "d MMMM 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[] weekdaysFull() {
    return new String[] {
        "недела",
        "понеделник",
        "вторник",
        "среда",
        "четврток",
        "петок",
        "сабота"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "н",
        "п",
        "в",
        "с",
        "ч",
        "п",
        "с"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "нед.",
        "пон.",
        "вт.",
        "сре.",
        "чет.",
        "пет.",
        "саб."
    };
  }
}
