npm package: @serengeti/serengeti-board
Description: ## npm 설치 > ### Transalate > ``` > npm install @ngx-translate/core --save > npm install ngx-translate-multi-http-loader --save > ``` > ### Material > ``` > ng add @angular/material > ``` >### file-upload >``` >npm install --save file-saver >npm install --
Latest version: 1.0.44

# serengeti.board.ui

## npm 설치
> ### Transalate
> ```
> npm install @ngx-translate/core --save
> npm install ngx-translate-multi-http-loader --save
> ```
> ### Material
> ```
> ng add @angular/material
> ```
>### file-upload
>```
>npm install --save file-saver
>npm install --save ng2-file-upload
<br/>

### CKEditor5
```
// app.module

import { CKEditorModule } from '@ckeditor/ckeditor5-angular';
```

```
// component

import * as ClassicEditor from '@ckeditor/ckeditor5-build-classic';
import { CKEditor5 } from '@ckeditor/ckeditor5-angular'
import { UploadAdapter } from './FileUploadAdapter/FileUploadAdapter';

classicEditor = ClassicEditor;
editorConfig;

constructor() {
  this.editorconfig = {
    // ckeditor 설정
  }
}
```

```
// html

<ckeditor>
  [editor]="classicEditor"
  [config]="editorConfig"
  ...
</ckeditor>
```

<br/>

### Translate
```
// app.module

import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateService } from '@ngx-translate/core';
import { MultiTranslateHttpLoader } from "ngx-translate-multi-http-loader";

// Translate 파일 경로 및 형식 설정
export function createTranslateLoader(http: HttpClient) {
  return new MultiTranslateHttpLoader(http, [
    { prefix: 'assets/i18n/setting/', suffix: ".json" }
  ]);
}

impots: [
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: createTranslateLoader,
        deps: [HttpClient]
      }
    })
],
providers: [TranslateService],
exports: [TranslateModule]

export class AppModule { 
  constructor (translate: TranslateService) {
    translate.setDefaultLang('ko-kr');
    translate.use('ko-kr');
  }
}
```
```
// component

import { TranslateService } from '@ngx-translate/core';

errorMessage;

constructor(private translateService: TranslateService) { }


// alert 또는 confirm에서 Translate 사용하기
submit() {
  this.translateService.get(['board.edit.notice.alert.title', 'board.edit.notice.confirm.write'])
  .subscribe((message: any) => { this.errorMessage = messages; });
  ...
  alert(this.errorMessage['board.edit.notice.alert.title']);
  
  if(confirm(this.errorMessage['board.edit.notice.confirm.write'])) { }
}
```

```
// html

<span translate>board.edit.title.write</span>

or

<span>{{'board.edit.title.write' | translate}}</span>
```

```
// src/assets/i18n/setting/ko-kr.json

{
  "board": {
    "edit": {
      "title": {
        "write": "글 쓰기"
      },
      "notice": {
        "alert": {
          "title": "제목은 필수 입력사항입니다."
        },
        "confirm": {
          "write": "게시글을 저장 하시겠습니까?"
        }
      }
    }
  }
}
```

<br/>

### Validator
```
// app.module

import { FormsModule } from '@angular/forms';

imports: [FormsModule]
```

```
// componenet

import { FormControl, Validators } from '@angular/forms';

title = new FormControl('', [Validators.required]);
errorMessage;

// Translate와 연계
titleErrorMessage() {
  this.translateService.get('board.edit.notice.validator.title')
  .subscribe((messages: any) => {
    this.errorMessage = messages;
  });
  if (this.title.hasError('required')) {
  this.translates
    return this.errorMessage;
  }
}
```

```
// html

<mat-form-field>
  <input matInput [formControl]="title" required>
  <mat-error *ngIf="title.errors">{{titleErrorMessage()}}</mat-error>
</mat-form-field>
```