1. Add Shortcode template

Add friends-link.html in layouts/shortcodes/

<div class="friends-container">
    {{ $lang := .Site.Language.Lang }}
    {{ $links := index site.Data (printf "links.%s" $lang) }}
    {{ range $links }}
        {{ if .title }}
            <h4>{{ .title }}</h4>
        {{ else }}
            <a class="friendurl" target="_blank" href="{{ .link }}" title="{{ .description }}">
                <div class="frienddiv">
                    <div class="frienddivleft">
                        <img class="myfriend" src="{{ .avatar }}" alt="{{ .name }}" />
                    </div>
                    <div class="frienddivright">
                        <div class="friendname">{{ .name }}</div>
                        <div class="friendinfo">{{ .description }}</div>
                    </div>
                </div>
            </a>
        {{ end }}
    {{ end }}
</div>

2. Creating Multilingual Data Files

Add two files to the data/ directory

data/
├── links.zh.yaml
└── links.en.yaml

Take links.zh.yaml as an example:

# - title: xxx You can set the category title for the link list

- title: 朋友们 1

- name: 三水水水碎碎念
  link: https://sanshui756.github.io
  description: Share life, bit by bit
  avatar: https://gdhblog.com/blog-imgs/friends-links/sanshui756.github.io.jpg

- name: LI SIR
  link: https://lisir.me
  description: 你的时间花在哪里,你的收获就在哪里
  avatar: https://gdhblog.com/blog-imgs/friends-links/lisir.me.png

- title: 朋友们 2

- name: 黄金屋导航
  link: https://www.hjw.zone
  description: 航爷出品
  avatar: https://gdhblog.com/blog-imgs/friends-links/hjw.zone.png

3. Adding page content

Under content add two page files

content/
├── friends-links.zh.md
└── friends-links.en.md

Take friends-links.zh.md as an example:

---
title: "友情链接"
draft: false
ShowReadingTime: false
showToc: false
TocOpen: false
showDocInfo: false
enableDonate: false
---

# Here you can use Markdown to write content...
# Remove the $ sign
{${< friends-link >}$} 

4. Add CSS style

Add friends-links.css in assets/css/extended

.friendurl {
    text-decoration: none !important;
    color: var(--primary) !important;
    box-shadow: none !important;
}

.myfriend {
    width: 56px !important;
    height: 56px !important;
    border-radius: 50% !important;
    padding: 2px;
    margin-top: 20px !important;
    margin-left: 14px !important;
    background-color: #fff;
}

.frienddiv {
    overflow: auto;
    height: 100px;
    width: 49%;
    display: inline-block !important;
    border-radius: 5px;
    background: none;

    -webkit-transition: box-shadow 0.4s ease, transform 0.4s ease;
    -moz-transition: box-shadow 0.4s ease, transform 0.4s ease;
    -o-transition: box-shadow 0.4s ease, transform 0.4s ease;

    transition: box-shadow 0.4s ease, transform 0.4s ease;
}

.frienddiv:hover {
    background: var(--code-bg);
    transition: box-shadow 1s ease, transform 1s ease;
}

.dark .frienddiv:hover {
    background: var(--code-bg);
    transition: box-shadow 1s ease, transform 1s ease;
}

.frienddiv:hover .frienddivleft img {
    transition: 0.9s !important;
    transform: rotate(360deg) !important;
}

.frienddivleft {
    width: 92px;
    float: left;
    margin-right: -5px;
}

.frienddivright {
    margin-top: 18px;
    margin-right: 18px;
}

.friendname {
    text-overflow: ellipsis;
    font-size: 100%;
    margin-bottom: 5px;
    color: var(--primary);
}

.friendinfo {
    text-overflow: ellipsis;
    font-size: 70%;
    color: var(--primary);
}

@media screen and (max-width: 600px) {
    .friendinfo {
        display: none;
    }

    .frienddivleft {
        width: 84px;
        margin: auto;
    }

    .frienddivright {
        height: 100%;
        margin: auto;
        display: flex;
        align-items: center;
        justify-content: center;
    }

    .friendname {
        font-size: 18px;
    }
}

.site-friend-link-image {
    border-radius: 50% !important;
}

.site-friend:hover img {
    transition: 0.9s !important;
    transform: rotate(360deg) !important;
}

5. Launch and verify

hugo server

friends links imgs