/* * Copyright 2008 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; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * This is the common superinterface to Messages and Constants. * * Each (and the Constants subinterface ConstantsWithLookup) provide * compile-time localization of various forms of data. Messages is * used for <code>MessageFormat</code>-style strings which can have * parameters (including support for plural forms), while Constants * can be other types, have simplified quoting requirements, and do * not take any parameters. * * The annotations defined here are common to both -- see the individual * subinterfaces for additional annotations which apply only to each * one. */ public interface LocalizableResource extends Localizable { /** * Specifies the default locale for messages in this file. If not * specified, the default is <code>DEFAULT_LOCALE</code>. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface DefaultLocale { String DEFAULT_LOCALE = "en"; String value() default DEFAULT_LOCALE; } /** * Specifies a description of the string to be translated, such as a note * about the context. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Description { String value(); } /** * Requests that a translation source file be generated from the annotated * interface. The file type is determined by the format argument, and the * file name by the optional fileName argument. Some file formats support * aggregating messages from multiple interfaces into one file, while others * do not; also, additional parameters may be specified via format-specific * annotations -- see the documentation of the MessageCatalogFormat implementation * for details. * * Examples: * <ul> * <li>@Generate(format = "com.google.gwt.i18n.server.PropertyCatalogFactory") * <br>generates properties files for all locales, and the names will be * of the form MyMessages_locale.properties * <li>@Generate(format = {"com.example.ProprietaryFormat1", * "com.example.ProprietaryFormat2"}, * fileName = "myapp_translate_source", locales = {"default"}) * <br>generates default files in two proprietary formats, with filenames like * myapp_translate_source.p1 and myapp_translate_source.p2 * </pre></code> */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Generate { /** * Placeholder used to detect that no value was supplied for the fileName * parameter. */ String DEFAULT = "[default]"; /** * Fully-qualified class names of the generator classes. Each class must * implement com.google.gwt.i18n.server.MessageCatalogFactory * (com.google.gwt.i18n.rebind.format.MessageCatalogFormat still works, but * is deprecated). * * Strings are used here instead of class literals because the generators * will likely contain non-translatable code and thus can't be referenced * from translatable code directly. * * Each generator may define additional annotations to supply other * necessary parameters. */ String[] format(); /** * A platform-specific filename for output. If not present, the file will be * named based on the fully-qualified name of the annotated interface. File * names without a slash are given a relative name based on the * fully-qualified package name of the annotated interface. Relative * pathnames are generated in the auxiliary module directory (moduleName-aux * in the output directory, which is specified by the "-out" flag to the * compiler, or the current directory if not present) -- absolute path names * are not allowed. Unless exactly one locale is specified for locales (not * just only one locale happened to be compiled for), the locale will be * appended to the name (such as _default [for the default locale], _en_US, * etc) as well as the proper extension for the specified format. * * Note that if multiple generators are used, they will have the same base * filename so the extensions must be different. */ String fileName() default DEFAULT; /** * A list of locales for which to generate this output file. If no locales * are specified, all locales for which the application is compiled for will * be generated. Note that the default locale is "default". */ String[] locales() default {}; } /** * Annotation indicating this is a generated file and the source file it was * generated from. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface GeneratedFrom { String value(); } /** * Requests that the keys for messages be generated automatically. If the * annotation is supplied with no value, the default is to use an MD5 hash of * the text and meaning. If this annotation is not supplied, the keys will be * the unqualified method names. * * <p>The value is either the name of an inner class of {@code KeyGenerator} or the * fully-qualified class name of some implementation of {@code KeyGenerator}. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface GenerateKeys { String value() default "com.google.gwt.i18n.server.keygen.MD5KeyGenerator"; } /** * The key used for lookup of translated strings. If not present, the * key will be generated based on the {@code @GenerateKeys} annotation, * or the unqualified method name if it is not present. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Key { String value(); } /** * Specifies the meaning of the translated string. For example, to * distinguish between multiple meanings of a word or phrase. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface Meaning { String value(); } }