{"id":9849,"date":"2024-04-09T06:17:52","date_gmt":"2024-04-09T06:17:52","guid":{"rendered":"https:\/\/24hvape.com\/?page_id=9849"},"modified":"2026-08-25T09:42:38","modified_gmt":"2026-08-25T09:42:38","slug":"tracking","status":"publish","type":"page","link":"https:\/\/24hvape.com\/tracking\/","title":{"rendered":"Tracking"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"9849\" class=\"elementor elementor-9849\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3009e1f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3009e1f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-extended\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1fa73fd sc_layouts_column_icons_position_left\" data-id=\"1fa73fd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-350def6 elementor-widget elementor-widget-html\" data-id=\"350def6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n  :root {\n    --vp-brand: #f59e0b;           \/* \u8d34\u5408\u9876\u90e8\u5bfc\u822a\u7684\u54c1\u724c\u91d1\u9ec4\u8272 *\/\n    --vp-brand-hover: #d97706;\n    --vp-card-bg: #ffffff;\n    --vp-bg-sub: #f8fafc;\n    --vp-border: #e2e8f0;\n    --vp-text-main: #1e293b;\n    --vp-text-sub: #64748b;\n    --vp-radius: 12px;\n  }\n\n  \/* \u5916\u5c42\u7edf\u4e00\u5305\u88c5\u5bb9\u5668 *\/\n  .track-main,\n  .track-result,\n  .lang-switch {\n    max-width: 900px;\n    margin: 0 auto;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n    color: var(--vp-text-main);\n    box-sizing: border-box;\n  }\n\n  \/* \u6574\u5408\u641c\u7d22\u533a\u57df\u4e3a\u7edf\u4e00\u767d\u5e95\u5361\u7247 *\/\n  .track-main {\n    margin-top: 30px;\n    margin-bottom: 20px;\n    padding: 24px;\n    background: var(--vp-card-bg);\n    border: 1px solid var(--vp-border);\n    border-radius: var(--vp-radius);\n    box-shadow: 0 4px 20px -2px rgba(0, 0, 0, 0.05);\n  }\n\n  .track-main h6.track-title {\n    color: var(--vp-text-main) !important;\n    font-size: 13px !important;\n    font-weight: 700 !important;\n    letter-spacing: 0.5px !important;\n    text-transform: uppercase !important;\n    margin: 0 0 14px 0 !important;\n    display: flex !important;\n    align-items: center !important;\n    gap: 8px !important;\n  }\n\n  .track-main h6.track-title::before {\n    content: '' !important;\n    display: inline-block !important;\n    width: 4px !important;\n    height: 14px !important;\n    background: var(--vp-brand) !important;\n    border-radius: 2px !important;\n  }\n\n  .track-form {\n    display: flex;\n    gap: 10px;\n  }\n\n  .track-input {\n    flex: 1;\n    height: 48px;\n    background: var(--vp-bg-sub);\n    border: 1px solid var(--vp-border);\n    border-radius: 8px;\n    padding: 0 16px;\n    font-size: 14px;\n    color: var(--vp-text-main);\n    outline: none;\n    box-sizing: border-box;\n    transition: all 0.2s ease;\n  }\n\n  .track-input::placeholder {\n    color: #94a3b8;\n  }\n\n  .track-input:focus {\n    background: #ffffff;\n    border-color: var(--vp-brand);\n    box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.15);\n  }\n\n  \/* \u6309\u94ae\u4f7f\u7528\u54c1\u724c\u8272 *\/\n  .track-button {\n    height: 48px;\n    background: var(--vp-brand);\n    color: #ffffff;\n    font-size: 14px;\n    font-weight: 700;\n    letter-spacing: 0.5px;\n    text-transform: uppercase;\n    padding: 0 32px;\n    border-radius: 8px;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    user-select: none;\n    transition: all 0.2s ease;\n    box-shadow: 0 2px 8px rgba(245, 158, 11, 0.25);\n    white-space: nowrap;\n  }\n\n  .track-button:hover {\n    background: var(--vp-brand-hover);\n    box-shadow: 0 4px 12px rgba(245, 158, 11, 0.35);\n  }\n\n  \/* \u7ed3\u679c\u5217\u8868\uff1a\u6e05\u723d\u8868\u683c\u5316 *\/\n  .track-result {\n    margin-bottom: 20px;\n  }\n\n  .track-result > p {\n    text-align: center;\n    padding: 24px;\n    background: var(--vp-card-bg);\n    border: 1px dashed var(--vp-border);\n    border-radius: var(--vp-radius);\n    color: var(--vp-text-sub);\n    font-size: 14px;\n  }\n\n  .track-list {\n    list-style: none;\n    padding: 0;\n    margin: 0;\n    background: var(--vp-card-bg);\n    border: 1px solid var(--vp-border);\n    border-radius: var(--vp-radius);\n    box-shadow: 0 4px 20px -2px rgba(0, 0, 0, 0.05);\n    overflow: hidden;\n  }\n\n  .track-list li {\n    display: grid;\n    grid-template-columns: 180px 180px 1fr; \/* \u56fa\u5b9a\u4e09\u5217\u6805\u683c\uff0c\u675c\u7edd\u7a7a\u4f4d\u574d\u7f29 *\/\n    align-items: center;\n    padding: 14px 20px;\n    border-bottom: 1px solid var(--vp-border);\n    font-size: 13.5px;\n    line-height: 1.5;\n  }\n\n  .track-list li:last-child {\n    border-bottom: none;\n  }\n\n  \/* \u7b2c\u4e00\u6761\u6700\u65b0\u72b6\u6001\u8f7b\u9ad8\u4eae *\/\n  .track-list li:first-child {\n    background: #fffbeb;\n    border-left: 4px solid var(--vp-brand);\n  }\n\n  .track-list li:first-child .detail {\n    color: #92400e;\n    font-weight: 600;\n  }\n\n  .track-list .time {\n    color: var(--vp-text-sub);\n    font-size: 12.5px;\n    font-variant-numeric: tabular-nums;\n  }\n\n  .track-list .location {\n    color: var(--vp-text-main);\n    font-weight: 600;\n  }\n\n  .track-list .detail {\n    color: #334155;\n    word-break: break-word;\n  }\n\n  .track-list .detail a {\n    color: var(--vp-brand) !important;\n    text-decoration: underline;\n  }\n\n  \/* \u6781\u7b80\u8bed\u8a00\u680f *\/\n  .lang-switch {\n    margin-bottom: 40px;\n    padding: 12px 16px;\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: center;\n    gap: 6px;\n    font-size: 0; \/* \u5254\u9664 | \u7b26\u53f7 *\/\n  }\n\n  .lang-switch span {\n    font-size: 12px;\n    font-weight: 600;\n    color: var(--vp-text-sub);\n    margin-right: 6px;\n  }\n\n  .lang-switch a {\n    font-size: 12px;\n    color: var(--vp-text-sub);\n    text-decoration: none;\n    padding: 4px 10px;\n    border-radius: 6px;\n    background: #f1f5f9;\n    transition: all 0.2s ease;\n  }\n\n  .lang-switch a:hover {\n    color: #ffffff;\n    background: var(--vp-brand);\n  }\n\n  \/* \u79fb\u52a8\u7aef\u9002\u914d *\/\n  @media (max-width: 640px) {\n    .track-form {\n      flex-direction: column;\n    }\n\n    .track-button {\n      width: 100%;\n    }\n\n    .track-list li {\n      display: flex;\n      flex-direction: column;\n      align-items: flex-start;\n      gap: 4px;\n      padding: 12px 16px;\n    }\n  }\n<\/style>\n\n<div>\n\n    <div class=\"track-main\">\n        <h6 class=\"track-title\">Logistics tracking number: <\/h6>\n        <div class=\"track-form\">\n            <input id=\"inputNo\" class=\"track-input\" placeholder=\"Please fill in Logistics tracking number\" type=\"text\" \/>\n            <span id=\"checkButton\" class=\"track-button\">Track<\/span>\n        <\/div>\n    <\/div>\n\n    <div id=\"trackingResults\" class=\"track-result\">\n    <\/div>\n    \n    \n    <div class=\"lang-switch\">\n        <span>Language: <\/span>\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('english');\">English<\/a> |\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('deutsch');\">Deutsch<\/a> |\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('french');\">Fran\u00e7ais<\/a> |\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('spanish');\">Espa\u00f1ol<\/a> |\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('italian');\">Italiano<\/a> |\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('swedish');\">Svenska<\/a> |\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('dutch');\">Nederlands<\/a> |\n        <a class=\"ignore\" href=\"javascript:translate.changeLanguage('chinese_simplified');\">\u7b80\u4f53\u4e2d\u6587<\/a>\n    <\/div>\n\n<\/div>\n<script>\n\/**\n * Logistics Tracking Pro\n * Google GTX + MyMemory Translation\n * Auto Language Detection\n *\/\n\n\n\/\/ ==============================\n\/\/ \u5168\u5c40\u53d8\u91cf\n\/\/ ==============================\n\nwindow.rawTrackingData = [];\n\n\n\/\/ ==============================\n\/\/ \u8bed\u8a00\u5904\u7406\n\/\/ ==============================\n\nfunction normalizeLangCode(lang) {\n    if (!lang) return 'en';\n\n    if (lang === 'zh-Hans') return 'zh-CN';\n    if (lang === 'zh-Hant') return 'zh-TW';\n\n    return lang;\n}\n\n\nfunction getRandomEmail() {\n    const rand = Math.random().toString(36).substring(2, 10);\n    return `user_${rand}@gmail.com`;\n}\n\n\n\n\/\/ \u81ea\u52a8\u83b7\u53d6\u8bed\u8a00\nfunction getInitialLang() {\n\n    const saved = localStorage.getItem('SelectedLanguage');\n\n    if (saved) {\n        return saved;\n    }\n\n\n    const htmlLang = document.documentElement.lang?.toLowerCase();\n\n\n    if (htmlLang?.startsWith('zh')) {\n        return 'zh-Hans';\n    }\n\n\n    if (htmlLang?.startsWith('en')) {\n        return 'en';\n    }\n\n\n    return htmlLang?.split('-')[0] || 'en';\n}\n\n\nwindow.currentLanguage = getInitialLang();\n\n\n\n\n\/\/ ==============================\n\/\/ \u5207\u6362\u8bed\u8a00\n\/\/ ==============================\n\nwindow.translate = {\n\n    changeLanguage:function(language){\n\n\n        const languageMap = {\n\n            chinese_simplified:'zh-Hans',\n\n            english:'en',\n\n            deutsch:'de',\n\n            french:'fr',\n\n            spanish:'es',\n\n            japanese:'ja',\n\n            polish:'pl',\n\n            italian:'it',\n\n            swedish:'sv',\n\n            dutch:'nl'\n        };\n\n\n        window.currentLanguage =\n            languageMap[language] || 'en';\n\n\n\n        localStorage.setItem(\n            'SelectedLanguage',\n            window.currentLanguage\n        );\n\n\n\n        \/\/ \u6709\u6570\u636e\u91cd\u65b0\u7ffb\u8bd1\n        if(window.rawTrackingData.length){\n\n            renderAndTranslate(\n                window.rawTrackingData\n            );\n\n        }\n\n    }\n\n};\n\n\n\n\n\/\/ ==============================\n\/\/ Google Translate\n\/\/ ==============================\n\nasync function translateWithGoogleBrowser(text,targetLang){\n\n\n    const lang = normalizeLangCode(targetLang);\n\n\n    const url =\n    `https:\/\/translate.googleapis.com\/translate_a\/single?client=gtx&dt=t&sl=auto&tl=${lang}&q=${encodeURIComponent(text)}`;\n\n\n\n    const response = await fetch(url);\n\n\n    if(!response.ok){\n\n        throw new Error(\n            \"Google translate failed\"\n        );\n\n    }\n\n\n\n    const data = await response.json();\n\n\n\n    if(Array.isArray(data) && Array.isArray(data[0])){\n\n\n        return data[0]\n            .map(item=>item[0] || '')\n            .join('');\n\n    }\n\n\n    throw new Error(\n        \"Invalid Google response\"\n    );\n\n}\n\n\n\n\/\/ ==============================\n\/\/ MyMemory\u5907\u7528\n\/\/ ==============================\n\nasync function translateWithMyMemoryBrowser(text, targetLang, sourceLang = 'zh-CN') {\n    const target = normalizeLangCode(targetLang);\n    const source = normalizeLangCode(sourceLang);\n    const email = getRandomEmail();\n\n    \/\/ \u5c06 auto \u6539\u4e3a\u5177\u4f53\u7684\u8bed\u8a00\u4ee3\u7801\uff08\u5982 zh-CN\uff09\n    const url = `https:\/\/api.mymemory.translated.net\/get?q=${encodeURIComponent(text)}&langpair=${source}|${target}&de=${email}`;\n\n    const response = await fetch(url);\n    const data = await response.json();\n\n    if (data.responseData && data.responseStatus === 200) {\n        return data.responseData.translatedText;\n    }\n\n    throw new Error(data.responseDetails || \"MyMemory failed\");\n}\n\nfunction addUrlParam(key, value) {\n    const url = new URL(window.location.href);\n    url.searchParams.set(key, value);\n    return url.pathname + url.search;\n}\n\n\n\/\/ ==============================\n\/\/ \u7ffb\u8bd1\u5165\u53e3\n\/\/ ==============================\n\nasync function translateTexts(texts) {\n    if (!texts || !texts.length) {\n        return texts;\n    }\n\n    \/\/ \u4e2d\u6587\u76f4\u63a5\u8fd4\u56de\n    if (window.currentLanguage === 'zh-Hans') {\n        return texts;\n    }\n\n    \/\/ \u4f7f\u7528 Promise.all\u5e76\u884c\u7ffb\u8bd1\u6bcf\u4e00\u9879\uff0c\u786e\u4fdd\u7ed3\u6784\u548c\u987a\u5e8f 100% \u5bf9\u5e94\n    const translationPromises = texts.map(async (text) => {\n        if (!text || !text.trim()) return text; \/\/ \u7a7a\u6587\u672c\u4e0d\u7ffb\u8bd1\n\n        try {\n            \/\/ \u4f18\u5148\u4f7f\u7528 Google \u7ffb\u8bd1\u5355\u6761\u6587\u672c\n            return await translateWithGoogleBrowser(text, window.currentLanguage);\n        } catch (e) {\n            console.warn(\"Google failed for item, trying MyMemory\", text);\n            try {\n                return await translateWithMyMemoryBrowser(text, window.currentLanguage);\n            } catch (err) {\n                console.error(\"Both translation APIs failed for:\", text, err);\n                return text; \/\/ \u5931\u8d25\u5219\u8fd4\u56de\u539f\u6587\n            }\n        }\n    });\n\n    try {\n        return await Promise.all(translationPromises);\n    } catch (err) {\n        console.error(\"Batch translation error:\", err);\n        return texts;\n    }\n}\n\n\n\n\/\/ ==============================\n\/\/ \u6e32\u67d3\n\/\/ ==============================\n\nasync function renderAndTranslate(list){\n\n\n    const box =\n        jQuery('#trackingResults');\n\n\n\n    let html =\n    `<ul class=\"track-list\">`;\n\n\n\n    list.forEach(function(item,index){\n\n\n        html += `\n\n        <li id=\"track-item-${index}\">\n\n            <span class=\"time\">\n                ${item.time || ''}\n            <\/span>\n\n\n            <span \n            class=\"location\"\n            id=\"location-${index}\">\n            ${window.currentLanguage==='zh-Hans'?'':'Translating...'}\n            <\/span>\n\n\n            <span \n            class=\"detail\"\n            id=\"detail-${index}\">\n            ${window.currentLanguage==='zh-Hans'?'':'Translating...'}\n            <\/span>\n\n\n        <\/li>\n\n        `;\n\n    });\n\n\n\n    html += '<\/ul>';\n\n\n\n    box.html(html);\n\n\n\n    const texts =\n        list.flatMap(item=>[\n            item.location || '',\n            item.detail || ''\n        ]);\n\n\n\n    const translated =\n        await translateTexts(texts);\n\n\n\n    list.forEach(function(item,index){\n\n\n        const loc=index*2;\n\n        const detail=index*2+1;\n\n\n\n        jQuery(\n            '#location-'+index\n        )\n        .text(\n            translated[loc]\n        );\n\n\n\n        jQuery(\n            '#detail-'+index\n        )\n        .html(\n            addLinks(\n                translated[detail]\n            )\n        );\n\n    });\n\n\n}\n\n\n\n\/\/ ==============================\n\/\/ \u67e5\u8be2\u7269\u6d41\n\/\/ ==============================\n\nfunction performTrackingQuery(no){\n\n\n    if(!no)return;\n\n\n\n    const box =\n        jQuery('#trackingResults');\n\n\n\n    box.html(`\n        <p>\n        Checking. Please wait....\n        <\/p>\n    `);\n\n\n\n    jQuery.ajax({\n\n\n        url:\n        '\/wp-json\/api\/v1\/tracking\/'+no,\n\n\n        method:'GET',\n\n\n\n        success:function(response){\n\n\n\n            try{\n\n\n                const list =\n                typeof response==='string'\n                ?\n                JSON.parse(response)\n                :\n                response;\n\n\n\n                window.rawTrackingData=list;\n\n\n\n                if(!list || !list.length){\n\n\n                    box.html(\n                    '<p>No records found.<\/p>'\n                    );\n\n\n                    return;\n\n                }\n\n\n\n                renderAndTranslate(list);\n\n\n\n            }catch(e){\n\n\n                console.error(e);\n\n\n                box.html(\n                '<p>Data format error.<\/p>'\n                );\n\n\n            }\n\n\n\n        },\n\n\n\n        error:function(){\n\n\n            box.html(\n            '<p>Network Error.<\/p>'\n            );\n\n\n        }\n\n\n    });\n\n\n}\n\n\n\n\n\/\/ ==============================\n\/\/ URL\u94fe\u63a5\u5904\u7406\n\/\/ ==============================\n\nfunction addLinks(text){\n\n\n    if(!text)return '';\n\n\n\n    const regex =\n    \/(https?:\\\/\\\/[^\\s]+)\/g;\n\n\n\n    return text.replace(\n        regex,\n        function(match){\n\n            return `\n            <a \n            style=\"color:#17EF97\"\n            href=\"${match}\"\n            target=\"_blank\">\n            ${match}\n            <\/a>`;\n\n        }\n    );\n\n}\n\n\n\n\n\/\/ ==============================\n\/\/ \u9875\u9762\u521d\u59cb\u5316\n\/\/ ==============================\n\njQuery(document).ready(function($){\n\n\n\n    $('#checkButton').on(\n        'click',\n        function(){\n\n\n            const no =\n            $('#inputNo').val().trim();\n\n\n\n            if(no){\n\n\n                history.pushState(\n                    {},\n                    '',\n                    addUrlParam(\n                        'no',\n                        no\n                    )\n                );\n\n\n                performTrackingQuery(no);\n\n\n            }else{\n\n\n                alert(\n                'Please enter the tracking number!'\n                );\n\n\n            }\n\n\n        }\n    );\n\n\n\n    $('#inputNo').on(\n        'keypress',\n        function(e){\n\n\n            if(e.which===13){\n\n                $('#checkButton').click();\n\n            }\n\n\n        }\n    );\n\n\n\n    const no =\n    new URLSearchParams(\n        window.location.search\n    )\n    .get('no');\n\n\n\n    if(no){\n\n        $('#inputNo').val(no);\n\n        performTrackingQuery(no);\n\n    }\n\n\n});\n    \n    \n    \n<\/script>\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Logistics tracking number: Track Language: English | Deutsch | Fran\u00e7ais | Espa\u00f1ol | Italiano | Svenska | Nederlands | \u7b80\u4f53\u4e2d\u6587<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-9849","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/24hvape.com\/wp-json\/wp\/v2\/pages\/9849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/24hvape.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/24hvape.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/24hvape.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/24hvape.com\/wp-json\/wp\/v2\/comments?post=9849"}],"version-history":[{"count":0,"href":"https:\/\/24hvape.com\/wp-json\/wp\/v2\/pages\/9849\/revisions"}],"wp:attachment":[{"href":"https:\/\/24hvape.com\/wp-json\/wp\/v2\/media?parent=9849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}