테마 및 테마 컴포넌트에 로컬라이즈 가능한 문자열 추가

Discourse 테마 또는 테마 컴포넌트에 사용자 정의 언어와 번역을 추가하려는 경우, 이제 UI 컴포넌트에서 사용할 수 있는 로컬라이즈드 문자열을 포함할 수 있습니다. 번역은 코어/플러그인 번역과 동일한 형식으로 저장되며, 거의 동일한 방식으로 사용할 수 있습니다.

테마는 /locales/{locale}.yml과 같은 형식으로 번역 파일을 제공할 수 있습니다. 이러한 파일은 정의되는 로케일과 동일한 단일 최상위 키를 가진 유효한 YAML이어야 합니다. discourse_theme CLI, .tar.gz 가져오기, GIT 저장소에서 설치하거나 theme-creator.discourse.org의 편집기를 통해 정의할 수 있습니다.

로케일 파일의 예시는 다음과 같습니다.

en:
  theme_metadata:
    description: "This is a description for my theme"
    settings:
      theme_setting_name: "This is a description for the setting `theme_setting_name`"
      another_theme_setting_name:
        description: "This is a description for the setting `another_theme_setting_name`"
  sidebar:
    welcome: "Welcome"
    back: "back,"
    welcome_subhead: "We're glad you're here!"
    likes_header: "Share the Love"
    badges_header: "Your Top Badges"
    full_profile: "View your full profile"

관리자는 /admin/customize/themes 사용자 인터페이스에서 테마별로 개별 키를 오버라이드할 수 있습니다. 폴백은 코어와 동일한 방식으로 처리되므로, 영어 이외의 언어에 불완전한 번역이 있어도 영어 키가 사용됩니다.

관리자는 또한 Appearance → Site texts에서 이러한 번역을 관리할 수 있습니다. 테마 또는 컴포넌트를 선택하여 해당 로케일 파일 문자열을 검색하고, 선택된 언어로 번역을 편집하거나, 오버라이드를 로케일 파일 기본값으로 되돌릴 수 있습니다. 선택 항목은 /admin/customize/site_texts?theme_id=THEME_ID를 사용하여 링크할 수 있습니다. Site texts는 이러한 항목을 js.theme_translations.THEME_ID.KEY로 식별하며, 편집은 테마 편집기와 동일한 테마 번역 오버라이드를 사용합니다.

백그라운드에서 이러한 번역은 코어 번역과 함께 테마별 네임스페이스 아래에 저장됩니다. 예를 들어:

theme_translation.{theme_id}.sidebar.welcome

테마 코드에서 theme_id를 하드코딩해서는 안 됩니다. 번역 키를 동적으로 구성하려면 themePrefix 헬퍼를 사용하세요:

import { i18n } from "discourse-i18n";
import { themePrefix } from "virtual:theme";

// In JS code:
const result = i18n(themePrefix("my_translation_key"));
console.log("From Javascript", result);

// In a template tag:
<template>{{i18n (themePrefix "blah")}}</template>

테마에서 번역을 사용하는 완전한 예시는 @awesomerobot의 Fakebook 테마를 확인하세요: GitHub - discourse/Fakebook · GitHub


이 문서는 버전 관리됩니다 - 변경 사항을 github에서 제안하세요.

32개의 좋아요

CSS에서 테마 번역을 사용하는 방법은 무엇인가요? 테마 매개변수는 사용할 수 있다는 것을 알고 있지만, 테마 번역이 필요합니다.

그렇게 할 수 없어요. 해당 기능은 템플릿과 JavaScript에서만 사용할 수 있습니다. 이는 코어/플러그인 번역과 동일한 원리입니다.

이상적으로는 문자열이 템플릿에서 설정되도록 리팩토링하는 것이 좋습니다. 하지만 CSS 파일에서 사용자 정의 가능한 문자열이 정말 필요하다면 테마 설정을 사용할 수 있습니다: Developing Discourse Themes & Theme Components

1개의 좋아요

그리고 테마 설정을 사용하는 경우, 번역이 가능한가요?

아니요, 여러 언어로 번역하는 것은 아니지만, 관리자가 자신의 사이트에 맞게 사용자 정의할 수 있도록 해 줄 것입니다.

2개의 좋아요

안녕하세요, 여러분.
저는 템플릿 upload-selector.hbs를 재정의하고 있습니다.
번역 가능한 문구를 추가하려고 합니다.
새로운 변수 upload_selector.upload_images를 생성했습니다.
예를 들어

다음으로 무엇을 해야 하는지 알려 주실 수 있을까요?

안녕하세요,

discourse 테마 제작자(여기)에서 이 기법을 사용해 보니 이 게시물에 설명된 대로 모든 것이 정상적으로 작동합니다.

그러나 동일한 테마를 제 서버에 가져오면 "[en.theme_translations.12.blog]"만 표시됩니다. 또한 테마 설정 페이지에도 테마 제작자와 달리 “테마 번역” 섹션이 없습니다.

이 오류를 어디서 찾아야 할지 정말 모르겠습니다. 혹시 힌트를 주실 수 있는 분이 계신가요?

[편집]
저는 docker 환경에서 discourse 2.6.7([f73cdbbd2f])을 사용하고 있습니다.

discourse를 업데이트할 수 있나요?

구버전을 사용하고 있습니다.

네, 저도 시도하고 있습니다. 이건 제가 도움이 필요한 또 다른 부분이지만, 여기에 게시하고 싶지 않아요. 이건 다른 주제니까요.

어쨌든 번역 기능은 2.2.0.beta9 버전부터 포함되었으므로 문제가 되지 않을 것이라 생각했습니다. 커밋을 참고해 주세요.

안녕하세요, 초보자의 질문을 해서 미리 죄송합니다.
HTML과 CSS만으로 헤더를 만들었습니다.

        <div class="top-navbar">
         <span class="j_menu_item" ><a href="https://www.example.com/download">Download</a></span>     
        </div>

그리고 "Download"라는 단어를 번역하려고 합니다.
영어 번역 파일을 만들었습니다.

en: 
  top-navbar: 
    download: "Yeah"

그 다음 페이스북 예시처럼 HTML 코드를 변경했습니다.


    <script type="text/x-handlebars" data-template-name="/connectors/discovery-below/sidebar">
        <div class="top-navbar">
         <span class="j_menu_item" ><a href="https://www.example.com/download">{{i18n (theme-prefix "top-navbar.download")}}</a></span>     
        </div>
    </script>

이렇게 하면 "Yeah"로 번역되고 출력되지만 레이아웃이 깨집니다. 아마도 "/connectors/discovery-below/sidebar"를 사용하고 있기 때문인 것 같습니다. 저는 템플릿을 건드리지 않고 번역만 적용하고 싶은데, 인라인으로 번역을 적용하는 방법을 이해하지 못하겠습니다.

테마의 사용자 정의 HTML에서 번역을 사용하는 간단한 예를 제공해 주시겠어요?

감사합니다!

안녕하세요,

문제는 data-template-name이 고유한 이름이어야 한다는 점입니다. Developing Discourse Themes & Theme Components. 다음과 같이 사용해야 합니다: data-template-name="/connectors/PLUGIN-OUTLET-NAME/UNIQUE-NAME" 현재 예시에서는 sidebar 이름을 사용하고 있는데, 이는 Fakebook 사이드바 템플릿을 오버라이드하는 것으로 보입니다.

예를 들어 이렇게 하면 작동할 것입니다 :slightly_smiling_face:

<script type="text/x-handlebars" data-template-name="/connectors/discovery-below/downloadlink">
  <div class="top-navbar">
    <span class="j_menu_item" ><a href="https://www.example.com/download">{{i18n (theme-prefix "top-navbar.download")}}</a></span>     
  </div>
</script>
2개의 좋아요

@Don 감사합니다.

그 플러그인이 설치되어 있지 않다는 점, 그리고 data-template-name을 무작위로 생성된 고유한 UNIQUE-NAME으로 변경해 보았지만 결과가 동일하거나, PLUGIN-OUTLET-NAME을 임의로 지어 넣으면 배너가 아예 표시되지 않는다는 점을 언급하지 못했습니다.

지금쯤 아시겠지만, 저는 handlebars/ember에 전혀 익숙하지 않습니다. :slight_smile:

제 이해를 따르면, HTML 내에서 미리 지정된 위치를 가진 템플릿을 커스터마이징하고 있는데, 그 결과 커스텀 HTML이 더 이상 /html/body/section main 아래에 있지 않고 훨씬 깊은 곳에 위치하게 되어 이전에 없던 CSS 상속 문제가 발생하고 있습니다.

번역을 사용하려고 하는데 왜 템플릿을 커스터마이징해야 하는지 이해하기 어렵습니다.
Ember inspector를 사용하여 여기에서 조언받은 대로 커스터마이징할 템플릿을 식별하는 데는 성공했습니다.

그리고 plugin-outlet에 대한 답변과 링크 덕분에 data-template-name="/connectors/above-site-header/my-navbar"라는 올바른 값을 찾았습니다.

다시 한번 도움 주셔서 감사합니다.

1개의 좋아요

아, 그렇군요… Fakebook 테마를 사용 중이라고 생각하고, 사이드바 섹션 아래에 코드를 배치하려는 거라고 생각했어요. :slightly_smiling_face:

플러그인 아웃렛의 위치를 시각적으로 확인하는 좋은 방법은 Plugin Outlet Locations 테마 컴포넌트를 사용하는 것입니다.

2개의 좋아요

안녕하세요 @Don,

저는 다음 이유 때문에 그 facebook 예시를 사용했습니다:

다시 한번 감사합니다!

단수와 복수는 어떻게 처리하나요? {{theme-i18n}}을 사용하여 단수형과 복수형이 다른 텍스트를 번역하는 방법은 무엇인가요? 예를 들어 "Result"와 “Results” 같은 경우 말입니다.

2개의 좋아요

Discourse 소스에서 이렇게 처리하는 예시가 몇 가지 있습니다. 보통 두 개의 문자열을 가지고 정수 값에 따라 전환하는 방식으로 구현합니다.

Screenshot 2022-12-15 at 5.42.58 PM

테마에서도 이 방식이 작동해야 하며, 일반적으로 JS 코드는 다음과 같은 형태가 됩니다:

I18n.t(themePrefix("confirm_remove_tags"), {
  count: exampleCountValue,
});
1개의 좋아요

그렇다면 hbs는 어떻게 되나요? hbs 템플릿으로 구현할 수 있을까요?

1개의 좋아요

네, 가능합니다:

{{theme-i18n "confirm_remove_tags" count=this.exampleCountValue}}
4개의 좋아요

테마(Theme)의 .gjs 컴포넌트 템플릿에서 이렇게 하면 다음 오류가 발생합니다:

Error: Attempted to resolve a helper in a strict mode template, but that value was not in scope: theme-prefix

그래서 이를 import하려고 합니다:

import themePrefix from "discourse/helpers/theme-prefix";

하지만 다음과 같은 오류가 나요:

Identifier 'themePrefix' has already been declared

(허브(hub)에서 예제를 찾아봤는데, 그런 예제가 있는 것 같지 않아요)

1개의 좋아요

업데이트: {{i18n (themePrefix "을(를) 사용해야 합니다

4개의 좋아요