/*
 * Lithuanian resources for MSI
 *
 * Copyright 2009 Aurimas Fišeras <aurimas@gmail.com>
 *
 * 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"

/* UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL

STRINGTABLE DISCARDABLE
{
	4 "Nepavyko atverti nurodyto diegimo paketo. Patikrinkite failo kelią ir mėginkite dar kartą."
	5 "kelias %s nerastas"
	9 "įdėkite diską %s"
	10 "Windows diegimo programa %s\n\n" \
	"Naudojimas:\n" \
	"msiexec komanda {būtinas parametras} [nebūtinas parametras]\n\n" \
	"Įdiegti produktą:\n" \
	"\t/i {paketas|produkto_kodas} [savybė]\n" \
	"\t/package {paketas|produkto_kodas} [savybė]\n" \
	"\t/a paketas [savybė]\n" \
	"Taisyti įdiegimą:\n" \
	"\t/f[p|o|e|d|c|a|u|m|s|v] {paketas|produkto_kodas}\n" \
	"Pašalinti produktą:\n" \
	"\t/uninstall {paketas|produkto_kodas} [savybė]\n" \
	"\t/x {paketas|produkto_kodas} [savybė]\n" \
	"Skelbti produktą:\n" \
	"\t/j[u|m] paketas [/t pakeitimas] [/g kalbos_identifikatorius]\n" \
	"Pritaikyti pataisą:\n" \
	"\t/p pataisos_paketas [savybė]\n" \
	"\t/p pataisos_paketas /a paketas [savybė]\n" \
	"Žurnalo ir sąsajos modifikatoriai aukščiau išvardintoms komandoms:\n" \
	"\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] žurnalo_failas\n" \
	"\t/q{|n|b|r|f|n+|b+|b-}\n" \
	"Registruoti MSI tarnybą:\n" \
	"\t/y\n" \
	"Išregistruoti MSI tarnybą:\n" \
	"\t/z\n" \
	"Parodyti šią pagalbą:\n" \
	"\t/help\n" \
	"\t/?\n"
	11 "įveskite aplanką, kuris turi %s"
	12 "trūksta diegimo šaltinio komponentui"
	13 "trūksta tinklo disko komponentui"
	14 "komponentas iš:"
	15 "parinkite aplanką, kuris turi %s"
}
