/*
 * Copyright (C) 2013 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

(function() {
    if (WI.dontLocalizeUserInterface)
        return;

    let localizedStringsURL = InspectorFrontendHost.localizedStringsURL;
    console.assert(localizedStringsURL);
    if (localizedStringsURL)
        document.write("<script src=\"" + localizedStringsURL + "\"></script>");
})();

WI.unlocalizedString = function(string)
{
    // Intentionally do nothing, since this is for engineering builds
    // (such as in Debug UI) or in text that is standardized in English.
    // For example, CSS property names and values are never localized.
    return string;
};

WI.UIString = function(string, key, comment)
{
    "use strict";

    if (WI.dontLocalizeUserInterface)
        return string;

    // UIString(string, comment)
    if (arguments.length === 2) {
        comment = key;
        key = undefined;
    }

    key = key || string;

    if (window.localizedStrings && key in window.localizedStrings)
        return window.localizedStrings[key];

    if (!window.localizedStrings)
        console.error(`Attempted to load localized string "${key}" before localizedStrings was initialized.`, comment);

    if (!this._missingLocalizedStrings)
        this._missingLocalizedStrings = {};

    if (!(key in this._missingLocalizedStrings)) {
        console.error(`Localized string "${key}" was not found.`, comment);
        this._missingLocalizedStrings[key] = true;
    }

    return "LOCALIZED STRING NOT FOUND";
};

WI.repeatedUIString = {};

WI.repeatedUIString.timelineRecordLayout = function() {
    return WI.UIString("Layout", "Layout @ Timeline record", "Layout phase timeline records");
};

WI.repeatedUIString.timelineRecordPaint = function() {
    return WI.UIString("Paint", "Paint @ Timeline record", "Paint (render) phase timeline records");
};

WI.repeatedUIString.timelineRecordComposite = function() {
    return WI.UIString("Composite", "Composite @ Timeline record", "Composite phase timeline records, where graphic layers are combined");
};

WI.repeatedUIString.allExceptions = function() {
    return WI.UIString("All Exceptions", "Break (pause) on all exceptions");
};

WI.repeatedUIString.uncaughtExceptions = function() {
    return WI.UIString("Uncaught Exceptions", "Break (pause) on uncaught (unhandled) exceptions");
};

WI.repeatedUIString.assertionFailures = function() {
    return WI.UIString("Assertion Failures", "Break (pause) when console.assert() fails");
};

WI.repeatedUIString.allRequests = function() {
    return WI.UIString("All Requests", "A submenu item of 'Break on' that breaks (pauses) before all network requests");
};

WI.repeatedUIString.fetch = function() {
    return WI.UIString("Fetch", "Resource loaded via 'fetch' method");
};

WI.repeatedUIString.revealInDOMTree = function() {
    return WI.UIString("Reveal in DOM Tree", "Open Elements tab and select this node in DOM tree");
};
