Skip to content

Commit

Permalink
refactor to make localization an own annotation
Browse files Browse the repository at this point in the history
  • Loading branch information
infeo committed Jul 11, 2024
1 parent aad9c04 commit 750bb02
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package org.cryptomator.integrations.common;

import org.jetbrains.annotations.ApiStatus;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.jetbrains.annotations.ApiStatus;

/**
* A humanreadable name of the annotated class.
*/
Expand All @@ -17,5 +17,4 @@
@ApiStatus.Experimental
public @interface DisplayName {
String value();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.cryptomator.integrations.common;

import org.jetbrains.annotations.ApiStatus;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* A humanreadable, localized name of the annotated class.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@ApiStatus.Experimental
public @interface LocalizedDisplayName {

/**
* Name of the localization bundle, where the display name is loaded from.
*
* @return Name of the localization bundle
*/
String bundle();

/**
* The localization key containing the display name.
*
* @return Localization key to use
*/
String key();

}
Original file line number Diff line number Diff line change
@@ -1,24 +1,32 @@
package org.cryptomator.integrations.common;

import java.util.ResourceBundle;

/**
* A service provider with a specific, human-readable name.
*
* A service provider with a human-readable, possibly localized name.
*/
public interface NamedServiceProvider {

/**
* Get the name of this service provider.
* @implNote The default implementation looks for the {@link DisplayName} annotation and uses its value. If the annotation is not present, it falls back to the qualified class name.
* @return The name of the service provider
*
* @see DisplayName
*/
default public String getName() {
var displayName = this.getClass().getAnnotation(DisplayName.class);
if(displayName != null) {
return displayName.value();
} else {
return this.getClass().getName();
}
}

/**
* Get the name of this service provider.
*
* @return The name of the service provider
* @implNote The default implementation looks first for a {@link LocalizedDisplayName} and loads the name from the specified resource bundle/key. If the annotation is not present, the code looks for {@link DisplayName} and uses its value. If none of the former annotations are present, it falls back to the qualified class name.
* @see DisplayName
* @see LocalizedDisplayName
*/
default String getName() {
var localizedDisplayName = this.getClass().getAnnotation(LocalizedDisplayName.class);
if (localizedDisplayName != null) {
return ResourceBundle.getBundle(localizedDisplayName.bundle()) //
.getString(localizedDisplayName.key());
}

var displayName = this.getClass().getAnnotation(DisplayName.class);
if (displayName != null) {
return displayName.value();
} else {
return this.getClass().getName();
}
}
}

0 comments on commit 750bb02

Please sign in to comment.