Skip to content

Commit

Permalink
Change the translated [KO] docs to be clearer. (#3530)
Browse files Browse the repository at this point in the history
  • Loading branch information
MinByeongDon authored May 8, 2024
1 parent 02b86a2 commit d0fb9be
Show file tree
Hide file tree
Showing 31 changed files with 143 additions and 385 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ import selectAsync from "/docs/advanced/select/select_async";
다른 provider를 수신하는 provider를 최적화하려는 경우 다른 provider가 비동기식일 가능성이 있습니다.

일반적으로는 `ref.watch(anotherProvider.future)`를 사용해 값을 가져옵니다.
문제는 `select``AsyncValue`에 적용된다는 것인데, 이는 기다릴 수 있는(await) 상황이 아닙니다.
이슈는 `select`가 기다릴수(await) 없는 `AsyncValue`에 적용된다는 것입니다.

이를 위해 `selectAsync`를 대신 사용할 수 있습니다.
이 함수는 비동기 코드에 고유하며, 공급자가 방출한 데이터에 대해 `select` 연산을 수행할 수 있게 해줍니다.
이 함수는 비동기 코드에 고유하며, provider가 내보낸 데이터에 대해 `select` 연산을 수행할 수 있습니다.
사용법은 `select`와 비슷하지만 대신 `Future`를 반환합니다:

<AutoSnippet
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ version: 1

import { Link } from "/src/components/Link";
import { AutoSnippet, When } from "/src/components/CodeSnippet";
import homeScreen from "!raw-loader!./cancel/home_screen.dart";
import extension from "!raw-loader!./cancel/extension.dart";
import homeScreen from "!raw-loader!/docs/case_studies/cancel/home_screen.dart";
import extension from "!raw-loader!/docs/case_studies/cancel/extension.dart";
import detailScreen from "/docs/case_studies/cancel/detail_screen";
import detailScreenCancel from "/docs/case_studies/cancel/detail_screen_cancel";
import detailScreenDebounce from "/docs/case_studies/cancel/detail_screen_debounce";
Expand Down Expand Up @@ -46,7 +46,7 @@ Riverpod에서는 이 두 가지 기술을 비슷한 방식으로 구현할 수

<img
src="/img/case_studies/cancel/app.gif"
alt="Gif showcasing the application, opening the detail page and refreshing the activity."
alt="Gif는 어플리케이션을 보여주고, 상세 페이지를 열고, 액티비티를 새로 고침합니다."
/>

먼저, 디바운스나 취소 없이 애플리케이션을 만들어 봅시다.
Expand Down Expand Up @@ -75,7 +75,7 @@ Riverpod에서는 이 두 가지 기술을 비슷한 방식으로 구현할 수
이제 애플리케이션이 작동하므로 취소(cancellation) 로직을 구현해 보겠습니다.

이를 위해 사용자가 페이지에서 다른 곳으로 이동할 때 `ref.onDispose`를 사용하여 요청을 취소할 것입니다.
이 기능이 작동하려면 provider의 자동 폐기(automatic disposal)가 활성화되어 있어야 합니다.
이 기능이 작동하려면 providers의 자동 폐기(automatic disposal)가 활성화되어 있어야 합니다.

요청을 취소하는 데 필요한 정확한 코드는 HTTP 클라이언트에 따라 다릅니다.
이 예에서는 `package:http`를 사용하지만 다른 클라이언트에도 동일한 원칙이 적용됩니다.
Expand Down Expand Up @@ -112,17 +112,17 @@ Riverpod에서는 이 두 가지 기술을 비슷한 방식으로 구현할 수
그런 다음 사용자가 500ms가 경과하기 전에 활동을 다시 새로고침하면 `onDispose`가 호출되어 요청이 중단됩니다.

:::info
요청을 중단하려면 자발적으로 던지는(throw) 것이 일반적입니다.
provider가 폐기된(disposed) 후에는 공급자 내부에 던지는(throw) 것이 안전합니다.
요청을 중단하려면, 자발적(voluntarily)으로 던지는(throw) 것이 일반적입니다.
provider가 폐기된(disposed) 후에는 providers 내부에 던져도(throw) 안전합니다.
예외는 당연히 Riverpod에 의해 잡히고 무시됩니다.
:::

<AutoSnippet
{...detailScreenDebounce}
translations={{
didDispose: " // 공급자가 현재 폐기되었는지 여부를 캡처합니다.",
didDispose: " // provider가 현재 폐기되었는지 여부를 캡처합니다.",
delayed: " // 사용자가 새로 고침을 중단할 때까지 요청을 500밀리초 지연합니다.",
cancelled: " // 지연 중에 공급자가 처리되었다면 사용자가 다시 새로고침했다는 의미입니다. \n // 예외를 던져 요청을 취소합니다.\n // 리버포드에 의해 포착되므로 예외를 사용하는 것이 안전합니다.",
cancelled: " // 지연 중에 provider가 dispose되었다면, 사용자가 다시 새로고침했다는 의미입니다. \n // 예외를 던져 요청을 취소합니다.\n // Riverpod에 의해 포착되므로 예외를 사용하는 것이 안전합니다.",
http: " // 다음 코드는 이전 스니펫에서 변경되지 않았습니다.",
}}
/>
Expand All @@ -139,16 +139,16 @@ provider가 폐기된(disposed) 후에는 공급자 내부에 던지는(throw)
<AutoSnippet
raw={extension}
translations={{
note: " /// [duration](기본값은 500ms) 동안 기다린 다음 요청에 사용할 수 있는 [http.Client]를 반환합니다.\n ///\n /// 해당 클라이언트는 공급자가 폐기되면 자동으로 닫힙니다.",
note: " /// [duration](기본값은 500ms) 동안 기다린 다음 요청에 사용할 수 있는 [http.Client]를 반환합니다.\n ///\n /// 해당 클라이언트는 provider가 폐기되면 자동으로 닫힙니다.",
didDispose: " // 먼저 디바운싱을 처리합니다.",
delay: " // 사용자가 새로 고침을 중단할 때까지 요청을 500밀리초 지연합니다.",
cancel: " // 지연 중에 공급자가 처리되었다면 사용자가 다시 새로고침했다는 의미입니다.\n // 예외를 던져 요청을 취소합니다.\n // 리버포드에 의해 포착되므로 예외를 사용하는 것이 안전합니다.",
client: " // 이제 클라이언트를 생성하고 공급자가 폐기되면 닫습니다.",
return: " // 마지막으로 클라이언트를 반환하여 공급자가 요청을 할 수 있도록 합니다.",
cancel: " // 지연 중에 provider가 dispose되었다면, 사용자가 다시 새로고침했다는 의미입니다.\n // 예외를 던져 요청을 취소합니다.\n // Riverpod에 의해 포착되므로 예외를 사용하는 것이 안전합니다.",
client: " // 이제 클라이언트를 생성하고 provider가 폐기되면 닫습니다.",
return: " // 마지막으로 클라이언트를 반환하여 provider가 요청을 할 수 있도록 합니다.",
}}
/>

그런 다음 다음과 같이 공급자에서 이 확장 메서드를 사용할 수 있습니다:
그런 다음 다음과 같이 providers에서 이 확장 메서드를 사용할 수 있습니다:

<AutoSnippet
{...providerWithExtension}
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,13 @@ Freezed/json_serializable을 반드시 사용해야 하는 것은 아니지만

사용자가 화면을 아래로 내리면 `RefreshIndicator``onRefresh` 콜백을 호출합니다.
이 콜백을 사용해 데이터를 새로 고칠 수 있습니다.
여기서 `ref.refresh`를 사용하여 선택한 공급자를 새로 고칠 수 있습니다.
여기서 `ref.refresh`를 사용하여 선택한 provider를 새로 고칠 수 있습니다.

**참고**: `onRefresh``Future`를 반환할 것으로 예상됩니다.
그리고 새로 고침이 완료될 때 그 future가 완료되는 것이 중요합니다.

이러한 future를 얻으려면 공급자의 '.future' 속성을 읽으면 됩니다.
그러면 공급자가 해결(resolved)될 때 완료되는 future가 반환됩니다.
이러한 future를 얻으려면 provider의 '.future' 속성을 읽으면 됩니다.
그러면 provider가 해결(resolved)될 때 완료되는 future가 반환됩니다.

따라서 `RefreshIndicator`를 다음과 같이 업데이트할 수 있습니다:

Expand All @@ -114,7 +114,7 @@ Freezed/json_serializable을 반드시 사용해야 하는 것은 아니지만
- 초기 로드 중에는 전체 화면 스피너를 표시하고 싶습니다.
- 새로 고침 중에는 새로 고침 표시기와 이전 데이터/오류를 표시하고 싶습니다.

다행히도 Riverpod에서 비동기 프로바이더를 수신할 때, Riverpod는 필요한 모든 것을 제공하는 `AsyncValue`를 제공합니다.
다행히도 Riverpod에서 비동기 provider를 수신할 때, Riverpod는 필요한 모든 것을 제공하는 `AsyncValue`를 제공합니다.

`AsyncValue`는 다음과 같이 Dart 3.0의 패턴 일치(pattern matching)와 사용할 수 있습니다:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@ Riverpod의 코드 생성을 사용하려면, <Link documentID="introduction/get
### 자동폐기(autoDispose) 활성화/비활성화:

코드 생성을 사용할때, provider는 기본적으로 autoDispose가 활성화됩니다.
코드 생성을 사용할 때 공급자는 기본적으로 자동 폐기됩니다.
즉, 연결(ref.watch/ref.listen)된 리스너가 없을 때 자동으로 폐기됩니다.
이 기본 설정은 Riverpod의 철학에 더 잘 부합합니다.
코드 생성하지 않는 버전을 사용하면, `package:provider`에서 마이그레이션하는 사용자를 위해 자동폐기(autoDispose) 기능이 기본적으로 꺼져 있었습니다.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,13 @@ Riverpod에는 상태를 파기하는 몇 가지 기본 제공 방법이 있습
{...onDisposeExample}
translations={{
onDispose: " // 상태가 소멸되면 스트림 컨트롤러를 닫습니다.",
todo: "// TO-DO: StreamController에 일부 값을 푸시합니다.",
todo: " // TO-DO: StreamController에 일부 값을 푸시합니다.",
}}
/>

:::caution
`ref.onDispose`의 콜백은 부작용을 유발하지 않아야 합니다.
`onDispose` 내에서 프로바이더를 수정하면 예기치 않은 동작이 발생할 수 있습니다.
`onDispose` 내에서 providers를 수정하면 예기치 않은 동작이 발생할 수 있습니다.
:::

:::info
Expand Down Expand Up @@ -123,7 +123,7 @@ provider의 Disposable 객체당 한 번씩 호출해도 됩니다.
<AutoSnippet
raw={invalidateExample}
translations={{
invalidate: " // 클릭 시 공급자를 파괴(destroy)합니다.",
invalidate: " // 클릭 시 provider를 파괴(destroy)합니다.",
}}
/>

Expand All @@ -139,7 +139,7 @@ provider가 `ref.invalidateSelf`를 사용하여 스스로 무효화할 수 있
<AutoSnippet
{...invalidateFamilyExample}
translations={{
invalidateAll: " // 이 공급자의 가능한 모든 매개변수 조합을 무효화합니다.",
invalidateAll: " // 이 provider의 가능한 모든 매개변수 조합을 무효화합니다.",
invalidate: " // 특정 조합만 무효화",
}}
/>
Expand All @@ -158,7 +158,7 @@ provider가 `ref.invalidateSelf`를 사용하여 스스로 무효화할 수 있
<AutoSnippet
{...keepAlive}
translations={{
keepAlive: " // 요청이 성공적으로 완료된 후에만 공급자를 살아있게 유지합니다.\n // 요청이 실패한 경우(그리고 던져진 경우), 공급자가 수신 중지를 중단하면 상태가 파괴됩니다.",
keepAlive: " // 요청이 성공적으로 완료된 후에만 provider를 살아있게(alive) 유지합니다.\n // 요청이 실패한(그리고 예외를 throw한) 경우, provider의 수신(listen)이 중단되면 상태가 파괴됩니다.",
closeLink: " // `link`를 사용하여 auto-dispose 동작을 복원(restore)할 수 있습니다:",
}}
/>
Expand All @@ -180,10 +180,10 @@ provider가 다시 계산되면 자동 폐기가 다시 활성화됩니다.
<AutoSnippet
raw={cacheForExtension}
translations={{
cacheFor: "/// [duration] 동안 공급자를 살아있게 유지합니다.",
cacheFor: "/// [duration] 동안 provider를 살아있게 유지합니다.",
keepAlive: " // 상태가 파괴되는 것을 즉시 방지합니다.",
timer: " // 기간이 경과하면 자동 폐기를 다시 활성화합니다.",
onDispose: " // 선택 사항: 공급자가 다시 계산될 때(예: ref.watch 사용),\n // 보류 중인 타이머를 취소합니다.",
onDispose: " // 선택 사항: provider가 다시 계산될 때(예: ref.watch 사용),\n // 보류 중인 타이머를 취소합니다.",
}}
/>

Expand All @@ -197,4 +197,4 @@ provider가 다시 계산되면 자동 폐기가 다시 활성화됩니다.
/>

이 로직은 필요에 맞게 조정할 수 있습니다.
예를 들어 `ref.onCancel`/`ref.onResume`을 사용하여 특정 시간 동안 공급자가 수신 대기하지 않은 경우에만 상태를 삭제할 수 있습니다.
예를 들어 `ref.onCancel`/`ref.onResume`을 사용하여 특정 시간 동안 provider가 수신 대기하지 않은 경우에만 상태를 삭제할 수 있습니다.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ import readExample from '/docs/essentials/combining_requests/read_example'
<AutoSnippet
{...functionalRef}
translations={{
provider: " // \"Ref\"를 사용하여 다른 공급자를 읽을 수 있습니다.",
provider: " // \"Ref\"를 사용하여 다른 providers를 읽을 수 있습니다.",
}}
/>

Expand All @@ -51,7 +51,7 @@ import readExample from '/docs/essentials/combining_requests/read_example'
<AutoSnippet
{...notifierRef}
translations={{
watch: " // \"Ref\"를 사용하여 다른 공급자를 읽을 수 있습니다.",
watch: " // \"Ref\"를 사용하여 다른 providers를 읽을 수 있습니다.",
}}
/>

Expand Down Expand Up @@ -79,7 +79,7 @@ import readExample from '/docs/essentials/combining_requests/read_example'
{...watchExample}
translations={{
provider: " // TO-DO: 현재 위치를 가져오는 스트림을 반환합니다.",
watch: " // \"ref.watch\"를 사용하여 최신 위치를 가져옵니다.\n // 공급자 뒤에 \".future\"를 지정하면 코드가 적어도 하나의 위치를 사용할 수 있을 때까지 기다립니다.",
watch: " // \"ref.watch\"를 사용하여 최신 위치를 가져옵니다.\n // provider 뒤에 \".future\"를 지정하면 코드가 적어도 하나의 위치를 사용할 수 있을 때까지 기다립니다.",
get: " // 이제 해당 위치를 기반으로 네트워크 요청을 할 수 있습니다.\n // 예를 들어 Google 지도 API를 사용할 수 있습니다:",
jsonDecode: " // JSON에서 레스토랑 이름 가져오기",
}}
Expand Down Expand Up @@ -141,7 +141,7 @@ provider가 어떻게든 다시 계산되면 이전 리스너가 제거됩니다

마지막으로 사용할 수 있는 옵션은 `ref.read`입니다.
이 옵션은 provider의 현재 상태를 반환한다는 점에서 `ref.watch`와 유사합니다.
하지만 `ref.watch`와 달리 공급자를 수신(listen)하지 않습니다.
하지만 `ref.watch`와 달리 provider를 수신(listen)하지 않습니다.

따라서 `ref.read`는 Notifier의 메서드 내부와 같이 `ref.watch`를 사용할 수 없는 곳에서만 사용해야 합니다.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { AutoSnippet, When } from "/src/components/CodeSnippet";

## AVOID 위젯에서 provider를 초기화하지 마세요

Providers는 스스로 초기화해야 합니다.
providers는 스스로 초기화해야 합니다.
위젯과 같은 외부 요소에 의해 초기화되어서는 안 됩니다.

그렇게 하지 않으면 경합 상태(race conditions) 및 예기치 않은 동작(unexpected behaviors)이 발생할 수 있습니다.
Expand Down Expand Up @@ -81,7 +81,7 @@ provider는 일반적으로 "read" 작업을 나타내는 데 사용해야 합
final submitProvider = FutureProvider((ref) async {
final formState = ref.watch(formState);
// Bad: 공급자는 'write' 작업에 사용해서는 안 됩니다.
// Bad: providers는 'write' 작업에 사용해서는 안 됩니다.
return http.post('https://my-api.com', body: formState.toJson());
});
```
Expand Down Expand Up @@ -121,7 +121,7 @@ class Example extends ConsumerWidget {

## AVOID 동적으로 providers 생성하지 않기

공급자는 최상위 레벨(top-level)의 final 변수만 사용해야 합니다.
providers는 최상위 레벨(top-level)의 final 변수만 사용해야 합니다.

**Do**:

Expand Down
Loading

0 comments on commit d0fb9be

Please sign in to comment.