/*
 * Serbian resources for MSI
 *
 * Copyright 2010 Nenad Vujic
 *                Paul Vriens
 * Copyright 2010 Đorđe Vasiljević
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "windef.h"

#pragma code_page(65001)

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

STRINGTABLE DISCARDABLE
{
	4 "Instalacioni paket ne može biti otvoren.  Proverite putanju datoteke i pokušajte ponovo."
	5 "%s putanja nije pronađena"
	9 "Ubacite disk %s"
	10 "Windows instalacija programa %s\n\n" \
	"Upotreba:\n" \
	"msiexec naredba {obavezan parametar} [neobavezan parametar]\n\n" \
	"Instalacija proizvoda:\n" \
	"\t/i {paket|kôd} [svojina]\n" \
	"\t/package {paket|kôd} [svojina]\n" \
	"\t/a paket [svojina]\n" \
	"Popravka instalacije:\n" \
	"\t/f[p|o|e|d|c|a|u|m|s|v] {paket|kôd}\n" \
	"Uklanjanje proizvoda:\n" \
	"\t/deinstalacija {paket|kôd} [svojina]\n" \
	"\t/x {paket|kôd} [svojina]\n" \
	"Reklama proizvoda:\n" \
	"\t/j[u|m] paket [/t pretvori] [/g ID jezika]\n" \
	"Primena zakrpe:\n" \
	"\t/p zakrpa [svojina]\n" \
	"\t/p zakrpa/paket [svojina]\n" \
	"Izveštaj i izgled izmenjivača za naredbe iznad:\n" \
	"\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] izveštaj\n" \
	"\t/q{|n|b|r|f|n+|b+|b-}\n" \
	"Registracija MSI usluge:\n" \
	"\t/y\n" \
	"Odjava MSI usluge:\n" \
	"\t/z\n" \
	"Prikaži pomoć:\n" \
	"\t/pomoć\n" \
	"\t/?\n"
	11 "unesite koja fascikla sadrži %s"
	12 "nedostaje instalacija"
	13 "nedostaje mrežna jedinica"
	14 "mogućnost od:"
	15 "izaberite koja fascikla sadrži %s"
}

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC

STRINGTABLE DISCARDABLE
{
	4 "Инсталациони пакет не може бити отворен.  Проверите путању датотеке и покушајте поново."
	5 "%s путања није пронађена"
	9 "Убаците диск %s"
	10 "Windows инсталација програма %s\n\n" \
	"Употреба:\n" \
	"msiexec наредба {обавезан параметар} [необавезан параметар]\n\n" \
	"Инсталација производа:\n" \
	"\t/i {пакет|кôд} [својина]\n" \
	"\t/package {пакет|кôд} [својина]\n" \
	"\t/a пакет [својина]\n" \
	"Поправка инсталације:\n" \
	"\t/f[p|o|e|d|c|a|u|m|s|v] {пакет|кôд}\n" \
	"Уклањање производа:\n" \
	"\t/деинсталација {пакет|кôд} [својина]\n" \
	"\t/x {пакет|кôд} [својина]\n" \
	"Реклама производа:\n" \
	"\t/j[u|m] пакет [/t претвори] [/g ID језика]\n" \
	"Примена закрпе:\n" \
	"\t/p закрпа [својина]\n" \
	"\t/p закрпа/пакет [својина]\n" \
	"Извештај и изглед измењивача за наредбе изнад:\n" \
	"\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] извештај\n" \
	"\t/q{|n|b|r|f|n+|b+|b-}\n" \
	"Регистрација MSI услуге:\n" \
	"\t/y\n" \
	"Одјава MSI услуге:\n" \
	"\t/z\n" \
	"Прикажи помоћ:\n" \
	"\t/помоћ\n" \
	"\t/?\n"
	11 "унесите која фасцикла садржи %s"
	12 "недостаје инсталација"
	13 "недостаје мрежна јединица"
	14 "могућност од:"
	15 "изаберите која фасцикла садржи %s"
}
