/*
 * REG.EXE - Wine-compatible reg program.
 * Japanese language support
 *
 * Copyright 2008 Andrew Riedi
 *
 * 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 "reg.h"

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

LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT

STRINGTABLE
{
    STRING_USAGE, "このコマンドの構文は次のとおりです:\n\nREG [ ADD | DELETE | QUERY ]\nREG コマンド /?\n"
    STRING_ADD_USAGE, "REG ADD キー名 [/v 値名 | /ve] [/t type] [/s セパレータ] [/d データ] [/f]\n"
    STRING_DELETE_USAGE, "REG DELETE キー名 [/v 値名 | /ve | /va] [/f]\n"
    STRING_QUERY_USAGE, "REG QUERY キー名 [/v 値名 | /ve] [/s]\n"
    STRING_SUCCESS, "操作は正常に完了しました\n"
    STRING_INVALID_KEY, "エラー: キー名が無効です\n"
    STRING_INVALID_CMDLINE, "エラー: コマンド ライン引数が無効です\n"
    STRING_NO_REMOTE, "エラー: リモート マシンにキーを追加できませんでした\n"
    STRING_CANNOT_FIND, "エラー: システムは指定されたキーまたは値を見つけられませんでした\n"
}
