/** @file
  String definitions for the Shell application IfConfig6.

  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>

  This program and the accompanying materials
  are licensed and made available under the terms and conditions
  of the BSD License which accompanies this distribution.  The full
  text of the license may be found at<BR>
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#langdef en-US "English"

#string STR_IFCONFIG6_ERR_IP6CFG_GETDATA       #language en-US    "Ip6Config->GetData return %hr\n"
#string STR_IFCONFIG6_INFO_BREAK               #language en-US    "-----------------------------------------------------------------"
#string STR_IFCONFIG6_INFO_COLON               #language en-US    ":"
#string STR_IFCONFIG6_INFO_JOINT               #language en-US    " >> "
#string STR_IFCONFIG6_INFO_NEWLINE             #language en-US    "\n"
#string STR_IFCONFIG6_INFO_IF_NAME             #language en-US    "\n%Hname         : %s%N\n"
#string STR_IFCONFIG6_INFO_POLICY_AUTO         #language en-US    "%Hpolicy       : automatic%N\n"
#string STR_IFCONFIG6_INFO_POLICY_MAN          #language en-US    "%Hpolicy       : manual%N\n"
#string STR_IFCONFIG6_INFO_DAD_TRANSMITS       #language en-US    "%Hdad xmits    : %d%N\n"
#string STR_IFCONFIG6_INFO_INTERFACE_ID_HEAD   #language en-US    "%Hinterface id : %N"
#string STR_IFCONFIG6_INFO_MAC_ADDR_HEAD       #language en-US    "%Hmac addr     : %N"
#string STR_IFCONFIG6_INFO_MAC_ADDR_BODY       #language en-US    "%02x"
#string STR_IFCONFIG6_INFO_IP_ADDR_HEAD        #language en-US    "\n%Hhost addr    : %N\n"
#string STR_IFCONFIG6_INFO_DNS_ADDR_HEAD       #language en-US    "\n%Hdns server   : %N\n"
#string STR_IFCONFIG6_INFO_IP_ADDR_BODY        #language en-US    "%02x"
#string STR_IFCONFIG6_INFO_IP_ADDR_BODY4BIT    #language en-US    "%x"
#string STR_IFCONFIG6_INFO_ROUTE_HEAD          #language en-US    "\n%Hroute table  : %N\n"
#string STR_IFCONFIG6_INFO_PREFIX_LEN          #language en-US    "/%d"

#string STR_IFCONFIG6_LINE_HELP                #language en-US    "Displays or modifies the IPv6 configuration"
#string STR_IFCONFIG6_HELP                     #language en-US    "Displays or modifies IPv6 configuration for network interface.\n\n"
                                                                  "Usage:\n"
                                                                  "  IfConfig6 [-b] [-r {ifname}] [-l {ifname}] [-s {ifname} {command ...}] [-?]\n"
                                                                  "\n"
                                                                  "Option:\n"
                                                                  "  -b (break) enable page break.\n"
                                                                  "  -r (renew) renew configuration of interface and set automatic policy.\n"
                                                                  "  -l (list)  list the configuration of interface.\n"
                                                                  "  -s (set)   set configuration of interface as follows.\n"
                                                                  "  -? (help)  list the help documentation.\n"
                                                                  "     |man/auto     manual or automatic policy\n"
                                                                  "     |id  {mac}    alternative interface id.\n"
                                                                  "     |dad {num}    dad transmits count.\n"
                                                                  "     |host{ip}     static host ip address, must under manual policy.\n"
                                                                  "     |gw  {ip}     gateway ip address, must under manual policy.\n"
                                                                  "     |dns {ip}     dns server ip address, must under manual policy.\n"
                                                                  "\n"
                                                                  "Example:\n"
                                                                  "  IfConfig6 -l\n"
                                                                  "  IfConfig6 -b -l\n"
                                                                  "  IfConfig6 -r eth0\n"
                                                                  "  IfConfig6 -s eth0 auto dad 10\n"
                                                                  "  IfConfig6 -s eth0 man id ff:dd:aa:88:66:cc\n"
                                                                  "  IfConfig6 -s eth1 man host 2002::1/64 2002::2/64 gw 2002::3\n"
#string STR_IFCONFIG6_ERR_LACK_INTERFACE       #language en-US    "Lack interface name.\n"
                                                                  "Usage: IfConfig6 -s {ifname} {config options ...}\n"
                                                                  "Example: IfConfig6 -s eth0 auto\n"
#string STR_IFCONFIG6_LACK_OPTION              #language en-US    "Flags lack. Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_CONFLICT_OPTIONS         #language en-US    "Flags conflict. Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_ERR_LACK_COMMAND         #language en-US    "Lack interface config option.\n"
                                                                  "Usage: IfConfig6 -s {ifname} {config options ...}\n"
                                                                  "Example: IfConfig6 -s eth0 auto\n"
#string STR_IFCONFIG6_ERR_INVALID_INTERFACE    #language en-US    "Invalid interface name.\n"
                                                                  "Hint: Use {IfConfig6 -l} to check existing interface names.\n"
#string STR_IFCONFIG6_ERR_INVALID_COMMAND      #language en-US    "Invalid command. Bad command %H%s%N is skipped.\n"
                                                                  "Hint: Incorrect option or arguments. Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_ERR_LACK_ARGUMENTS       #language en-US    "Lack arguments. Bad command %H%s%N is skipped.\n"
                                                                  "Hint: Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_ERR_LACK_OPTION          #language en-US    "Lack options.\n"
                                                                  "Hint: Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_ERR_MAN_HOST             #language en-US    "Manual address configuration failed. Please retry.\n"
#string STR_IFCONFIG6_ERR_DUPLICATE_COMMAND    #language en-US    "Duplicate commands. Bad command %H%s%N is skipped.\n"
                                                                  "Hint: Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_ERR_CONFLICT_COMMAND     #language en-US    "Conflict commands. Bad command %H%s%N is skipped.\n"
                                                                  "Hint: Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_ERR_UNKNOWN_COMMAND      #language en-US    "Unknown commands. Bad command %H%s%N is skipped.\n"
                                                                  "Hint: Please type 'IfConfig6 -?' for help info.\n"
#string STR_IFCONFIG6_ERR_ADDRESS_FAILED       #language en-US    "It failed to set .\n"
#string STR_IFCONFIG6_INVALID_IP               #language en-US    "%IfConfig6: Invalid IP6 address, %s\n"
