/*
 * cryptdlg dll resources
 *
 * Copyright 2008 Juan Lang
 * Copyright 2010 Igor Paliychuk
 *
 * 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 "cryptres.h"

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

LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT

STRINGTABLE DISCARDABLE
{
    IDS_CERT_POLICY "Політика сертифікату"
    IDS_POLICY_ID "Ідентифікатор політики: "
    IDS_POLICY_QUALIFIER_INFO "Інформація про вказівник політики"
    IDS_POLICY_QUALIFIER_ID "Id вказівника політики="
    IDS_CPS "CPS" /* Certification Practice Statement */
    IDS_USER_NOTICE "Повідомлення користувача"
    IDS_QUALIFIER "Визначник"
    IDS_NOTICE_REF "Посилання повідомлення"
    IDS_ORGANIZATION "Організація="
    IDS_NOTICE_NUM "Номер повідомлення="
    IDS_NOTICE_TEXT "Текст повідомлення="
}
