// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_BASE_L10N_L10N_UTIL_MAC_H_
#define UI_BASE_L10N_L10N_UTIL_MAC_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/strings/string16.h"
#include "ui/base/ui_base_export.h"

#ifdef __OBJC__
@class NSString;
#else
class NSString;
#endif

namespace l10n_util {

// Remove the Windows-style accelerator marker (for labels, menuitems, etc.)
// and change "..." into an ellipsis.
// Returns the result in an autoreleased NSString.
UI_BASE_EXPORT NSString* FixUpWindowsStyleLabel(const base::string16& label);

// Pulls resource string from the string bundle and returns it.
UI_BASE_EXPORT NSString* GetNSString(int message_id);

// Get a resource string and replace $1-$2-$3 with |a| and |b|
// respectively.  Additionally, $$ is replaced by $.
UI_BASE_EXPORT NSString* GetNSStringF(int message_id, const base::string16& a);
UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
                                      const base::string16& a,
                                      const base::string16& b);
UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
                                      const base::string16& a,
                                      const base::string16& b,
                                      const base::string16& c);
UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
                                      const base::string16& a,
                                      const base::string16& b,
                                      const base::string16& c,
                                      const base::string16& d);

// Variants that return the offset(s) of the replaced parameters. (See
// app/l10n_util.h for more details.)
UI_BASE_EXPORT NSString* GetNSStringF(int message_id,
                                      const base::string16& a,
                                      const base::string16& b,
                                      std::vector<size_t>* offsets);

// Same as GetNSString, but runs the result through FixUpWindowsStyleLabel
// before returning it.
UI_BASE_EXPORT NSString* GetNSStringWithFixup(int message_id);

// Same as GetNSStringF, but runs the result through FixUpWindowsStyleLabel
// before returning it.
UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
                                               const base::string16& a);
UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
                                               const base::string16& a,
                                               const base::string16& b);
UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
                                               const base::string16& a,
                                               const base::string16& b,
                                               const base::string16& c);
UI_BASE_EXPORT NSString* GetNSStringFWithFixup(int message_id,
                                               const base::string16& a,
                                               const base::string16& b,
                                               const base::string16& c,
                                               const base::string16& d);

// Support the override of the locale with the value from Cocoa.
UI_BASE_EXPORT void OverrideLocaleWithCocoaLocale();
UI_BASE_EXPORT const std::string& GetLocaleOverride();

}  // namespace l10n_util

#endif  // UI_BASE_L10N_L10N_UTIL_MAC_H_
