// Copyright (C) 2008 The Android Open Source Project
//
// 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.gerrit.client.admin;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.Messages;

public interface AdminMessages extends Messages {
  AdminMessages I = GWT.create(AdminMessages.class);

  String group(String name);

  String label(String name);

  String labelAs(String name);

  String project(String name);

  String deletedGroup(int id);

  String deletedReference(String name);

  String deletedSection(String name);

  String effectiveMaxObjectSizeLimit(String effectiveMaxObjectSizeLimit);

  String noMaxObjectSizeLimit();

  String pluginProjectOptionsTitle(String pluginName);

  String pluginProjectInheritedValue(String value);

  String pluginProjectInheritedListValue(String value);
}
