###############################################################################
# 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.
###############################################################################
### This file contains labels directly translated by XUI framework
CASH=NUMERAR
CASH_DRAWER_COMMUNICATION_ERROR=EROARE DE COMUNICARE CU REGISTRATORUL DE CASA
CASH_DRAWER_IS_OPEN=REGISTRATORUL DE CASA ESTE DESCHIS
CHANGE_PRICE=SCHIMBA PRETUL
CHECK=CEC
CLEAR_ALL=AZEREAZA TOTUL
CLEAR_CACHE=CURATA NUMERAR
CLEAR_ONE=AZZEREAZA UNUL
CLOSE=INCHIDE
CLR=CURATA
CLR_DISC=CURATA REDUCERE
CREDIT=CREDIT
DEL=STERGE
ENT=INTRODUCETI
EXCEPTION=EXCEPTIE
EXIT=IESIRE
FINISH=TERMINARE
FUNCTION_NOT_YET_SUPPORTED=FUNCTIE NE SUPORTATA INCA
GIFT_CERT=CERTIFICAT OMAGIU
INVALID_CARD_NUMBER=NUMAR CARTE INVALID
ITEM_DISC=SCONT PRODUS
ITEM_MODIFICATION_ERROR=EROARE MODIFICARE PRODUS
LANG=LIMBA
LOCK=BLOCHEAZA
MAIN=PRINCIPALA
MANAGER_NOT_LOGGED_IN=MANAGER NE AUTENTIFICA
MGR=MGR
MOD=MOD
NOT_ENOUGH_FUNDS=CLIENTUL NU FURNIZEAZA DESTULE FONDURI PENTRU COMPLETAREA ACESTEI VANZARI
NO_ITEMS_SOLD=NICIUN PRODUS VANDUT
OPEN=DESCHIDE
OPEN_DRAWER=DESCHIDE CASETA
PAY=PLATA
PRINTER_NOT_READY=IMPRIMANTA NU ESTE GATA
PROMO=PROMO
QTY=CANT
RECEIPT_PRINTER_COMMUNICATION_ERROR=EROARE LA PRIMIREA COMUNICARII DE TIPARIRE
REPRINT=RETIPARESTE
RESET_XUI=AZEREAZA XUI
SALE_DISC=SCONT VANZARE
SALE_VOIDED=VANZARE GOALA
SET_REF\#=SETEAZA RIF#
SIGN_OUT=SIGN AUT
SKU=COD PRODUS
TERMINAL_IS_CLOSED=TERMINAL INCHIS
TEST_ALERT=TEST AVIZARE
TEST_ALERT_BOX=AVIZ TEST BOX - TESTAND DIALOGUL IMPLEMENTRE
TEST_MSR=TEST MSR
TOTALS=TOTAL
TRANS_RET=RETURNARE TRANZACTIE
TRANS_SAVE=SALVEAZA TRANZACTIA
UNKNOWN_CARD_TYPE=TIP CARTE NECUNOSCUT
VOID_ITEM=PRODUS GOL
VOID_SALE=VANZARE GOALA
order_not_found=COMANDA NEGASITA
problems_reading_card=PROBLEME LA CITIREA CARDULUI
product_not_found=NU GASESTE PRODUSUL
promo_page=Acesta va fi in pagina de promotie!
