// Copyright (C) 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
//*******************************************************************************
//*
//*   Copyright (C) 2003, International Business Machines
//*   Corporation and others.  All Rights Reserved.
//*
//*******************************************************************************

/**
 * These are top level comments for the bundle. Tag name: ra
 * @translate yes
 * @note Comments for tag named ra
 */
ra{
    /**
     * Top level comments for the string.Tag name: test1
     * @translate yes
     * @note {0} represents the position of OSNAME and {1} represents the position of job name
     *       e.g: The OS/400 job named SYSLOG
     */
    test1{"The {0} job named {1}"} 
    /**
     * Tag name: test2
     * @note This resource is for test2
     * @translate yes
     */
    test2{"some translatable stuff"} 

    /**
     * Top level comments for TestTable. Tag name: TestTable
     * @translate yes
     * @note This resource is for TestTable
     */
    TestTable{
        /**
         * Tag name: test3
         * @translate yes
         * @note This resource is for test3
         */
        test3{"jasldjfa"}
        /**
         * Tag name: test4
         * @translate yes
         * @note This resource is for test4
         */
        test4{"asdfasdf"}
        /**
         * Tag name: test5
         * @translate yes
         * @note This resource is for test5
         */
        test5:int{1}
        /**
         * Tag name: test6
         * @translate yes
         * @note This resource is for test6
         */
        test6:bin{"0102"}
    }
    /**
     * Top level comments for Tag name: TestArray
     * @translate yes
     * @note This resource is for Tag name: Array
     */
    TestArray{
        /**
         * comments for un-named string
         * @translate yes
         * @note This resource is un-named string
         */
        :string{"abcde"},
        /** 
         * comments for un-named int
         * @translate yes
         * @note This resource is un-named int
         */
        :int{1},
        /**
         * comments for un-named binary
         * @translate yes
         * @note This resource is for un-named binary
         */
        :bin{"12312312"}
    }
    
    /**
     * comments for TestInclude
     * @translate yes
     * @note This resource is for TestInclude
     */
    TestInclude:include{"translit_rules.txt"}

    /**
     * comments for TestImport
     * @translate yes
     * @note This resource is for TestImport
     */
    TestImpport:import{"importtest.bin"}

    /**
     * comments for TestIntVector
     * @translate yes
     * @note This resource is for TestIntVector
     */
     TestIntVector{
        /**
         * comments for element 1
         * @translate yes
         * @note This resource is for element 1
         */
         1,
        /**
         * comments for element 2
         * @translate yes
         * @note This resource is for element 2
         */
         2,
        /**
         * comments for element 3
         * @translate yes
         * @note This resource is for element 3
         */
         3
     }
        
}
