

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you 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.
*/


/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */
(function(root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports'], factory);
    } else if (
        typeof exports === 'object' &&
        typeof exports.nodeName !== 'string'
    ) {
        // CommonJS
        factory(exports);
    } else {
        // Browser globals
        factory({});
    }
})(this, function(exports) {


/**
 * Language: Romanian.
 */

 var localeObj = {
    time: {
        month: [
            'ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie',
            'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'
        ],
        monthAbbr: [
            'ian.', 'febr.', 'mart.', 'apr.', 'mai', 'iun.',
            'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'
        ],
        dayOfWeek: [
            'Duminică', 'Luni', 'Marți', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'
        ],
        dayOfWeekAbbr: [
            'du.', 'lu.', 'ma.', 'mi.', 'jo.', 'vi.', 'sâ.'
        ]
    },
    legend: {
        selector: {
            all: 'Toate',
            inverse: 'Inversează'
        }
    },
    toolbox: {
        brush: {
            title: {
                rect: 'Selecție dreptunghiulară',
                polygon: 'Selecție lasso',
                lineX: 'Selecție orizontală',
                lineY: 'Selecție verticală',
                keep: 'Păstrează selecția',
                clear: 'Șterge selecția'
            }
        },
        dataView: {
            title: 'Vizualizarea datelor',
            lang: ['Vizualizarea datelor', 'Închide', 'Reîmprospătează']
        },
        dataZoom: {
            title: {
                zoom: 'Zoom',
                back: 'Resetează zoom'
            }
        },
        magicType: {
            title: {
                line: 'Comută la diagramă cu linii',
                bar: 'Comută la diagramă cu bare',
                stack: 'Suprapune',
                tiled: 'Alătură'
            }
        },
        restore: {
            title: 'Resetează'
        },
        saveAsImage: {
            title: 'Salvează ca imagine',
            lang: ['Clic dreapta pentru a salva ca imagine']
        }
    },
    series: {
        typeNames: {
            pie: 'Diagramă radială',
            bar: 'Diagramă cu bare',
            line: 'Diagramă cu linii',
            scatter: 'Diagramă de dispersie',
            effectScatter: 'Diagramă de dispersie stilizată',
            radar: 'Diagramă radar',
            tree: 'Arbore',
            treemap: 'Hartă de arbori',
            boxplot: 'Diagramă boxbare',
            candlestick: 'Diagramă bursieră',
            k: 'Diagramă cu linii K',
            heatmap: 'Hartă termografică',
            map: 'Hartă',
            parallel: 'Hartă de coordonate paralele',
            lines: 'Linii',
            graph: 'Graf',
            sankey: 'Diagramă Sankey',
            funnel: 'Diagramă pâlnie',
            gauge: 'Calibru',
            pictorialBar: 'Diagramă cu bare picturale',
            themeRiver: 'Streamgraph',
            sunburst: 'Diagramă rază de soare'
        }
    },
    aria: {
        general: {
            withTitle: 'Aceasta este o diagrmă despre "{title}"',
            withoutTitle: 'Aceasta este o diagramă'
        },
        series: {
            single: {
                prefix: '',
                withName: ' de tipul {seriesType} denumită {seriesName}.',
                withoutName: ' de tipul {seriesType}.'
            },
            multiple: {
                prefix: '. Este alcătuită din {seriesCount} serii.',
                withName: ' Seria {seriesId} este de tipul {seriesType} și reprezintă {seriesName}.',
                withoutName: ' Seria {seriesId} este de tipul {seriesType}.',
                separator: {
                    middle: '',
                    end: ''
                }
            }
        },
        data: {
            allData: 'Datele sunt: ',
            partialData: 'Primele {displayCnt} elemente sunt: ',
            withName: 'datele pentru {name} sunt {value}',
            withoutName: '{value}',
            separator: {
                middle: ', ',
                end: '. '
            }
        }
    }
};

    for (var key in localeObj) {
        if (localeObj.hasOwnProperty(key)) {
            exports[key] = localeObj[key];
        }
    }
        
});