/*
 * Copyright 2006 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.sample.i18n.client;

import com.google.gwt.i18n.client.ConstantsWithLookup;

/**
 * Translated colors.
 */
public interface Colors extends ConstantsWithLookup {

  /**
   * Translated "Black".
   * 
   * @return translated "Black"
   * @gwt.key black
   */
  String black();

  /**
   * Translated "Blue".
   * 
   * @return translated "Blue"
   * @gwt.key blue
   */
  String blue();

  /**
   * Translated "Green".
   * 
   * @return translated "Green"
   * @gwt.key green
   */
  String green();

  /**
   * Translated "Grey".
   * 
   * @return translated "Grey"
   * @gwt.key grey
   */
  String grey();

  /**
   * Translated "Light Grey".
   * 
   * @return translated "Light Grey"
   * @gwt.key lightGrey
   */
  String lightGrey();

  /**
   * Translated "Red".
   * 
   * @return translated "Red"
   * @gwt.key red
   */
  String red();

  /**
   * Translated "White".
   * 
   * @return translated "White"
   * @gwt.key white
   */
  String white();

  /**
   * Translated "Yellow".
   * 
   * @return translated "Yellow"
   * @gwt.key yellow
   */
  String yellow();

}
